autom. Tilemap Rendering
Übersicht

![]() |
bruZardBetreff: autom. Tilemap Rendering |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe noch ein Problem ... wer hätte das gedacht.
Nein, nein ... nicht die Sache mit dem Alkohol, etwas mit programmieren. Bei der Entwicklung des Editors für Timemill hatte ich es irgendwann satt dass man beim malen einer Map immer mit Geraden, Ecken, Bögen etc. zu tun hat und man wirklich jedes Tile einzeln setzen muss. Also dachte ich nach und besann mich auf die geilen Editoren der Warcraft Reihe. Man wählt das Tilesetthema, klickt, und schon hat man eine winzige Insel im Ozean. Sowas will ich auch. Das heisst: Ich klicke und der Editor berechnet selbst die 8 Tiles die an das gesetzte Tile angrenzen. Mein erster Ansatz war (und ist) einfach alle angrenzenden Tiles auf ihren Typ zu testen und dann entsprechend neue Tiles einzusetzen. Aber das ist ein Höllenaufwand und erfordert mehr als nur zwei Select...Case Strukturen. Und selbst wenn man genug Geduld aufbringt alle Möglichkeiten zu analysieren fehlt es an weiteren Vergleichen in Extremsituationen. Nun dachte ich mir dass das sicher nicht das Prinzip ist welches Blizzard verwendet hat und frage nun Euch: Gibt es bei einer derartigen Problemstellung ein Muster welches man mathematisch nutzen könnte oder bleiben einem wirklich nur unendliche Analysestrukturen? Um das Problem noch ein wenig mehr zu verdeutlichen poste ich hier mal meinen ersten Test (ca. 40kb) http://www.timemill.de/pub/download/maptest.zip |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
- Zuletzt bearbeitet von bruZard am Mo, Aug 08, 2005 11:42, insgesamt einmal bearbeitet
![]() |
Ninja |
![]() Antworten mit Zitat ![]() |
---|---|---|
*tip* prüfe doch nicht ständig sondern nur nach dem setzen eines neuen tiles alle durch! | ||
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau das tue ich ja, aber es ist ein Heidenaufwand und hört auch nicht nach dem setzen der umgebenen Tiles auf. Es zieht sich ja noch weiter -> Verändere ich das Tile -1,-1 könnte sich auch das Tile -1,-2 verändern ... aber was passiert danach? Verändert sich -1,-3 auch? Da ist man schnell an einem Punkt wo man das Ganze "Raytracing" nennt und doch nur die Verarbeitungsgeschwindigkeit meint. | ||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Evtl. hilft das:
http://www.gamedev.net/referen...cle934.asp bei meinem Editor habe ich es nicht eingebaut, weil man lange Definitions-Tabellen braucht, wann welche Tiles gesetzt werden sollen - Bei einem Editor, der speziall für ein Game abgestimmt ist, ist es einfacher |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für den Link TheShadow, werde ich mir mal antun ![]() |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also bei meiner Isoengine habe ich es so gemacht: Jedes Tile bekam eine Definition mit den Kanten:
Tile mit einer Landecke rechts unten = "0001" Tile mit einer Landecke links oben = "1000" Tile voll mit Land = "1111" Das ganze muss in ein String-Array und die Werte werden in einer Tilematrix gespeicherrt. Beim Tile-Setzen sähe das ganze so aus: Tile links oben: Code: [AUSKLAPPEN] tile_def$ = tile_specs$(ReadTile(x-1, y-1)) tile_def$ = "1" + Mid$(tile_def$, 2, 3) For i = 0 To max_tiles If i = ReadTile(x-1, y-1) Then WriteTile(x-1, y-1, i) Next Nicht unbedingt schnell aber dafür einfach zu machen! LordChaos /edit:Natürlich solltest du zum umwandeln eine Funktion benutzen. Diese For-Schleifen gehen ja doch ziemlich auf die Geschwindigkeit |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nee LordChaos, das funktioniert bei mir so nicht. Damit prüfst Du ja nur die 8 Tiles um das zu setzende Tile. Aber die zu setzenden Tiles können auch weiter ausserhalb liegende Tiles beeinflussen.
Irgendwie müsste man wohl ständig die gesetzte Menge komplett prüfen. Es beginnt alles mit einem ... nennen wir es einfach mal Null-Tile. Die Map ist damit gefüllt und es stellt die Basis dar. Wenn ich nun ein Grastile setze soll eine Landmasse aus 9 Tiles entstehen: Zentrum + links,oben + oben + rechts,oben + rechts + rechts,unten + unten + links,unten Klicke ich nun auf ein beliebiges Tile auf dieser "Landmasse" muss sich die "Küste" neu formen. Ich denke man muss die komplette "Küste" abackern um nachzuschauen ob irgendwo Artefakte entstehen und dort dann das richtige Tile einsetzen. Ausgesprochen kniffelig das Ganze... |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
/edit: Problem verstanden. Kann gelöscht werden.
LordChaos |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, ich habe nochmal nachgedacht, und bin zu dem Schluss gekommen, das meine Routine doch fuktionieren müsste, zumindest sehr viel besser als deine. Du erstellst einen Lookuptable für alle Tiles:
(sorry, ich benutzte B2D, um Fehlern vorzubeugen, kenne mich in BMax noch nicht so gut aus) Code: [AUSKLAPPEN] ; 1---2 ; | | ; 3---4 ; tile_specs$(max_tiles) tile_specs$(0) = "0000" tile_specs$(1) = "1111" tile_specs$(2) = "1000" tile_specs$(3) = "0100" ;usw. ;Dann musst du die Funktion anpassen: Function SetTile(x, y) WriteTile(x, y, 1) AlignTile1(x, y) AlignTile2(x, y) AlignTile3(x, y) AlignTile4(x, y) AlignTile5(x, y) AlignTile6(x, y) AlignTile7(x, y) AlignTile8(x, y) End Function ;---links oben Function AlignTile1(x, y) tile_def$ = tile_specs$(ReadTile(x-1, y-1)) ;---die rechte untere Ecke wird angepasst tile_def$ = Mid$(tile_def$, 1, 3) + "1" WriteTile(x-1, y-1, GetTile(tile_def$)) End Function ;hier die anderen Functions einbauen Function GetTile(spec$) If spec$ = "0000" Then Return 0 If spec$ = "1111" Then Return 1 ;... End Function Wenn ich es schaffe, werde ich noch ein Beispiel coden. /edit: Außerdem fehlen dir noch 2 Tiles. Ich hoffe, das ist dir auch schon aufgefallen. /edit2: So, doch etwas komplizierter als man denkt. *grübel* |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, das Sample ist fertig.
Download (argh, ich erahne gerade das Problem das du hattest, ich habe wohl mit den erweiterten Tiles etwas geschummelt. Verdammt!) |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
- Zuletzt bearbeitet von maximilian am So, Aug 07, 2005 14:40, insgesamt einmal bearbeitet
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da hast Du es Dir aber einfach gemacht ... Du ignorierst einfach die inneren Bögen. | ||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
In diesem Falle wäre es wirklich praktisch zu wissen wie das beim Warcraft-Editor funktioniert. Ich fand Warcraft bereits, aber keinen Editor. | ||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe auch schon nach Infos gesucht, aber keine gefunden. Warcraft1 hate ihmo keinen Editor (keinen offiziellen), aber zu Warcraft2 gibt es einen auf der CD. Bei diesem muss man, wie schon beschrieben, die Ecken einzelner Landmassen oder anderer geschlossener Gebiete nicht selbst setzen. Der Editor weiß wie die Map aussehen muss wenn man mit einem bestimmten Geländetyp in sie hinein klickt.
Dasselbe Prinzip kommt auch im Warcraft3 Editor zum Tragen, wobei es sich dort ja bekanntermaßen um eine 3D Engine handelt. Wenn ich mich recht erinnere verwendet der Starcraft Mapeditor auch diese Technik. |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, ich habe nun die W2-Demo gefunden und den Editor ausprobiert. Dementsprechend habe ich nochmal das Tileset abgeändert (Sample neu saugen, bitte).
Es funktioniert wirklich genau wie im W2-Editor, soweit ich mein Programm mit dem Editor verglichen habe. Vielleicht hat dich nur das alte Tileset verwirrt. ![]() LordChaos |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Interessante Technik. Ich weiß zwar noch nicht richtig wie Du das angestellt hast, aber wenn ich es adaptiere werde ich es schon verstehen ![]() |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo, war so ein lustiger Geistesblitz von mir, hat mir bei der Isoengine allerdings nicht so geholfen. Freut mich, dass es Verwendung gefunden hat. ![]() |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
Plasma(alt)Betreff: super teil !! |
![]() Antworten mit Zitat ![]() |
---|---|---|
nur kann ich es nicht downloaden ..![]() |
||
DIV is dead ! |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry, weil ich aufgrund noch nicht-existener Netzwerk-Konfiguration meinen Webspace missbrauchen musste, habe ich es kurzzeitig gelöscht. Ich lade es gleich wieder hoch. | ||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich entpacke seit Minuten was und es nimmt kein Ende und alles lahmt hier... Darum kann ichs momentan net downloaden. aber ich würde gern wissen, ob dein Sample auch noch eine Ebene tiefer geht. WC2 hatte ja z.B. auch Bäume. Wenn man Bäume setzt, kommen die auf Gras, d.h. Steppe muss da weg und zur Not muss eine Rasenküste her damit sie nicht im Wasser stehen. Oder die "Berge", die die Zwerge lustig wegsprengen können.
Die erfordern ja für sich 9 Tiles und runherum noch eine Küste etc., wären als direkte Aktion auf dem Wasser also 25 Tiles die gesetzt werden müssen (Grasküste, 3* Berg und wieder Grasküste). Vielleicht wäre ein schönes Tutorial ganz praktisch? Deine Chance! ![]() Achja bruZ, such dir doch bitte einen aussagekräftigen Titel für den Thread, auch in Hinsicht auf die "Recent Topics" ![]() |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sir, Jawohl, Sir!!
[EDIT] Ich habe mal den Code von LordChaos auf BMax umgebastelt. http://www.timemill.de/pub/download/maptest.zip (ca. 45kb) Exe liegt bei. [/EDIT] |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group