Map

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

scratsch

Betreff: Map

BeitragFr, Jun 13, 2008 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich versuche jetzt schon seit längerem eine Map für meine spiele zu realisieren und zwar basierend auf Tiles. Sprich eine Tilemap. Leider gelingtm ir das immer noch nicht. Ich versuchte es bereits mit Tuts aus dem Blitz Basic Bereich und diversen anderen dingen aber ich bekomme es einfach nicht hin eine Map mit Scrolling umzusetzen!?

Vielleicht hilft mir jemand ich bräuchte wirklich eine Detaillierte Erklärung da ich keine Ahnung hab?

Mfg. scratsch
User posted image I like to play... with you!
http://weenie-games.6x.to

ProfJake

ehemals "DTC" / "Fabian Niemann"

BeitragFr, Jun 13, 2008 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi scratsch,
du musst dir erst einmal überlegen, was für Features deine Map unterstützen soll
(Höhenunterschiede, verschiedene Ebenen, Gegenstaände etc).
Dass kann dir keiner abnehmen, aber den grundsätzlichen Code kann ich dir gerne zeigen.
Nehmen wir an, dass du in einer Datei einfach nur speichern möchtest welches Tile an welche Position gezeichnet wird.
Dann denkst du dir ein Format aus, liest die Datei ein und ermittelst die Abmessungen (Breite und Höhe),
die Größe der Tiles (4e 32 Pixel) und dann kann's losgehen.

example.map
Code: [AUSKLAPPEN]

50,50,1,2,3,4,5,6,7,8,9 ...


Code: [AUSKLAPPEN]

' Datei (example.map) einlesen und in der Variable file speichern

Local width:Short = 50 ' Die werte musst du aus der Mapdatei einlesen, es könnten 4e die ersten beiden Werte sein.
Local height:Short= 50 ' In diesem Beispiel muss die Variable file so beginnen ",1,2,3,4 ..", damit sie korrekt ausgelesen werden kann.

Local x:Short
Local y:Short

Local position:Int
Local tile:Short

Const TILE_SIZE:Byte = 32

For y = 0 To Height - 1
 For x = 0 To Width - 1
  position = file.Find(",", position) + 1
  tile = file[position..position + 1]
  DrawImage(tileImages[tile], x * TILE_SIZE, y * TILE_SIZE)
 Next
Next


[Achtung! Dieser Code wurde nicht getestet!]
[Achtung! Dieser Code ist Grütze, lieber nicht verwenden! =D]

P.S.: Du hast doch BlitzMax, oder?
[EDIT] Verdammt, ..
  • Zuletzt bearbeitet von ProfJake am Fr, Jun 13, 2008 22:45, insgesamt einmal bearbeitet
 

Lador

BeitragFr, Jun 13, 2008 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo scratsch.

Ich würde dir empfehlen, einen eigenen Map-Editor zu coden (der muss gar nicht besonders komfortabel sein, nur so, dass du weißt, wie man ihn verwendet). Dann kannst du den Code besser verstehen und ins Spiel/Programm einbinden. Einfach mit Mausklick Tile setzen und mit ein paar Tasten scrollen, Layer wechseln etc.

pupil:
Wenn der Code Grütze ist, wieso postest du ihn dann? ^^
Na klar hat er BlitzMax, sonst würde er wahrscheinlich kaum in dieses Forum schreiben...^^

MFG Lador
Mein aktuelles Projekt:
2D-Rollenspiel "Iliran"
Screenshot | Worklog
Fortschritt: ca. 70%

ProfJake

ehemals "DTC" / "Fabian Niemann"

BeitragFr, Jun 13, 2008 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Lador hat Folgendes geschrieben:
Wenn der Code Grütze ist, wieso postest du ihn dann? ^^


Da ich hoffe, dass er wenigstens gut verständlich ist.

P.S.: Das mit der Frage nach BlitzMax ist mir jetzt ziemlich peinlich, vielleicht ändere ich das später einmal, wenn Zeitreisen möglich sind ..

Jolinah

BeitragSa, Jun 14, 2008 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Hier auch nochmal ein Beispiel:
Code: [AUSKLAPPEN]
SuperStrict

Graphics 800, 600, 0

'Array, in dem die Tiles gespeichert werden
Local Tiles:Int[,] = New Int[40, 30]

'Ein paar Tiles in diesem Array setzen
Tiles[0,0] = 1
Tiles[10, 12] = 1
Tiles[5, 2] = 2
Tiles[18, 3] = 2

'Die Grösse der Tiles (40 * 40 Pixel)
Local TileSize:Int = 40

'Variablen für das Scroll-Offset
Local ScrollX:Int = 0
Local ScrollY:Int = 0


'Hauptschleife
Repeat
Cls

   'Scrollen auf der X-Achse
   If KeyDown(KEY_LEFT) Then
      ScrollX :- 2
   Else If KeyDown(KEY_RIGHT) Then
      ScrollX :+ 2
   EndIf
   
   'Scrollen auf der Y-Achse
   If KeyDown(KEY_UP) Then
      ScrollY :- 2
   Else If KeyDown(KEY_DOWN) Then
      ScrollY :+ 2
   EndIf
      

   'Alle Array-Felder durchgehen
   For Local y:Int = 0 To 29
      For Local x:Int = 0 To 39

          'Prüfen ob an der Stelle ein Tile ist, falls ja, dann Zeichnen
         If Tiles[x,y] > 0 Then
            If Tiles[x,y] = 1 Then
               'Bei Wert 1 - Weiss
               SetColor(255, 255, 255)
            Else If Tiles[x,y] = 2 Then
               'Bei Wert 2 - Rot
               SetColor(255, 0, 0)
            EndIf
         
            'Tile in einem 40 * 40 Raster zeichnen und um das ScrollOffset verschieben
            DrawRect x * TileSize - ScrollX, y * TileSize - ScrollY, TileSize, TileSize
         EndIf

      Next
   Next
   
Flip
Until KeyHit(KEY_ESCAPE)

End


Das ist jetzt so einfach wie möglich gehalten. Optimieren könnte man z.B. indem nur die Tiles "gezeichnet" werden die im Sichtbereich sind, also nicht jedesmal alle Felder des Arrays durchgehen.

Die Kollisionserkennung zwischen Spieler und Map, ist dann schon etwas schwieriger, zumindest bei Pixel-Kollision. Hier ist z.B. ein Lösungsansatz (Englisch):

http://jnrdev.72dpiarmy.com/en/jnrdev1/

ProfJake

ehemals "DTC" / "Fabian Niemann"

BeitragSa, Jun 14, 2008 7:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrays sind für Maps aber nur bedingt zu empfehlen, da sie recht unflexibel sind.
Ich würde für Maps immer externe Dateien benutzen wenn es möglich ist.
Notfalls kann man die ja auch über Incbin einbinden.

Jolinah

BeitragSa, Jun 14, 2008 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Jup, das sollte auch nur ein Beispiel sein. Ich persönlich schreib dann meist ne Lade- und Speicherfunktion, die das Array abfüllt, oder den Inhalt des Arrays in eine Datei speichert. Aber irgendwo müssen die Daten ja schlussendlich im Speicher stehen, da eignen sich Arrays doch recht gut? Smile

ProfJake

ehemals "DTC" / "Fabian Niemann"

BeitragSo, Jun 15, 2008 8:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja natürlich, nur wenn man solche Tutorials schreibt, dann könnte es vielleicht verwirrend wirken. Anyway ..

beanage.johannes

Betreff: Danke...

BeitragMo, Jun 16, 2008 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
hey... danke das is echt super Smile hatt mir sehr geholfen Very Happy

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group