iso map generator

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iso map generator

    //instance_create(500-64,500-32,obj_land_normal)

    xtile = 500
    ytile = 500

    repeat (5)

    {

    instance_create(xtile,ytile,obj_land_normal);

    xtile -= 64
    ytile -= 32


    }

    //instance_create(500+64,500-32,obj_land_normal)

    xtile = 500 + 64
    ytile = 500-32

    repeat (5)

    {

    instance_create(xtile,ytile,obj_land_normal);

    xtile -= 64
    ytile -= 32


    }

    /////////////////

    xtile = 500 + 64 +64
    ytile = 500-32-32

    repeat (5)

    {

    instance_create(xtile,ytile,obj_land_normal);

    xtile -= 64
    ytile -= 32


    }

    /////////////////

    xtile = 500 + 64 +64 +64
    ytile = 500-32-32-32

    repeat (5)

    {

    instance_create(xtile,ytile,obj_land_normal);

    xtile -= 64
    ytile -= 32


    }

    /////////////////

    xtile = 500 + 64 +64 +64 +64
    ytile = 500-32-32-32-32

    repeat (5)

    {

    instance_create(xtile,ytile,obj_land_normal);

    xtile -= 64
    ytile -= 32


    }

    ////////////////////////////////////////////////////////////////////

    global.level = get_integer("Level to test?", 4);

    //instance_create(500-64,500-32,obj_land_normal)

    global.xtile = 500
    global.ytile = 500

    repeat (global.level)

    {

    instance_create(global.xtile,global.ytile,obj_land_normal);

    global.xtile -= 64
    global.ytile -= 32


    }


    so habe ich das erstmal gelöst... aber bei repeat (5) sollte da eine variable stehen.... das heißt er sollte felder generieren X mal X .... die verschiebung ist 64/32 da es isometrische felder sind.... meine frage ist nun, wie mache ich eine loop, die die reihen zeichnet, möglichst hintereinander weg... also erste reihe, zweite reighe und so weiter...
  • Ich verstehe die Frage nicht, meinst du eine doppelte For Schleife?

    GML-Quellcode

    1. for ( ytile = 0 ... )
    2. {
    3. for(xtile = 0...)
    4. {
    5. //instance_create(xtile,ytile....)
    6. }
    7. }

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Wenn du mir sagen kannst wie du es haben willst , kann ich dir helfen. Soll es so sein wie zb bei SimCity "Die Altenteile" oder wie in "Towns"
    Halt isometrisch das das ganze level wie eine Route aussieht.
    Da ich das schon mal gemacht habe. Nur ist deine Frage oben nicht ganz eindeutig.

    Ps. wenn es 2d ist benutze bitte Isometrische Tilesets statt objekte. Spart performance
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Ja wie towns.... Mit dem was ich habe generieren ich ja schon die erster reihe ,., der Spieler wird zum Anfang gefragt wie gross das Brett sein soll und dann generiert er aus den einzelnen Objekten das Brett das bei muss es Reihe für Reihe gemacht werden. Ich nutze keine tiles, da die Objekte angeklickt werden und geändert werden können somit brauche ich viele objekte,. Schwierig wird es dann nur mit den autos die auf die strassen oder Objekte fahren werden, je nachdem wie der Spieler die Strasse baut...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Leonardo007 ()

  • Ok dann ist es eigentlich recht einfach.
    Als erstes brauchst du einen Fixierten Startpunkt im Raum. Der ist bei Isometrixchen Spielen meist immer Links in der Mitte des Raumes.
    Wir nennen ihn einfach mal
    start_x und start_y
    Der ist ja nun links in der Raum mitten Beispielraum mit 640x320Pixel. Platz für 20x20 isomettrische Flächen a 32*16 Pixel

    GML-Quellcode

    1. start_x=0
    2. start_y=room_height/2

    Beispiel Bild.

    Nun erstellst du deine erste Reihe vom Startpunkt aus nach rechts bis zur mitte hoch. Also die erste x Reiche 0.
    Befor ich es vergesse. Erstelle vor her ein Ds_grid. zb level_grid=ds_grid_create()
    Dort kannst du für später alle werte rein speichern die jedes Feld haben soll. Zb alla Minecraft. feld xy ist Gras oder Stein was auch immer.

    Nun geht es an die Schleife und die erste Reihen.
    Wichtig ist nur das du immer vom start wert aus anfängst dein Level zu bauen und bei jeder Reihe den Start Punkt um eine Reihe nach untne versetzt.
    In meine Beispiel ist ein Feld 32*16 Pixel groß.
    Das heist du verschiebst bvei jeder Reihe einfach den Start Punktdie hälfte dieser Werte um quasi mit Feld 01 "Feld 0(x) Reihe 1(y) zu starten.


    beispiel für 20*20 Felder.
    KLEINE FEHER BERIUCHTIEGUNG: ERST DIE Y SCHLEIFE DANN DIE X SCHLEIFE:

    GML-Quellcode

    1. for (iy=0; iy<19; iy+=1)
    2. {
    3. for (ix=0; ix<19; ix+=1)
    4. {
    5. instance_create(start_x+(ix*16),start_y-(iy*8),feld)
    6. };
    7. start_x+=16
    8. start_y+=8
    9. };
    Alles anzeigen

    Diese schleife sollte mein beispiel Bild generieren.
    Wenn es zufall sein soll must du dann nur noch deine Random abfrage rein bauen. wie zb.


    GML-Quellcode

    1. var r:
    2. r=round(random(10) // Für 10 verschieden möglichekeiten.

    Und dann eine switch anweisung. Also was passerit bei 1 oder 2,3,4,5 usw

    GML-Quellcode

    1. switch (EXPRESSION)
    2. {
    3. case 1: instance_create(start_x+(ix*16),start_y-(iy*8),feld_1); break;
    4. case 2: instance_create(start_x+(ix*16),start_y-(iy*8),feld_2); break;
    5. }


    Schau mal in meinenalten Thread. ist es das was du machen willst ?

    The City

    Zu schluss muss ich noch mals auf Tilesets drauf hinweisen. Fals du mein Thread gesehen haben solltest der über diesen Satzt verlinkt ist, das alles ist mit Tileset grafik gemacht.
    Nachteil an obejkten ist. Sie verbrauchen einfach zu viel Speicher und performance.
    Fals du nun denkst....."ja aber die Objekte sind so einfach zu hand haben.
    Tilesets kann man super einfach im nach hineine verändernt. Daher das Ds_grid. mit der entsprechen formel kannst du deine Maus koordienate in eine Isometrische umwandeln. und bekommst so Rechnereisch und nicht über das Objekt die xy Posiiton im ds_grid heraus und Kannst es bearbeiten.

    Ps ich habe irgend wo ein Example wo ich eine Townsengien mal zu Spaß probeirt habe. Also ein Isometrisches Level mit höhenunterschiede....wenn man einen Spieler im Level hat.

    Hoffe ich konnt helfen
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Danke erstmal :)

    ich schau mir mal das später an :) meine frau hat den lappi mitgenommen... muss ich mal auf pc schauen, ich hoffe das geht, denn die isos müssen von rechts nach links und dann hinten weiter generiert werden, da sonst der depth nicht stimmt. aber ich schaue mal, danke nochmals, cool dass einen so krass geholfen wird :)
  • So was soll es Werden

    Kein Ding. Da kann ich dir helfen. Ist relativ einfach um zu setzten.

    Wie viele Felder willst du denn Darstellen

    da sonst der depth

    für den depth wert machst du einfach in das Objekt depth=-y
    heist einfacher um soweiter oben im raum ist um so kleiner wird der depth Wert. Also weiter hinten.
    Das selbe geht auch mit Tilesets. den denn muss man eine depth wert zu weisen beimm erstellen. Exakt für solche fälle. zb Wenn du Bäume hast
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • [Wie viele Felder willst du denn Darstellen]

    Der Spieler soll selbst entscheiden... mind. 5x5 max 15x15

    das mit dem depth ist echt logisch, bin ich aber nicht drauf gekommen XD

    schwierig wird es nur, bei den straßen und den random autos die dann eine strecke fahren, je nachdem wie der spieler eine straße gebaut hat...
  • Für die straßen brauchst du eine switch anweisung.
    Dafür ist es zb sinnvoll ein DS_grid zu nutzen wo die daten gesoeichert sind.

    Mal angenommen du hast nur straßen die von links nach recht , oben nach unten gehen....also nicht diagonal.
    Ich bin bei mir einfach alle felder / objekte durch gegangen und hab angefragt ob auf den benachbarten Feldern eine Straße ist. Wenn ja muss das entsprechen Bild gezeichnet werden.
    Also T-Kreuzung......Kurve. Endstück. Doppelkreuzung usw usw. Ohne Ds Grid muss du das mit Collisionsabfragen machen. Aber die sind performanc fressen und nicht zu empfehlen.

    Mal angenommen du nutz ein DS_grid "Ist nichts anderes als ein Karriertes Blatt Papier wo du in des Kästchen was eintragen kannst. Und sie mit x und y ansprichst. Grid=Netz/Raster"
    Nun willst du eine Straße testen. Dann fragst du einfach alle Positionen um die Straße ab.
    Ich mach das immer gengen den Urhzeiger sind. Damit ich immer das selbe Chema habe.

    Recht
    Oben
    Links
    Unten.
    Wenn dort eine straße ist dann soll dir eine 1 aus gegeben werden und wenn nicht dann 0
    Diese 4 Zahlen machst du als einen string(zeichenkette)

    Hier würde zb der String 1000 raus kommen.
    Rechts=1
    Oben=0
    Links=0
    Unten=0

    Nun wirst du sehen das du also eine Kombination für jede Möglichkeit heraus bekommst.
    Was für straßen die nicht Diagonal verlaufen ,noch recht übersichtlich ist.
    Hier ist mal das Script ,so wie ich es für alle meine solche Projekte nutzen

    GML-Quellcode

    1. var v1,v2,v3,v4,t,crypt;
    2. v1=ds_grid_get(global.level_grid,x+1,y)
    3. v2=ds_grid_get(global.level_grid,x,y-1)
    4. v3=ds_grid_get(global.level_grid,x-1,y)
    5. v4=ds_grid_get(global.level_grid,x,y+1)
    6. crypt= string(v1)+string(v2)+string(v3)+string(v4)
    7. //show_message(string(crypt))
    8. switch crypt
    9. {
    10. case "0000":{deine Creat befehll}break;//Nichts (Insel
    11. case "1000":{}break;//Endstück nach rechts
    12. case "0100":{}break;//Endstück nach oben
    13. case "0010":{}break;//Endstück nach links
    14. case "0001":{}break;//Endstück nach unten
    15. case "1101":{}break;//T-Kreuzung nach rechts
    16. case "1110":{}break;//T-Kreuzung nach oben
    17. case "0111":{}break;//T-Kreuzung nach links
    18. case "1011":{}break;//T-Kreuzung nach
    19. case "1111":{}break;//Kreuzung nach allen Seiten
    20. case "1100":{}break;//Kurve Recht/Oben
    21. case "0110":{}break;//Kurve Oben/Links
    22. case "0011":{}break;//Kurve Links/unten
    23. case "1001":{}break;//Kurve Unten/Recht
    24. case "1010":{}break;//Wagerechte Straße x achse
    25. case "0101":{}break;//Senkrechte Straße y achse
    26. }
    Alles anzeigen

    Das script geht jetzt davon aus das du den Wert 1 im Grid "level_grid" für eine Strasse gespeichert hast und eine 0/nichts wenn keine straße an dieser stelle ist.

    Das sind erst mal alle Kombinationen die Rauskommen. Bei Diagonal Strassen hat der Code 8 stellen und um die 50-60 Kombinationen.
    Diese Technick ist blitzt schnell. Früher hatte ich das auch mit Objekten gemacht.

    Je nach dem was für ein Wert raus kommt wird dann das Bild geändert.
    Hier müsten dann 2 straßen gändert werden.




    Und hier kommen wir noch zu einen weiteren Vorteil von Grids. Hier kannst du performance sparen.
    Und zwar must du ja nicht alle Felder ,sondern nur die, wo eine Starße ist. Also die, die eine 1 gespeichert haben.
    Bei 15*15 Felder geht das noch. Aber warum 15*15=225 Felder überprüfen, wenn du zb nur 10 Starßenfelder im Level hast.

    So kannst du in deiner doppel For Schleife abfragen, 1, ja oder neine. Wenn ja, mach die Überprüfung der Felder wie oben. Wenn ,geh zum nächsten Feld.
    Das kann man zwar noch besser machen. Das ist hier aber nicht nötig und etwas kompliziert zu erklären
    Meine Signatur hat kein Visum für das GM Forum erhalten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von x-sascha ()

  • Zum Thema dll bin ich nicht der rechte Ansprech partner. Da dll externe Code Biblieteken in C oder C++ sind "Ich vergessse das immer" muss man das schon wissen. Wir haben hier aber definitiv 2 oder mehr im Forum die sich mit dlls befassen. Aber von Hause aus, ist das nichtmöglich mit Gamemaker. Sound wieder geben ja..aber nicht aufnehmen.
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • ok danke ^^

    hab gerade nen problem: meine objekte kann man mit der maus verschieben, also die quatdrate wie in einem editor... schieb ich eine "tile" über die andere, löscht sich die untere? ist das nen dummer fehler, oder was hab ich falsch gemacht?
  • ___________________________________________
    ############################################################################################
    FATAL ERROR in
    action number 1
    of Create Event
    for object object1:

    Push :: Execution Error - Variable Get 100000.start_y(100002, -2147483648)
    at gml_Object_object1_CreateEvent_1 (line 5) - instance_create(start_x+(ix*16),start_y-(iy*8),obj_land)
    ####################################################################


    wenn ich das mit der schleife mache... die variabeln sind nicht definiert ^^