Tiles für Levelgestaltung komfortabel auslesen
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
OxcomBetreff: Tiles für Levelgestaltung komfortabel auslesen |
Di, Nov 01, 2005 19:29 Antworten mit Zitat |
|
---|---|---|
Hallo zusammen,
ich möchte ein ganz simples Labyrinth darstellen. Dazu habe ich mir ein Tileset mit 32 verschiedenen Tiles gezeichnet. Alle 32 Tiles werden zur Darstellung des Labyrinths benötigt und kommen demenstprechend häufig vor. Meine bisherige Lösung: Mit einer Schleife mittels readdata aus defdata alle Daten zur Darstellung des Labyrinths auslesen. Dabei hat jedes der 32 Tiles eine Zahl zugeordnet. Die Daten werden mit if abgefragt und dann gezeichnet. Kann man das auch ein wenig komfortabler lösen ? Gruss Oxcom |
||
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF |
Freeman |
Di, Nov 01, 2005 19:46 Antworten mit Zitat |
|
---|---|---|
na du, müsstest alles in eine datei schreiben und diese dann einfach auslesen. Am besten bastelst du dir noch nen simplen mapeditor dafür, dann gehts noch besser.
Fr3eMaN |
||
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28 |
Oxcom |
Di, Nov 01, 2005 20:03 Antworten mit Zitat |
|
---|---|---|
Verstanden ! Vielen Dank !
Nun werde ich mir ein paar Bierchen ziehen und das Köpfchen kühlen. Prost ! Oxcom |
||
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF |
bruZard |
Di, Nov 01, 2005 20:20 Antworten mit Zitat |
|
---|---|---|
Ich mache das so:
Eine Map-Klasse verwaltet alles, dazu gibt es eine Layer- und eine Tileset Klasse. In der Layer Klasse gibt es ein Field welches eine Bank enthält. In dieser Bank halte ich für jede Zelle der Map einen Pointer auf die Referenz des Tilesets und die Framenummer auf das zu zeichnende Tile. Also: In meinem Editor gibt es am Anfang nichts ... der User sagt er will eine neue Map erstellen und muss die Breite und die Höhe in Tiles eingeben. Mittels dieser Daten erzeuge ich die Bank ... Angenommen der User will eine Map mit einer Grösse von 100x100 Tiles erzeugen. Dann ergibt sich eine Mapgrösse von (100*100)*8 Bytes ... x8 deshalb, weil ich ein Integer (4 Bytes) für den Zeiger auf das Tileset und ein Integer für die Nummer des Tiles benötige (wer sollte den User daran hindern ein Tileset mit 6 Millionen Tiles zu erstellen? ) Die Tilesets werden beim Programmstart geladen, aber das ist hier nicht relevant. Malt nun der User in die Map benötige ich folgende Daten: Referenz auf ein Objekt der Klasse TTileset und die Nummer des aktuellen Tiles. Aus der Referenz auf das Tileset bilde ich die Speicheradresse mittels Code: [AUSKLAPPEN] Method SetTile(s:Short, z:Short) Local pointer:TTileset Ptr = Varptr c_tileset Local offs:Int = Offset(s,z) Local tile:Int If c_tileanim=0 tile = c_tile+Rnd(0,c_tilevars) Else tile = c_tile EndIf PokeInt data,offs,Int(pointer); offs:+4 PokeInt data,offs,tile End Method der Offset innerhalb der Bank wird durch (Spalte+Zeile*Breite_der_Map) ermittelt. Jedes Tileset führt eine ID mit sich, diese wird im Constructor der Klasse automatisch gesetzt und ist wichtig beim wiederfinden der Daten. Sichere ich die Map schreibe ich zunächst die Anzahl der verwendeten Tilesets, dann kommt ein Block mit >ID des Tilesets< + <Dateiname des Tilesets< ... danach brauche ich nur noch den Inhalt der Banks aus der Klasse TLayer sichern und weiß nach dem laden immer welches Tile aus welchem Tileset an welche Position gemalt werden muss. Ich hoffe mein geistiger Durchfall konnte helfen |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
Freeman |
Di, Nov 01, 2005 20:42 Antworten mit Zitat |
|
---|---|---|
höhrt sich sehr interessant an BruZard, können wir mal deinen mapeditor bewundern?Würde mich mal echt reizen *grrrr*
Fr3eMaN |
||
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28 |
bruZard |
Mi, Nov 02, 2005 17:31 Antworten mit Zitat |
|
---|---|---|
@Freeman: Vor ca. 5 Minuten hat der Kram angefangen zu funktionieren Ich poste den kompletten Code sobald ich den Code für das _komplette_ laden der zuvor gesicherten Daten habe. | ||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
bruZard |
Mi, Nov 02, 2005 17:46 Antworten mit Zitat |
|
---|---|---|
So schnell kann es gehen:
http://www.timemill.de/pub/download/bomb.zip (ca. 40kb)
Der Code ist noch extrem _raw_, weder kann man zwischen den Tilesets wechseln, noch kann man die Grösse der Map ändern (25x18 = Bildschirm bei 800x600 = Default) Es gibt auch noch extreme Bugs. So gibt es noch kein FlushKeys() am Ende von Datei-Funktionen, so kann es vorkommen dass man eine Datei sichert und danach immer wieder in den Save-Requester geschickt wird. Ich poste den Code hier nur um zu zeigen wie man mehrere Tilesets pro Map verwenden kann und wie man dies mittels Pointer lösen kann. Sicher gibt es noch massig Spielraum zum verbessern und besser dokumentiert könnte der Kram auch sein Um den Kram überhaupt benutzen zu können ist es erforderlich dass Kommandozeilenparameter übergeben werden. Mindestens folgendes sollte angegeben werden: editor=1 theme=sandsturm In der originalen BlitzMax IDE macht man das über Menü "Program" -> "Command Line ..." Weitere Parameter kann man im Include "includes/appargs.bmx" nachlesen. |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
Oxcom |
Do, Nov 03, 2005 18:04 Antworten mit Zitat |
|
---|---|---|
Also mit viel Handarbeit und Fleiss habe ich nun mein Level für das Labyrinth fertiggestellt. Leider habe ich noch keinen Weg gefunden, die Leveldaten in eine Datei zu schreiben und dann wieder auszulesen. Habe mir in einem Tutorial die Befehle writefile ... writeshort ... openfile ... closefile angeschaut. Zahlen und Strings bekomme ich schon gebacken ... aber keine Leveldaten. Kann das jemand von Euch vielleicht nochmal an einem kleinen Beispiel für einen Noob veranschaulichen ? Wäre sehr dankbar.
Gruss Oxcom Hier noch das Tileset: Und so sieht dann das ganze Labyrinth aus: Code: [AUSKLAPPEN] Incbin "maze.png" Graphics 640,480,0 Global maze:Timage=LoadAnimImage("maze.png",8,8,0,33) If maze = Null Then DebugLog "maze kann nicht geladen werden" End ' labyrinth Local map:Int Local count:Int Local x:Int Local y:Int Local horizontal:Int Local vertikal:Int For vertikal = 1 To 31 For horizontal = 1 To 28 ReadData map If map = 1 Then DrawImage(maze,x,y,0) If map = 2 Then DrawImage(maze,x,y,1) If map = 3 Then DrawImage(maze,x,y,2) If map = 4 Then DrawImage(maze,x,y,3) If map = 5 Then DrawImage(maze,x,y,4) If map = 6 Then DrawImage(maze,x,y,5) If map = 7 Then DrawImage(maze,x,y,6) If map = 8 Then DrawImage(maze,x,y,7) If map = 9 Then DrawImage(maze,x,y,8) If map = 10 Then DrawImage(maze,x,y,9) If map = 11 Then DrawImage(maze,x,y,10) If map = 12 Then DrawImage(maze,x,y,11) If map = 13 Then DrawImage(maze,x,y,12) If map = 14 Then DrawImage(maze,x,y,13) If map = 15 Then DrawImage(maze,x,y,14) If map = 16 Then DrawImage(maze,x,y,15) If map = 17 Then DrawImage(maze,x,y,16) If map = 18 Then DrawImage(maze,x,y,17) If map = 19 Then DrawImage(maze,x,y,18) If map = 20 Then DrawImage(maze,x,y,19) If map = 21 Then DrawImage(maze,x,y,20) If map = 22 Then DrawImage(maze,x,y,21) If map = 23 Then DrawImage(maze,x,y,22) If map = 24 Then DrawImage(maze,x,y,23) If map = 25 Then DrawImage(maze,x,y,24) If map = 26 Then DrawImage(maze,x,y,25) If map = 27 Then DrawImage(maze,x,y,26) If map = 28 Then DrawImage(maze,x,y,27) If map = 29 Then DrawImage(maze,x,y,28) If map = 30 Then DrawImage(maze,x,y,29) If map = 31 Then DrawImage(maze,x,y,30) If map = 32 Then DrawImage(maze,x,y,31) If map = 33 Then DrawImage(maze,x,y,32) x:+8 Next x = 0 y:+8 Next Flip While Not KeyHit(key_escape) Wend DefData 1,5,5,5,5,5,5,5,5,5,5,5,5,9,10,5,5,5,5,5,5,5,5,5,5,5,5,2 DefData 7,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0,8 DefData 7,0,29,23,23,30,0,29,23,23,23,30,0,21,22,0,29,23,23,23,30,0,29,23,23,30,0,8 DefData 7,0,21,0,0,22,0,21,0,0,0,22,0,21,22,0,21,0,0,0,22,0,21,0,0,22,0,8 DefData 7,0,31,24,24,32,0,31,24,24,24,32,0,31,32,0,31,24,24,24,32,0,31,24,24,32,0,8 DefData 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8 DefData 7,0,29,23,23,30,0,29,30,0,29,23,23,23,23,23,23,30,0,29,30,0,29,23,23,30,0,8 DefData 7,0,31,24,24,32,0,21,22,0,31,24,24,30,29,24,24,32,0,21,22,0,31,24,24,32,0,8 DefData 7,0,0,0,0,0,0,21,22,0,0,0,0,21,22,0,0,0,0,21,22,0,0,0,0,0,0,8 DefData 3,6,6,6,6,30,0,21,27,23,23,30,0,21,22,0,29,23,23,28,22,0,29,6,6,6,6,4 DefData 0,0,0,0,0,7,0,21,25,24,24,32,0,31,32,0,31,24,24,26,22,0,8,0,0,0,0,0 DefData 0,0,0,0,0,7,0,21,22,0,0,0,0,0,0,0,0,0,0,21,22,0,8,0,0,0,0,0 DefData 0,0,0,0,0,7,0,21,22,0,17,6,16,33,33,15,6,18,0,21,22,0,8,0,0,0,0,0 DefData 5,5,5,5,5,32,0,31,32,0,8,0,0,0,0,0,0,7,0,31,32,0,31,5,5,5,5,5 DefData 0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0 DefData 6,6,6,6,6,30,0,29,30,0,8,0,0,0,0,0,0,7,0,29,30,0,29,6,6,6,6,6 DefData 0,0,0,0,0,7,0,21,22,0,19,5,5,5,5,5,5,20,0,21,22,0,8,0,0,0,0,0 DefData 0,0,0,0,0,7,0,21,22,0,0,0,0,0,0,0,0,0,0,21,22,0,8,0,0,0,0,0 DefData 0,0,0,0,0,7,0,21,22,0,29,23,23,23,23,23,23,30,0,21,22,0,8,0,0,0,0,0 DefData 1,5,5,5,5,32,0,31,32,0,31,24,24,26,25,24,24,32,0,31,32,0,31,5,5,5,5,2 DefData 7,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0,8 DefData 7,0,29,23,23,30,0,29,23,23,23,30,0,21,22,0,29,23,23,23,30,0,29,23,23,30,0,8 DefData 7,0,31,24,26,22,0,31,24,24,24,32,0,31,32,0,31,24,24,24,32,0,21,25,24,32,0,8 DefData 7,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,8 DefData 11,23,30,0,21,22,0,29,30,0,29,23,23,23,23,23,23,30,0,29,30,0,21,22,0,29,23,12 DefData 13,24,32,0,31,32,0,21,22,0,31,24,24,26,25,24,24,32,0,21,22,0,31,32,0,31,24,14 DefData 7,0,0,0,0,0,0,21,22,0,0,0,0,21,22,0,0,0,0,21,22,0,0,0,0,0,0,8 DefData 7,0,29,23,23,23,23,28,27,23,23,30,0,21,22,0,29,23,23,28,27,23,23,23,23,30,0,8 DefData 7,0,31,24,24,24,24,24,24,24,24,32,0,31,32,0,31,24,24,24,24,24,24,24,24,32,0,8 DefData 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8 DefData 3,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,4 |
||
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF |
regaa |
Do, Nov 03, 2005 19:22 Antworten mit Zitat |
|
---|---|---|
Oxcom hat Folgendes geschrieben: Zahlen und Strings bekomme ich schon gebacken ... aber keine Leveldaten.
Denk mal ganz gründlich nach....du hast die Lösung praktisch schon selber gefunden. |
||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
Artemis |
Do, Nov 03, 2005 19:40 Antworten mit Zitat |
|
---|---|---|
Oxcom hat Folgendes geschrieben: Code: [AUSKLAPPEN]
If map = 1 Then DrawImage(maze,x,y,0) If map = 2 Then DrawImage(maze,x,y,1) If map = 3 Then DrawImage(maze,x,y,2) If map = 4 Then DrawImage(maze,x,y,3) If map = 5 Then DrawImage(maze,x,y,4) If map = 6 Then DrawImage(maze,x,y,5) If map = 7 Then DrawImage(maze,x,y,6) If map = 8 Then DrawImage(maze,x,y,7) If map = 9 Then DrawImage(maze,x,y,8) If map = 10 Then DrawImage(maze,x,y,9) If map = 11 Then DrawImage(maze,x,y,10) If map = 12 Then DrawImage(maze,x,y,11) If map = 13 Then DrawImage(maze,x,y,12) If map = 14 Then DrawImage(maze,x,y,13) If map = 15 Then DrawImage(maze,x,y,14) If map = 16 Then DrawImage(maze,x,y,15) If map = 17 Then DrawImage(maze,x,y,16) If map = 18 Then DrawImage(maze,x,y,17) If map = 19 Then DrawImage(maze,x,y,18) If map = 20 Then DrawImage(maze,x,y,19) If map = 21 Then DrawImage(maze,x,y,20) If map = 22 Then DrawImage(maze,x,y,21) If map = 23 Then DrawImage(maze,x,y,22) If map = 24 Then DrawImage(maze,x,y,23) If map = 25 Then DrawImage(maze,x,y,24) If map = 26 Then DrawImage(maze,x,y,25) If map = 27 Then DrawImage(maze,x,y,26) If map = 28 Then DrawImage(maze,x,y,27) If map = 29 Then DrawImage(maze,x,y,28) If map = 30 Then DrawImage(maze,x,y,29) If map = 31 Then DrawImage(maze,x,y,30) If map = 32 Then DrawImage(maze,x,y,31) If map = 33 Then DrawImage(maze,x,y,32) Warum nicht einfachCode: [AUSKLAPPEN] DrawImage(maze,x,y,map-1) ?
|
||
Oxcom |
Fr, Nov 04, 2005 10:35 Antworten mit Zitat |
|
---|---|---|
regaa hat Folgendes geschrieben: Oxcom hat Folgendes geschrieben:
Zahlen und Strings bekomme ich schon gebacken ... aber keine Leveldaten.
Denk mal ganz gründlich nach....du hast die Lösung praktisch schon selber gefunden. Hmm ... werde ich dann wohl heute machen. Habe Urlaub ! |
||
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF |
Oxcom |
Fr, Nov 04, 2005 10:39 Antworten mit Zitat |
|
---|---|---|
JonasCleve hat Folgendes geschrieben: Oxcom hat Folgendes geschrieben:
Code: [AUSKLAPPEN]
If map = 1 Then DrawImage(maze,x,y,0) If map = 2 Then DrawImage(maze,x,y,1) If map = 3 Then DrawImage(maze,x,y,2) If map = 4 Then DrawImage(maze,x,y,3) If map = 5 Then DrawImage(maze,x,y,4) If map = 6 Then DrawImage(maze,x,y,5) If map = 7 Then DrawImage(maze,x,y,6) If map = 8 Then DrawImage(maze,x,y,7) If map = 9 Then DrawImage(maze,x,y,8) If map = 10 Then DrawImage(maze,x,y,9) If map = 11 Then DrawImage(maze,x,y,10) If map = 12 Then DrawImage(maze,x,y,11) If map = 13 Then DrawImage(maze,x,y,12) If map = 14 Then DrawImage(maze,x,y,13) If map = 15 Then DrawImage(maze,x,y,14) If map = 16 Then DrawImage(maze,x,y,15) If map = 17 Then DrawImage(maze,x,y,16) If map = 18 Then DrawImage(maze,x,y,17) If map = 19 Then DrawImage(maze,x,y,18) If map = 20 Then DrawImage(maze,x,y,19) If map = 21 Then DrawImage(maze,x,y,20) If map = 22 Then DrawImage(maze,x,y,21) If map = 23 Then DrawImage(maze,x,y,22) If map = 24 Then DrawImage(maze,x,y,23) If map = 25 Then DrawImage(maze,x,y,24) If map = 26 Then DrawImage(maze,x,y,25) If map = 27 Then DrawImage(maze,x,y,26) If map = 28 Then DrawImage(maze,x,y,27) If map = 29 Then DrawImage(maze,x,y,28) If map = 30 Then DrawImage(maze,x,y,29) If map = 31 Then DrawImage(maze,x,y,30) If map = 32 Then DrawImage(maze,x,y,31) If map = 33 Then DrawImage(maze,x,y,32) Warum nicht einfachCode: [AUSKLAPPEN] DrawImage(maze,x,y,map-1) ?Es ist doch immer wieder erstaunlich, dass mit einer kleinen Änderung ganze Codeabschnitte überflüssig werden. Da hätte ich nun aber auch selbst drauf kommen können ! Vielen Dank Jonas. Arbeite mich nebenher auch durch dein Tutorial durch. Gruss Oxcom |
||
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF |
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group