|
|
Zum Index |
|---|
Dieses Tutorial demonstriert ein einfaches, plattformbasiertes 2D Jump'n'Run. Einige beinhaltete Features:
| -Ein Charakter der verschieden schnell läuft und
springt -Der Spielcharakter ist durch "Kräfte" beeinflusst und bewegt sich daher flüssig -Ladet und verwendet ein Tileset um den Hintergrund darzustellen -Kamera verfolgt den Spieler automatisch -Sowohl vertikal als auch horizontal scrollbare Level -Verwaltet mehrere Level -Zeigt, wie der Spieler auf den Hintergrund reagieren kannn -Debug-Informationen werden angezeigt |
![]() |
Hier klicken, um das Endergebnis zu sehen...
Hier gibt's eine verbesserte Version mit mehr Features...
Deutsche Übersetzung aus dem Englischen von Christoph Mach ("Eingeproggt"), Member der deutschen BlitzBasic Community
Wir beginnen mit dem Graphikmodus:
Graphics 640, 480 ;2D Graphik mit einer Auflösung von 640x480 SetBuffer BackBuffer() ;Damit alles auf den Backbuffer gezeichnet wird (Doublebuffering)
Verwendete Bilder laden:
Global tileImages ;Enthält Handle zum Hintergrund-Tileset
Global imgPlayer ;Handle für das Spielerbild
;Alle Graphiken, Sounds,... laden ;In diesem Beispiel werden nur Graphiken verwendet!
Global maxTile = 6 ;Maximale Anzahl an Tiles
tileImages = LoadAnimImage("bgtiles.png", 40, 40, 0, 8)
imgPlayer = LoadImage("jumpman.png")
Verwendete Arrays dimensionieren und globle Variablen initialisieren:
Dim Level(0, 0) ;Zur Speicherung der Laveldaten (Wird später festgelegt) Dim LevelExit(0, 0) ;Levelausgänge für Levelwechsel und Spiel gewinnen (Wird ebenfalls später festgelegt) Global LevelWidth ;Aktuelle Breite des Levels in Tiles Global LevelHeight ;Aktuelle Höhe des Levels in Tiles Global NumExits ;Anzahl an Ausgänge aus dem Level Global ScreenX ;X-Position, an dem der Hintergrund gezeichnet wird Global ScreenY ;Y-Position, an dem der Hintergrund gezeichnet wird Global MaxScreenX ;Maximale X-Position, des Hintergrundes Global MaxScreenY ;Maximale Y-Position, des Hintergrundes Global PlayerX# ;Aktuelle X-Position des Spielers Global PlayerY# ;Aktuelle Y-Position des Spielers Global CurLevel = 1 ;Level, der gerade gespielt wird Global GameOver = False ;Spielstatus (0=läuft, 1=verloren, 2=gewonnen) Global XVel# = 0 ;Horizontale Geschwindigkeit des Spielers Global YVel# = 0 ;Vertikale Geschwindigkeit des Spielers
Leveldaten laden. In größeren Spielen würden die Leveldaten aus externen Datein geladen werden, wir begnügen uns hier zur Einfachheit mit dem Blitz-internen Data Befehl. Der Code um einen Level zu laden wird in eine Funktion geschrieben, um ihn immer wieder zu verwenden Die Funktion und alle Data-Felder sollten am Ende des Programmcodes stehen.
LoadLevel(CurLevel, 1, 8) ;Ersten Level laden. Dabei Spielerposition setzen
Function LoadLevel(lvl, startX, startY)
Select lvl
Case 1
Restore Data_Level1 ;Zum Datenfeld, welches Level 1 enthält, springen
Case 2
Restore Data_Level2 ;Zum Datenfeld, welches Level 2 enthält, springen
Case 3
Restore Data_Level3 ;Zum Datenfeld, welches Level 3 enthält, springen
Default
RuntimeError("Error: Level " + lvl + " existiert nicht!")
End Select
;Levelbreite und -Höhe auslesen
Read LevelWidth ;Breite des Levels in Tiles
Read LevelHeight ;Höhe des Levels in Tiles
If LevelWidth > 999 Or LevelWidth < 1 Then RuntimeError("Error: Level " + lvl + ": Daten fehlerhaft!")
If LevelHeight > 999 Or LevelHeight < 1 Then RuntimeError("Error: Level " + lvl + ": Daten fehlerhaft!")
Dim Level(LevelWidth-1, LevelHeight-1) ;Leveldaten-Array dimensionieren
;Anfangsposition des Spielers überprüfen
If startX >= LevelWidth Or startX < 0 Then RuntimeError("Error: Level " + lvl + ": Daten fehlerhaft!")
If startY >= LevelHeight Or startY < 1 Then RuntimeError("Error: Level " + lvl + ": Daten fehlerhaft!")
;Startposition (des Spielers und des Hintergrundes) in pixel berechnen
If startX < 5 ;Wenn der Spieler nahe dem linken Rand ist, dann
ScreenX = 0 ; Hintergrund ganz nach links setzen
PlayerX = startX * 40 + 20 ; Spieler auf Startposition
ElseIf startX > LevelWidth - 12 ;Wenn der Spieler nahe dem rechten Rand ist, dann
ScreenX = LevelWidth * 40 - 640 ; Hintergrund ganz nach rechts setzen. (Bildschirmbreite muss abgezogen werden!) und
PlayerX = startX * 40 - ScreenX + 20 ; Spieler auf X-Startposition minus Hintergrundposition
Else ;Wenn der Spieler irgendwo zwischen dem linken und rechten Rand ist, dann
ScreenX = startX * 40 - 200 ; Hintergrund auf 5 Tiles links vom Spieler setzen und
PlayerX = 220 ; X-Position des Spielers auf 220 (Mitte)
EndIf
If startY < 4 ;Wenn der Spieler nahe dem oberen Rand ist, dann
ScreenY = 0 ; Hintergrund fängt ganz oben an
PlayerY = (startY + 1) * 40 ; Spieler auf Startposition
ElseIf startY > LevelHeight - 9 ;Wenn der Spieler nahe dem unterem Rand ist, dann
ScreenY = LevelHeight * 40 - 480 ; Hintergrund ganz nach unten setzen. (Bildschirmhöhe muss abgezogen werden!) und
PlayerY = (startY + 1) * 40 - ScreenY ; Spieler auf Y-Startposition minus Hintergrundposition
Else ;Wenn der Spieler irgendwo zwischen dem oberen und unteren Rand ist, dann
ScreenY = (startY + 1) * 40 - 160 ; Hintergrund auf 4 Tiles oberhalb vom Spieler setzen und
PlayerY = 160 ; Y-Position des Spielers auf 160 (Mitte)
EndIf
MaxScreenX = 40 * LevelWidth - 640 - 1 ;Errechnet die maximle X-Pposition des Hintergrundes
MaxScreenY = 40 * LevelHeight - 480 ;Errechnet die maximle Y-Pposition des Hintergrundes
;Hintergrundfarbe des levels laden (Für ClsColor)
Read clscol
If clscol = 1
ClsColor 100, 110, 200 ;Himmelsfarben
Else
ClsColor 0, 0, 0 ;oder schwarz
EndIf
;Daten der Levelausgänge laden
Read NumExits ;Anzahl der Levelausgänge
If NumExits > 10 Or NumExits < 1 Then RuntimeError("Error: Level " + lvl + ": Daten fehlerhaft!")
Dim LevelExit(NumExits, 4) ;Levelausgänge-Array dimensionieren
For iter = 1 To NumExits ;Alle Ausgänge durchlaufen u
Read LevelExit(iter, 0) ;X-Position,
Read LevelExit(iter, 1) ;Y-Position,
Read LevelExit(iter, 2) ;damit verknüpften Level,
Read LevelExit(iter, 3) ;X-Position auf neuem Level,
Read LevelExit(iter, 4) ;Y-Position auf neuem Level einzulesen
Next
;Eigentliche Leveldaten laden
For yIter = 0 To LevelHeight-1 ;Schleife, die von oben nach unten durchläuft
For xIter = 0 To LevelWidth-1 ;Schleife, die von links nach rechts durchläuft
Read Level(xIter, yIter) ;Aktuelles Tile einlesen (genaue Beschreibung weiter unten)
If Level(xIter, yIter) > maxTile Or Level(xIter, yIter) < 0 Then RuntimeError("Error: Level " + lvl + ": Daten fehlerhaft!")
Next
Next
;Spielvariablen zurücksetzen
XVel = 0 ;Spielergeschwindigkeit auf Null setzen, weil er sich
YVel = 0 ; sonst weiterbewegen würde
End Function
;Tile Beschreibung
;0 Nichts ;Begehbares Tile
;1 Himmel ;Begehbares Tile
;2 Wolke ;Begehbares Tile
;3 Hintergrundobjekt ;Begehbares Tile
;4 Fester Block ;Nicht begehbares Tile
;5 Weicher Block ;Nicht begehbares Tile
;6 Gras ;Nicht begehbares Tile
.Data_Level1
;Beschreibung Level 1
Data 80, 12 ;Levelbreite, -höhe
Data 1 ;cls color = Himmelsfarben
Data 2 ;Anzahl an Levelausgängen
Data 76, 10, 2, 56, 8 ;X-, Y-Position des Ausgangs, vernüpfter Level, neue X- und Y-Startposition
Data 36, 9, 3, 1, 2 ;X-, Y-Position des Ausgangs, vernüpfter Level, neue X- und Y-Startposition
Data 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,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,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,1,1,1,1,1
Data 1,3,1,1,1,3,1,3,3,1,1,1,1,2,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,2,2,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,1,1,1,1,1,1,1,1,1,1,1,2,1,1
Data 1,3,1,1,1,3,1,3,1,3,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,2,2,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,1,1,1,1,1,1,1,1,1,2,2,2,1
Data 1,3,1,3,1,3,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,3,3,3,3,3,1,3,1,3,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,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,5,1,1,5,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,3,1,3,1,1,3,1,3,1,1,1,1,1,1,1,1,1,5,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,1,5,5,5,1,5,5,5,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,1,1
Data 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,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,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,1,3,1,1,1
Data 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,1,4,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,5,1,1,5,1,1,1,4,1,1,1,1,1,1,1,1,5,2,5,1,1,1,1,1,4,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,1,1,1,1,1,3,3,3,3,3,1
Data 1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,5,2,5,1,1,1,1,5,4,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,3,3,1,3,3,1
Data 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,1,4,1,1,1,1,1,1,1,1,5,5,5,1,1,1,4,5,4,5,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,1,1,1,1,1,1,1,1,1,3,3,1,3,3,1
Data 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,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,6,6,6,6,6,6,6,6,1,1,1,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
.Data_Level2
;Beschreibung Level 2
Data 60, 18 ;Levelbreite, -höhe
Data 1 ;cls color = Himmelsfarben
Data 3 ;Anzahl an Levelausgängen
Data 55, 8, 1, 75, 10 ;X-, Y-Position des Ausgangs, vernüpfter Level, neue X- und Y-Startposition
Data 27, 7, 0, 0, 0 ;X-, Y-Position des Ausgangs, Spiel gewonnen, neue X- und Y-Startposition irrelevant
Data 22, 14, 3, 17, 12 ;X-, Y-Position des Ausgangs, vernüpfter Level, neue X- und Y-Startposition
Data 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,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,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,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,3,3,3,3,3,3,3,1
Data 4,4,4,4,4,4,4,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,3,1,1,1,1,1,3,1
Data 4,5,5,5,5,5,5,4,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,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,3,1,1,1,1,1,3,1
Data 4,5,5,5,5,5,5,5,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,3,1,1,4,1,1,1,1,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,3,3,3,3,3,3,3,1
Data 4,5,5,5,5,5,5,5,5,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,3,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,3,3,3,1,3,3,3,1
Data 4,5,5,5,5,5,5,5,5,5,4,1,1,1,1,1,5,1,5,5,5,1,5,1,1,1,4,4,4,4,4,1,1,1,1,1,1,1,1,4,3,2,4,1,4,2,3,4,1,1,1,5,3,3,3,1,3,3,3,1
Data 4,5,5,5,5,5,5,5,5,5,5,4,1,1,1,1,3,1,1,3,1,1,3,1,1,1,3,1,1,1,3,1,1,1,1,1,1,1,1,1,1,2,4,1,4,2,1,1,1,1,1,5,3,3,4,4,4,3,3,1
Data 4,5,5,5,5,5,5,5,5,5,5,5,4,1,1,1,3,1,1,3,1,1,3,1,1,1,3,1,1,1,3,1,1,1,1,1,1,1,1,1,1,4,4,1,4,4,1,1,1,1,1,5,3,3,3,3,3,3,3,1
Data 4,5,5,5,5,5,5,5,5,5,5,5,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,6,6,6,6,4,1,4,6,6,6,6,6,6,6,3,3,3,3,3,3,3,1
Data 4,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1,4,4,1,1,1,3,4,3,4,3,1,1,1,1,1,1,1,1,4,3,1,4,1,4,1,3,4,1,1,1,1,3,3,3,3,3,3,3,1
Data 4,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,4,3,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,1,1,1,1,3,3,4,4,4,3,3,1
Data 4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,1,1,5,1,4,3,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,1,1,1,1,3,3,3,3,3,3,3,1
Data 4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,1,6,1,6,1,6,1,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
Data 4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,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,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6,6
Data 4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,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,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6
.Data_Level3
;Beschreibung Level 3
Data 19, 32 ;Levelbreite, -höhe
Data 0 ;cls color = Schwarz
Data 1 ;Anzahl an Levelausgängen
Data 17, 2, 1, 37, 7 ;X-, Y-Position des Ausgangs, vernüpfter Level, neue X- und Y-Startposition
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4
Data 4,0,0,4,4,4,4,4,0,0,0,0,0,4,5,5,5,5,4
Data 4,0,0,4,5,5,5,5,4,0,0,0,4,5,5,5,5,5,4
Data 4,0,0,4,5,5,5,5,5,4,0,0,0,0,0,0,5,5,4
Data 4,0,0,4,4,5,5,5,5,5,4,0,0,0,0,0,5,5,4
Data 4,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,4,4,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0
Data 4,3,4,4,4,0,0,4,0,0,0,0,0,0,5,5,5,0,0
Data 4,0,0,4,5,0,0,5,4,0,0,0,4,5,5,5,0,0,4
Data 4,0,0,4,5,5,0,0,5,4,0,4,5,5,5,5,0,0,4
Data 4,0,0,4,5,5,0,0,0,5,4,5,5,0,0,0,0,0,4
Data 4,0,0,4,5,5,0,0,0,0,0,0,0,0,0,0,0,0,4
Data 4,0,0,4,4,5,5,0,0,0,0,0,0,0,0,0,0,0,4
Data 4,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,4,4,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4
Data 4,3,4,4,4,4,4,4,4,4,0,0,0,0,4,4,4,4,4
Data 4,0,4,4,4,0,0,0,0,0,0,0,0,0,5,5,5,5,4
Data 4,0,0,4,5,0,0,0,0,0,0,0,4,5,5,5,5,5,4
Data 4,0,0,4,5,5,0,0,0,0,0,0,5,5,5,5,5,5,4
Data 4,0,0,4,0,0,0,0,0,5,4,5,5,0,0,0,0,0,4
Data 4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
Data 4,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,4,4,4
Data 4,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,4
Data 4,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,4
Data 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
Jetzt brauchen wir eine Hauptschleife, in der alles berechnet und gezeichnet wird. Vorerst wird nur der Hintergrund neu gezeichnet, der Rest wird an der Markierung später eingefügt.
Gametimer = CreateTimer(60) ;Spieltimer erstellen, der das SPiel mit 60FPS laufen lässt ;Start game loop Repeat ;Start der Hauptschleife WaitTimer Gametimer ;Auf Timer warten ;Hier kommt der restliche Code hinein Until KeyHit(1) ;Hauptschleife wiederholen bis die ESC-Taste gedrückt wird End ;Programm beenden
Benutzereingaben erfassen:
;Benutzereingaben erfassen ;UpKey = KeyDown(200) ;Cursor rauf ;Es ist empfehlenswwert, die Tasten nur einmal pro Schleifendurchlauf abzufragen. ;DownKey = KeyDown(208) ;Cursor runter ; Das verhindert Fehler, die auftreten können, wenn der Zustand LeftKey = KeyDown(203) ;Cursor links ; während eines Schleifendurchlaufs wechselt. RightKey = KeyDown(205) ;Cursor rechts JumpKey = KeyDown(57) ;Leertaste FastKey = KeyDown(42) ;Linke Umschalt-Taste
Benutzereingaben auf Spieler anwenden und daraus die Positionsänderung in diesem Frame berechnen. Das ist ein etwas komplexerer Vorgang, der am besten durch die Kommentare im Code erklärt ist.
;Eingegebene "Kräfte" auf Spieler anwenden YVel = YVel + .1 ;Gravitation (Beschleunigung) If YVel > 19 Then YVel = 19 If RightKey ;Überprüft die Nach-Rechts-Cursortaste If FastKey ;Wenn Fast-Key (Linke Shift) gedrückt ist, If XVel < 7 Then XVel = XVel + .1 ; dann Geschwindigkeit um 7Pixel/Frame erhöhen Else If XVel < 4 Then XVel = XVel + .1 ; ansonsten Geschwindigkeit um 4Pixel/Frame erhöhen If XVel > 4 Then XVel = XVel - .1 ; außerdem Geschwindigkeit wieder verringern, wenn nötig EndIf Else If XVel > 0 Then XVel = XVel * .8 ;Wenn nicht nach Rechts bewegt wird, dann abbremen EndIf If LeftKey ;Überprüft die Nach-Links-Cursortaste If FastKey ;Wenn Fast-Key (Linke Shift) gedrückt ist, If XVel > -7 Then XVel = XVel - .1 ; dann Geschwindigkeit um 7Pixel/Frame verringern Else If XVel > -4 Then XVel = XVel - .1 ; ansonsten Geschwindigkeit um 4Pixel/Frame verringern If XVel < -4 Then XVel = XVel + .1 ; außerdem Geschwindigkeit wieder verringern, wenn nötig EndIf Else If XVel < 0 Then XVel = XVel * .8 ;Wenn nicht nach Links bewegt wird, dann abbremen EndIf If JumpKey And JumpKeyDown = False ;Überprüft die Sprungtaste (Sie muss allerdings nach dem letzten Sprung losgelassen worden sein!) If AbleToJump = True ;Wenn der Spieler auf einer Plattform steht, dann AbleToJump = False ; Darf der Spieler nicht erneut springen YVel = YVel - 19 ; Vertialgeschwindgkeit auf -19 setzen, was einer Bewegung nach oben entspricht JumpKeyDown = True ; festlegen, dass der Spieler gerade springt EndIf ElseIf (Not JumpKey) And (AbleToJump = True) ;Wenn Sprungtaste nicht gedrückt ist und Spieler auf Plattform steht, dann JumpKeyDown = False ; festlegen, dass der Spieler erneut springen darf EndIf If AbleToJump = False ;Wenn nicht auf Plattform, dann If YVel < 19 Then YVel = YVel + .9 ; zusätzliche Gravitation anwenden If Not JumpKey And YVel<19 Then YVel=YVel+1 ;Wenn der Benutzer die Sprungtaste früher loslässt, dann EndIf ; Geschwindigkeit weiter verringern, damit er nicht so hoch springt ;Spieler um die oben berechnete Werte bewegen ;Bewegen in Y-Richtung MoveSuccessful = False ;"MoveSuccessful" auf Falsch setzen TileX = Floor((ScreenX+PlayerX-18+4*(YVel<0))/40) ;Herausfinden, welches Tile links vom Spieler liegt (+/-4 für Bewegung in Y-Richtung) TileXR = Floor((ScreenX+PlayerX+18-4*(YVel<0))/40) ;Herausfinden, welches Tile rechts vom Spieler liegt Repeat ;Spieler so weit wie möglich in Y-Richtung bewegen If YVel < 0 ;Bewegung aufwärts TileY = Floor((ScreenY+PlayerY+YVel+5)/40)-2 ; set the tile above as tile to check against ElseIf YVel > 0 ;Bewegung abwärts If (ScreenY+PlayerY) Mod 40 < 0.5 And (ScreenY+PlayerY) Mod 40 > -0.5 ;Welches Tile in X-Richtung geprüft werden soll TileY = Floor((ScreenY+PlayerY+YVel)/40) ; Das Tile darunter zum Prüfen heranziehen Else TileY = Floor((ScreenY+PlayerY+YVel-.5)/40) ; Das Tile darunter zum Prüfen heranziehen EndIf Else ;Wenn keine Bewegung in Y-Richtung erfolgt, MoveSuccessful = True ; Schleife verlassen TileY = Floor((ScreenY+PlayerY+YVel)/40);Aktuelles Tile wird trotzdem zugewiesen EndIf If TileY=>LevelHeight Then GameOver=True ;Wenn der Spieler aus dem Level fällt, ist das Spiel verloren If TileY > -1 And TileY < LevelHeight ;Sichergehen, dass zu prüfendes Tile im Levelbereich liegt If Level(TileX,TileY)<4 And ((Level(TileXR,TileY)<4) Or (((ScreenX+PlayerX+20) Mod 40)=0));Check tile below < 4 PlayerY = PlayerY + YVel ;Wenn Tile begehbar ist (< 4 in diesem Beispiel) dann Bewegung durchführen If YVel > 0 Then AbleToJump = False ;Wenn der Spieler fällt, dann darf er nicht springen können MoveSuccessful = True ;Schleife verlassen, denn Spieler wurde erfolgreich bewegt EndIf EndIf If MoveSuccessful = False ;Wenn Bewegung nicht möglich ist, nochmal mit geringerer Geschwindigkeit versuchen If YVel > 0 ;Abwärts bewegen YVel = YVel - .5 ; Vertikale Geschwindigkeit verringern (an 0 annähern), If YVel < 0 Then YVel = 0 ; allerdings nicht unter 0 gehen! AbleToJump = True ;Der Spieler wird ein festes Tile erreichen, deshalb darf er springen PlayerY = Floor(PlayerY) ;Kommastellen streichen, sodass der Spieler exakt auf den Tiles aufliegt Else ;Aufwärts bewegen YVel = YVel + .5 ; Vertikale Geschwindigkeit erhöhen (an 0 annähern), If YVel > 0 Then YVel = 0 ; allerdings nicht über 0 gehen! EndIf EndIf Until MoveSuccessful = True ;Solange probieren, bis Bewegung möglich war ;Attempt to move the player in X MoveSuccessful = False ;MoveSuccessful zurücksetzen (=Falsch) TileY = ScreenY + PlayerY ;TileY den aktuellen Wert zuweisen Repeat ;Bewegung in X-Richtung überprüfen If XVel > 0 ;Bewegung nach rechts TileX = Floor((ScreenX+PlayerX+XVel-21)/40)+1; Tile rechts vom Spieler überprüfen ElseIf XVel < 0 ;Bewegung nach links TileX = Floor((ScreenX+PlayerX+XVel-20)/40) ; Tile links vom Spieler überprüfen Else ;Wenn keine Bewegung in X-Richtung erfolgt MoveSuccessful = True ; Schleife verlassen EndIf If TileX>-1 And TileX<LevelWidth And GameOver=False;Sichergehen, dass TileX und TileY innerhalb der Levelgrenzen liegen If Level(TileX,Floor((TileY+35)/40)-2)<4 And Level(TileX,Floor(TileY/40)-1)<4;Überprüft, ob beide Seitentiles des Spielers begehbar sind (<4) If ((Level(TileX, Floor(TileY/40)) < 4) Or ((TileY Mod 40 < .4) And (TileY Mod 40 > -.4)));Überprüft, ob das Tile darunter ebenfalls begehbar ist PlayerX = PlayerX + XVel ; außer, wenn der Spieler exakt mit der Tileposition übereinstimmt. Dann Spieler bewegen If PlayerX < 0 Then PlayerX = 0 ;Spieler nicht außerhalb des Bildschirms bewegen MoveSuccessful = True ;Schleife verlassen, denn Spieler wurde erfolgreich bewegt EndIf EndIf EndIf If MoveSuccessful = False ;Wenn Bewegung nicht möglich ist, nochmal mit geringerer Geschwindigkeit versuchen If XVel > 0 ;Rechts bewegen XVel = XVel - .5 ; Horizontale Geschwindigkeit verringern (an 0 annähern), If XVel < 0 Then XVel = 0 ; allerdings nicht unter 0 gehen! Else ;Links bewegen XVel = XVel + .5 ; Horizontale Geschwindigkeit erhöhen (an 0 annähern), If XVel > 0 Then XVel = 0 ; allerdings nicht über 0 gehen! EndIf EndIf Until MoveSuccessful ;Solange probieren, bis Bewegung möglich war
Position der Hintergrundtiles anpassen, damit der Spieler am Bildschirm bleibt:
;Position der Hintergrundtiles anpassen If PlayerX > 400 ;Wenn Spieler an den rechten Rand kommt, ScreenX = ScreenX + (PlayerX - 400) ; dann Hintergrundbild um denselben Betrag scrollen, wie der Spieler bewegt wurde If ScreenX > MaxScreenX ;Wenn die Hintergrundbildposition jedoch größer als erlaubt ist, dann ScreenX = MaxScreenX ; einfach die X-Position auf den maximalen Wert stellen. Else ;Wenn der Hintergrund gescrollt wurde, PlayerX = 400 ; wird die X-Position des Spielers auf 400Pixel gesetzt EndIf EndIf If PlayerX < 200 ;Wenn Spieler an den linken Rand kommt, ScreenX = ScreenX - (200 - PlayerX) ; dann Hintergrundbild um denselben Betrag scrollen, wie der Spieler bewegt wurde If ScreenX < 0 ;Wenn die Hintergrundbildposition jedoch kleiner als erlaubt ist, dann ScreenX = 0 ; einfach die X-Position auf den minimalen Wert stellen. Else ;Wenn der Hintergrund gescrollt wurde, PlayerX = 200 ; wird die X-Position des Spielers auf 400Pixel gesetzt EndIf EndIf If PlayerY > 400 ;Wenn Spieler an den unteren Rand kommt, ScreenY = ScreenY + (PlayerY - 400) ; dann Hintergrundbild um denselben Betrag scrollen, wie der Spieler bewegt wurde If ScreenY > MaxScreenY ;Wenn die Hintergrundbildposition jedoch größer als erlaubt ist, dann ScreenY = MaxScreenY ; einfach die Y-Position auf den maximalen Wert stellen. Else ;Wenn der Hintergrund gescrollt wurde, PlayerY = 400 ; wird die Y-Position des Spielers auf 160Pixel gesetzt EndIf EndIf If PlayerY < 160 ;Wenn Spieler an den oberen Rand kommt, ScreenY = ScreenY - (160 - PlayerY) ; dann Hintergrundbild um denselben Betrag scrollen, wie der Spieler bewegt wurde If ScreenY < 0 ;Wenn die Hintergrundbildposition jedoch kleiner als erlaubt ist, dann ScreenY = 0 ; einfach die Y-Position auf den minimalen Wert stellen. Else ;Wenn der Hintergrund gescrollt wurde, PlayerY = 160 ; wird die Y-Position des Spielers auf 160Pixel gesetzt EndIf EndIf
Nun zeichnen wir den Level und Flippen den Backbuffer, damit dieser sichtbar wird:
;Level zeichnen TileX = ScreenX/40 ;X-Starttile des Hintergrundbildes XOffset = ScreenX Mod 40 ;Verschiebung in X-Richtung bei jedem Tile TileY = ScreenY/40 ;Y-Starttile des Hintergrundbildes YOffset = ScreenY Mod 40 ;Verschiebung in Y-Richtung bei jedem Tile For yIter = TileY To TileY+12 ;Schleife von oben nach unten For xIter = TileX To TileX+16 ; und Schleife von links nach rechts If xIter > -1 And xIter < LevelWidth And yIter > -1 And yIter < LevelHeight Tile = Level(xIter, yIter) ;Tile aus dem Level-Array auslesen DrawImage tileImages, (xIter-TileX)*40-XOffset, (yIter-TileY)*40-YOffset, Tile EndIf Next Next ;Spieler zeichnen ;Normalerweise gäbe es hier eine Animation, DrawImage imgPlayer, PlayerX-20, PlayerY-80 ; aber wir halten es einfach ;Bildschirm flippen Flip ;Backbuffer auf den Frontbuffer flippen Cls ;Backbuffer mit eingestellter Farbe (clsColor) löschen
Überprüfen, ob Spieler auf einem Levelausgang steht. Wenn ja, dann Spieler entsprechend bewegen:
;Überprüfen, ob Spieler auf einem Levelausgang steht TileX = PlayerX+ScreenX TileY = PlayerY+ScreenY For iter = 1 To NumExits If Int(TileX/40) = LevelExit(iter, 0) ;Vergleicht die X-Positionen von Spieler und Ausgang If Abs(20-(TileX Mod 40)) < 5 ;Großteil des Ausgangs muss vom Spieler betreten sein (+/-5 Pixel) If Int(TileY/40-1) = LevelExit(iter, 1) ;Vergleicht die Y-Positionen von Spieler und Ausgang CurLevel = LevelExit(iter,2);Wechselt zum neuen Level If CurLevel = 0 ;Spielziel erreicht? GameOver = 2 ; Wenn ja, Spiel beenden Else ; Ansosnten anderen Level laden LoadLevel(CurLevel, LevelExit(iter, 3), LevelExit(iter, 4));level, x, y EndIf Exit ;Wenn ein Ausgang gefunden wurde, braucht man die anderen nicht überprüfen EndIf EndIf EndIf Next
Zu guter Letzt erstellen wir noch eine Anzeige, die erscheint, wenn das Spiel beendet wurde!
;Schaut, ob Spiel vorbei ist If GameOver ;Der folgende Graphikcode ist nur ein Beispiel Color 150, 20, 20 Rect 270, 220, 100, 60 ;Rotes Rechteck in der Mitte des Bildshrims Color 250, 250, 250 If GameOver = 2 Text 320, 250, "Gewonnen!", True, True ;Siegermeldung anzeigen Else Text 320, 250, "Leider verloren", True, True ;Verloren-meldung anzeigen EndIf Flip Repeat ;So lange wiederholen, bis der Benutzer Until KeyHit(1) ; die ESC-Taste drückt End ; Programm beenden EndIf
Hier ist der gesamte Code, den du nur kopieren und anschließend ausprobieren
kannst.
|
|
| Wenn du linkerhand keinen index siehst, klicke hier um zur Indexseite zu gelangen | |