English
English translation
Français
French translation


Plattformbasiertes 2D Jump'n'Run Tutorial

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
2D platfomer style game

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.

Im Spiel verwendete Tasten:

keys used in this example

Cursor Links	Links bewegen
Cursor Rechts	Rechts bewegen
Leertaste	Springen
Umschalt links	Schneller bewegen
ESC		Programm beenden
Für dieses Beispiel benötigte Dateien:

Für dieses Beispiel benötigte Dateien

Rechtskllick -> 
"Ziel speichern unter..."
bgtiles.png
jumpman.png

 

Wenn du linkerhand keinen index siehst, klicke hier um zur Indexseite zu gelangen