3D: Höhe des Spielers an Floor anpassen
- GM 6
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
-
-
Dafür gibt es ein Skript.
Der Sinn hinter der Sache ist dass man das gesamte Terrain durch ein Grid erstellt. D.h. in dem grid ist die momentane Höhe des Terrains an der jeweiligen Stelle angegeben (je engmaschiger das Grid, desto genauer und desto Leistungsfressender!). Am Spielanfang wird dann ein Modell erstellt das dauernd gedrawt wird.
Mit einem Skript kann man dann einfach die Höhe an der bestimmten position berechnen (aus den umliegenden Punkten).
Hier gibts die Skripte:
gmc.yoyogames.com/index.php?showtopic=488892
Dies lädt sogar das Terrain aus einer bmp-datei. dies wird häufig genutzt wenn man sich nicht einen Terrain-editor für das Spiel bastelt.
EDIT: Halt. Komando zurück.
Hast du das Bild erst jetzt hinzugefügt, oder hab ichs übersehen?
Meinst du jetzt 2d wie auf dem Bild oder 3d. In 2d, heisst es nähmlich nicht z, sondern einfach y.
Asso. Doch. Im titel steht ja 3d
EDIT2: meiner Meinung nach nicht...
Das Prinzip wird überigens praktisch überall für terrain benutzt. Schau dir WoW etc. an.
Du wirst merken dass das Terrain eigentlich aus Quadraten besteht.Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von DragonGamer ()
-
Gibts kein einfacheren weg?Ihc hab so voll den ij
-
Wenn du's unbedingt so haben willst, hier ein paar simplere Skripte:
gmc.yoyogames.com/index.php?showtopic=423717
Slayer64's Arbeit ist immer zieeeeehmlich fortgeschritten. -
Ok und wie erstelle ich eine Height map die Perfekt auf mein Level passt?Ihc hab so voll den ij
-
-
Ich hab halt immer Objekte gemacht (z.B. obj_floor,obj_wall etc.) und die dann im Roomeditor
eingesetzt. Gecodet hab ich ganz normal mit d3d_draw_floor() oder so...Ihc hab so voll den ij -
Das ist schlecht. Bist du schon sehr weit fortgeschritten? Denn wie gesagt, es wäre besser ein Grid zu nehmen.
Entweder (wenn du ein gutes 3d-Vorstellungsvermögen hast oder die Karte nicht sehr kompliziert werden soll) schreibst du die Werte direkt in ein Grid. Also einfach von der Ecke aus anfangen und die jeweilige Höhe an den jeweiligen Punkten einsetzen.
Oder du machst ein es mit einem bmp Bild.
In einem Grafik programm, am besten GM's Editor erstellst du ein Rechteck dass die selben Proportionen wie deine Karte hat und malst die Pixel in Graustufen an.
D.h. ein Pixel entspricht einer Ecke von einem Quadrat auf deiner Map. Du hast 255 Graustufen zur verfügung.
Bin mir gerade nicht sicher, aber glaube desto heller der Ton desto flacher das Terrain und umgekehrt. Das heist wenn du Pixel in verschiedenen Graustufen platzierst, kannst du weiche Terrains machen aber auch abrupte Steigungen.
Andere Sachen wie zum beispiel Gebäude auf denen man nicht draufsteigen kann, kannst du weiterhin mit den Draw Funktionen machen und die Kollisionen berechnen. Schau dir mal dazu ein Tut zum Thema Kollisionen von Moolt an. -
Danke!
Mmh... Hört sich logisch an...
Gibts da irgdendwo ein brauchbares Tutorial?Ihc hab so voll den ij -
Einen Moment - willst du 3d-Terrain, Bewegung im Terrain oder beides haben?
Erstmal zum Post von DragonGamer: Die simpelste Methode ist, das Bild als Sprite zu laden. Dann erstellst du ein Surface und liest jeden Pixel aus. Soweit ich weiß zwar der einzigste Weg mit solchen Heightmaps, aber leider auch extrem Zeitintensiv (ich bastle grade an einem 2d-Spiel mit zufälliger Map-Generation rum, da braucht allein das Laden der Map bei einem ~200x200-Surface c.a. 5-7 sek.). Das ganze würde wahrscheinlich so aussehen:
GML-Quellcode
- //Lade-Script.
- //Variablen, die initialisiert sein müssen:
- /*global.ter_sur (falls das Laden nicht im Create-Event stattfindet. Wert einfach zu zb. noone setzen.)
- global.ter_cell_size (die Länge oder Breite der Zellen der Heightmap.)
- global.ter_map [ 0 bis room_width / global.ter_cell_size, 0 bis room_height / global.ter_cell_size ]
- global.ter_sur = surface_create (room_width / global.ter_cell_size, room_height / global.ter_cell_size)
- surface_set_target (global.ter_sur) //Wird das eigentlich bei Pixel-auslesen gebraucht?
- for (xx = 0; xx < room_width / global.ter_cell_size; xx += 1)
- { for (yy = 0; yy < room_width / global.ter_cell_size; yy += 1)
- { global.ter_map [ xx, yy ] = surface_getpixel (global.ter_sur, xx, yy) //Bin mir mit den Grayscale-Farben nicht ganz sicher, vllt. noch ein bisschen mit make_color_hsv rumspielen (:
- } }
- surface_reset_target ()
Für Terrain-Bewegung fällt mir spontan kein Script ein, aber wahrscheinlich z andhand von z1, z2, z3 und z4 der benachbarten Zellenknoten und der Distanz zu denen ausrechnen. -
-
Aber wie soll ich denn bei so nem Sprite genau zeichnen können?
Ich hätts schon gern das wenn ich ne Mauer halt 32 Pixel Hoch haben will, dass das dann auch so ist...Ihc hab so voll den ij