Tiles für Levelgestaltung komfortabel auslesen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Oxcom

Betreff: Tiles für Levelgestaltung komfortabel auslesen

BeitragDi, Nov 01, 2005 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 01, 2005 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 01, 2005 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 01, 2005 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Wink )

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 Wink
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Freeman

BeitragDi, Nov 01, 2005 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 02, 2005 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@Freeman: Vor ca. 5 Minuten hat der Kram angefangen zu funktionieren Wink 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

BeitragMi, Nov 02, 2005 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
So schnell kann es gehen:

http://www.timemill.de/pub/download/bomb.zip (ca. 40kb)

    Funktionsweise:
  • Mit der linken Maustaste malt man die Tiles
  • Mit der rechten Maustaste löscht man ein gesetztes Tile
  • STRG + linke Maustaste setzt ein Kollisions-Tile
  • STRG + rechte Maustaste löscht ein Kollisions-Tile
  • Mausrad auf/ab wechselt das Tile im akt. Tileset
  • STRG + S lässt einen Dateinamen für die zu sichernde Datei eingeben
  • STRG + L ruft die Liste aller bisher gesicherten Maps auf. Man muss den Dateinamen anklicken und dann OK wählen. ESC bricht ab (ebenso beim sichern)


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 Smile

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

BeitragDo, Nov 03, 2005 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Sad 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:

user posted image

Und so sieht dann das ganze Labyrinth aus:

user posted image


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

BeitragDo, Nov 03, 2005 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Nov 03, 2005 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Nov 04, 2005 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ! Mr. Green
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF

Oxcom

BeitragFr, Nov 04, 2005 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ! Shocked

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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group