autom. Tilemap Rendering

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

bruZard

Betreff: autom. Tilemap Rendering

BeitragFr, Aug 05, 2005 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Aug 05, 2005 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
*tip* prüfe doch nicht ständig sondern nur nach dem setzen eines neuen tiles alle durch!

bruZard

BeitragFr, Aug 05, 2005 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

TheShadow

Moderator

BeitragFr, Aug 05, 2005 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 06, 2005 8:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Link TheShadow, werde ich mir mal antun Smile
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

maximilian

BeitragSa, Aug 06, 2005 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 06, 2005 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 06, 2005 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
/edit: Problem verstanden. Kann gelöscht werden.

LordChaos
Variety is the spice of life. One day ignore people, next day annoy them.

maximilian

BeitragSa, Aug 06, 2005 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 06, 2005 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 07, 2005 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 07, 2005 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 07, 2005 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 07, 2005 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

LordChaos
Variety is the spice of life. One day ignore people, next day annoy them.

bruZard

BeitragSo, Aug 07, 2005 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessante Technik. Ich weiß zwar noch nicht richtig wie Du das angestellt hast, aber wenn ich es adaptiere werde ich es schon verstehen Wink
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

maximilian

BeitragSo, Aug 07, 2005 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, war so ein lustiger Geistesblitz von mir, hat mir bei der Isoengine allerdings nicht so geholfen. Freut mich, dass es Verwendung gefunden hat. Smile
Variety is the spice of life. One day ignore people, next day annoy them.

Plasma(alt)

Betreff: super teil !!

BeitragSo, Aug 07, 2005 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
nur kann ich es nicht downloaden ..Sad
DIV is dead !

maximilian

BeitragSo, Aug 07, 2005 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Aug 08, 2005 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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! Smile

Achja bruZ, such dir doch bitte einen aussagekräftigen Titel für den Thread, auch in Hinsicht auf die "Recent Topics" Very Happy
christian.tietze@gmail.com - https://christiantietze.de
macOS

bruZard

BeitragMo, Aug 08, 2005 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group