Code: Alles auswählen
; Sprite- und Keyboardfunktionen voreinstellen
If InitSprite() = 0 : MessageRequester("Error", "Can't init. screens and sprites") : End : EndIf
If InitKeyboard() = 0 : MessageRequester("Error", "Can't init. keyboard") : End : EndIf
; Geschwindigkeitskonstante
#SPEED = 2
; Diese Funktion prüft ob eine Kollision vorliegt
Procedure Collision(x.f, y.f)
Result = 0
; Gehe alle Tiles durch
Restore Map
For my=0 To 17
For mx=0 To 24
a.b
Read a
; Wenn der Tile-Typ 1(Mauer) ist, so prüfe auf eine Kollision mit diesem Tile...
If a = 1
; ... mit den entsprechenden Tile-koordinaten(IndexX*TileBreite, IndexY*TileBreite)...
; ... und den entsprechenden Spieler-koordinaten(SpielerX, SpielerY)...
; ... so, wie man es Zeichnen würde.
If SpriteCollision(0, Int(x), Int(y), 1, mx*32, my*32)
; Wenn ja: gib 1(True) zurück
Result = 1
; und springe aus beiden Schleifen(Anzahl: 2) raus
Break 2
EndIf
EndIf
Next
Next
ProcedureReturn Result
EndProcedure
; Öffne einen Screen
If OpenScreen(800, 600, 32, "Test") = 0 : MessageRequester("Error", "Can't open a screen") : End : EndIf
; Erstelle 2 Sprites
; Rotes viereck = Mauer
CreateSprite(0, 32, 32)
StartDrawing(SpriteOutput(0))
Box(0, 0, 32, 32, RGB(255, 0, 0))
StopDrawing()
; Blaues viereck = Spieler
CreateSprite(1, 32, 32)
StartDrawing(SpriteOutput(1))
Box(0, 0, 32, 32, RGB(0, 0, 255))
StopDrawing()
; Spielerposition genau in der Mitte des Bildschirms
X.f = 800/2
Y.f = 600/2
; Framerate auf 30 setzen(reich völlig)
SetFrameRate(30)
;- Hauptschleife
Repeat
; Keyboardstatus erneuern und abfragen
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up) ; laufe hoch
If Collision(X, Y-#SPEED) = 0
Y - #SPEED
EndIf
EndIf
If KeyboardPushed(#PB_Key_Down) ; laufe runter
If Collision(X, Y+#SPEED) = 0
Y + #SPEED
EndIf
EndIf
If KeyboardPushed(#PB_Key_Left) ; laufe links
If Collision(X-#SPEED, Y) = 0
X - #SPEED
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right) ; laufe rechts
If Collision(X+#SPEED, Y) = 0
X + #SPEED
EndIf
EndIf
; Beenden?
If KeyboardPushed(#PB_Key_Escape)
Quit = 1
EndIf
; Screeninhalt löschen und mit Schwarz überdecken
ClearScreen(0, 0, 0)
; Spieler anzeigen
DisplaySprite(1, X, Y)
; Mapdaten durchgehen
Restore Map
For my=0 To 17
For mx=0 To 24
a.b
Read a
If a = 1
; Mauer = 1, also anzeigen
DisplaySprite(0, mx*32, my*32)
EndIf
Next
Next
; Gefüllten Backbuffer zum Frontbuffer bringen
FlipBuffers()
; Eine kleine Verzögerung um den Prozessor nicht vollständig auszulasten
Delay(5)
Until Quit = 1
End
; Mapdaten
DataSection
Map:
Data.b 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Data.b 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
EndDataSection
Vielleicht ändert dir das jemand ab zu Arrays, dann hättest du schonmal ein kleines, handliches und auskommentiertes Beispiel.