Map
Übersicht

![]() |
scratschBetreff: Map |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
ProfJakeehemals "DTC" / "Fabian Niemann" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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% |
![]() |
ProfJakeehemals "DTC" / "Fabian Niemann" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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/ |
||
![]() |
ProfJakeehemals "DTC" / "Fabian Niemann" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? ![]() |
||
![]() |
ProfJakeehemals "DTC" / "Fabian Niemann" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja natürlich, nur wenn man solche Tutorials schreibt, dann könnte es vielleicht verwirrend wirken. Anyway .. | ||
![]() |
beanage.johannesBetreff: Danke... |
![]() Antworten mit Zitat ![]() |
---|---|---|
hey... danke das is echt super ![]() ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group