Deutsche
German translation
English
English translation


Exemple de code pour un jeu de platforme en 2D

Show Index

Cette page explique le fonctionnement d'un jeu de platforme en 2D.  Ses caractéristiques:

 

- un personnage qui peut courir plus ou moins vite et
sauter plus ou moins haut
- le personnage est dirigé par des 'forces' et se
déplace de manière fluide
- Chargement et utilisation d'un 'tile set' (jeu de tuile) pour dessiner le décor
- l'écran suit les déplacements du personnage
- scrolling vertical et horizontal des décors/niveaux
- Chargement et changement de multiples niveaux
- Interaction du joueur avec le décor
- affichage des stats à l'écran pour faciliter la programmation
2D platfomer style game

Faites un saut pour voir le résultat final...

Cliquez ici pour voir une version améliorée...

Traduction française gentillement offerte par Benoit Montagne

 

Commençons par définir l'affichage:

Graphics 640, 480						;affichage 2D avec une résolution de 640*480
SetBuffer BackBuffer()						;tout le dessin se fait sur le tampon de trame

 

Chargement des media utilisés par le jeu:

Global tileImages						;variable pour les images des tuiles du décor
Global imgPlayer						;variable pour l'image du personnage

;Load in all graphics, sounds, etc.				;charge uniquement les graphiques pour cette exemple
Global maxTile = 6						;définition de la tuile la plus haute pour la gestion d'erreur
tileImages = LoadAnimImage("bgtiles.png", 40, 40, 0, 8)
imgPlayer = LoadImage("jumpman.png")

 

Dimensionnement des tableaux et création des globales
dont vous allez avoir besoin:

Dim Level(0, 0)							;déclaration de la grille qui va contenir les données de niveau (définition plus tard)
Dim LevelExit(0, 0)						;Grinéclaration du tableau pour enregistrer les points de sortie dans le niveau (définition plus tard)

Global LevelWidth						;Enregistre la longeur du niveau actuel (en tuiles)
Global LevelHeight						;Enregistre la hauteur du niveau actuel (en tuiles)
Global NumExits							;Stores the number of exits in the level
Global ScreenX							;Enregistre la position actuelle de l'écran en x
Global ScreenY							;Enregistre la position actuelle de l'écran en y
Global MaxScreenX						;Enregistre la position maximum de l'écran en x
Global MaxScreenY						;Enregistre la position maximum de l'écran en y
Global PlayerX#							;Enregistre la position actuelle du joueur à l'écran en x
Global PlayerY#							;Enregistre la position actuelle du joueur à l'écran en y
Global CurLevel	= 1						;Enregistre le niveau actuel dans lequel se trouve le joueur
Global GameOver = False						;Enregistre l'état du jeu (0=en cours, 1=perdu, 2=gagné)
Global XVel# = 0						;vélocité horyzontale du joueur
Global YVel# = 0						;vélocité verticale du joueur

 

Chargement du niveau. Pour un jeu plus grand on devrait d'habitude charger les données du niveau à partir d'un fichier externe, mais pour faire simple, nous allons juste charger nos niveaux à partir de déclarations Data.  Nous utilisons une fonction pour pouvoir la réutiliser plusieurs foix. La fonction ainsi que les déclarations Data doivent être placés à la fin de votre programme.

LoadLevel(CurLevel, 1, 8)					;Charge le premier niveau; défini la position de départ du joueur.

Function LoadLevel(lvl, startX, startY)
	Select lvl
		Case 1
			Restore Data_Level1			;Grinéfini le pointeur de donnée du niveau 1
		Case 2
			Restore Data_Level2			;Grinéfini le pointeur de donnée du niveau 2
		Case 3
			Restore Data_Level3			;Grinéfini le pointeur de donnée du niveau 3
		Default
			RuntimeError("Error: Level " + lvl + " doesn't exist!")
	End Select
	;Read in the level width and height
	Read LevelWidth						;largeur du niveau en tuiles
	Read LevelHeight					;hauteur du niveau en tuiles
	If LevelWidth > 999 Or LevelWidth < 1 Then RuntimeError("Error: Level " + lvl + " data is corrupt!")
	If LevelHeight > 999 Or LevelHeight < 1 Then RuntimeError("Error: Level " + lvl + " data is corrupt!")
	Dim Level(LevelWidth-1, LevelHeight-1)			;Dimensionne la grille qui décrit le niveau de jeu à ce moment
	;Verify the players starting tile
	If startX >= LevelWidth Or startX < 0 Then RuntimeError("Error: Level " + lvl + " data is corrupt!")
	If startY >= LevelHeight Or startY < 1 Then RuntimeError("Error: Level " + lvl + " data is corrupt!")
	;Compute initial starting positions
	If startX < 5						;Si le joueur est près du bord gauche du niveau alors
		ScreenX = 0					; déplacement du niveau à gauche et
		PlayerX = startX * 40 + 20			; definition de la position de départ x du joueur.
	ElseIf  startX > LevelWidth - 12			;Si le joueur est près du bord droit du niveau alors
		ScreenX = LevelWidth * 40 - 640			; déplacement du niveau à droite moins la longueur de l'écran et
		PlayerX = startX * 40 - ScreenX + 20		; définition de la position de départ x du joueur moins la position de l'écran.
	Else							;Si le joueur n'est pas proche des bords gauches/droits du niveau alors
		ScreenX = startX * 40 - 200			; déplacement de l'écran 5 tuiles à gauche du joueur et
		PlayerX = 220					; définition de la position x de départ à 220.
	EndIf
	If startY < 4						;Si le joueur est proche du bord haut du niveau alors
		ScreenY = 0					; déplacement de l'écran en haut et
		PlayerY = (startY + 1) * 40			; définition de la position y de départ du joueur.
	ElseIf startY > LevelHeight - 9				;Si le joueur est proche du bord bas du niveau alors
		ScreenY = LevelHeight * 40 - 480		; déplacement de l'écran en bas moins la hauteur de l'écran et
		PlayerY = (startY + 1) * 40 - ScreenY		; définition de la position y de départ moins la position de l'écran
	Else							;Si le joueur n'est pas proche des bords haut/bas du niveau alors
		ScreenY = (startY + 1) * 40 - 160		; placement de l'écran 4 tuiles au dessus du joueur et
		PlayerY = 160					; définition de la position y de départ à 160
	EndIf
	MaxScreenX = 40 * LevelWidth - 640 - 1			;Grinéfini la position x maximum de l'écran
	MaxScreenY = 40 * LevelHeight - 480			;Grinéfini la position y maximum de l'écran
	;Read in the screen clearing color
	Read clscol
	If clscol = 1
		ClsColor 100, 110, 200				;Grinéfini la couleur de vidage sur celle du ciel
	Else
		ClsColor 0, 0, 0				;Grinéfini la couleur de vidage en noir.
	EndIf
	;Read in exit data
	Read NumExits						;Lit le nombre de sorties dans le niveau
	If NumExits > 10 Or NumExits < 1 Then RuntimeError("Error: Level " + lvl + " data is corrupt!")
	Dim LevelExit(NumExits, 4)				;dimensionne le tableau LevelExit à ce moment
	For iter = 1 To NumExits				;Itération des sorties
		Read LevelExit(iter, 0)				;Lit la position x de sortie
		Read LevelExit(iter, 1)				;Lit la position y de sortie
		Read LevelExit(iter, 2)				;Lit le niveau lié à la sortie
		Read LevelExit(iter, 3)				;Lit la nouvelle posiiton x du nouveau niveau
		Read LevelExit(iter, 4)				;Lit la nouvelle position y du nouveau niveau
	Next
	;Read in level data
	For yIter = 0 To LevelHeight-1				;Boucle du haut vers le bas
		For xIter = 0 To LevelWidth-1			;Boucle de gauche à droite
			Read Level(xIter, yIter)		;Lit les données de tuile pour chaque points xIter, yIter
			If Level(xIter, yIter) > maxTile Or Level(xIter, yIter) < 0 Then RuntimeError("Error: Level " + lvl + " data is corrupt!")
		Next
	Next
	;Réinitialisation de variables du jeu
	XVel = 0						;Réinitialise la vélocité du joueur sinon il
	YVel = 0						; continuera d'avancer lors de l'entrée dans le niveau suivant
End Function

;Tile descriptions
;0 blank		;tuile traversable
;1 sky			;tuile traversable
;2 cloud		;tuile traversable
;3 background object	;tuile traversable
;4 solid block		;tuile non traversable
;5 soft block		;tuile non traversable
;6 grass		;tuile non traversable

.Data_Level1
;Level 1 description
Data 80, 12		;longueur, hauteur du niveau
Data 1			;couleur de vidage = ciel
Data 2			;nombre de sorties dans ce niveau
Data 76, 10, 2, 56, 8	;points de sortie x, y ; numero de niveau, position de départ x,y
Data 36, 9, 3, 1, 2	;points de sortie x, y ; numero de niveau, position de départ x,y
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
;Level 2 description
Data 60, 18		;longueur, hauteur du niveau
Data 1			;couleur de vidage = ciel
Data 3			;nombre de sorties dans ce niveau
Data 55, 8, 1, 75, 10	;points de sortie x, y ; numero de niveau, position de départ x,y
Data 27, 7, 0, 0, 0	;points de sortie x, y ;fin du jeu; positions de départ non nécessaires
Data 22, 14, 3, 17, 12	;points de sortie x, y ; numero de niveau, position de départ x,y
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
;Level 3 description
Data 19, 32		;longueur, hauteur du niveau
Data 0			;couleur de vidage = noir
Data 1			;nombre de sorties dans ce niveau
Data 17, 2, 1, 37, 7	;points de sortie x, y ; numero de niveau, position de départ x,y
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

 

Maintenant créez une boucle qui met à jour l'écran
à chaque trame. Ajoutez tout le code restant à l'intérieur de la boucle à la place du commentaire.

Gametimer = CreateTimer(60)					;Défini et démarre le timer du jeu (60 fps)

;Départ de la boucle de jeu
Repeat								;Départ de la boucle principale
	WaitTimer Gametimer					;Attend le timer

	;insert additional code here

Until KeyHit(1)							;Repète la boucle tant que l'utilisateur n'a pas appuyé sur la touche Echape.
End								;Fin du programme

 

Récupération des entrées utilisateur:

	;Récupération des entrées utilisateur
	;UpKey = KeyDown(200)	;flèche haut			;Une bonne partique consiste à ne récuperer qu'une seule fois
	;DownKey = KeyDown(208)	;flèche bas			; les entrées par boucle de jeu. Cela peut éviter les 
	LeftKey = KeyDown(203)	;flèche gauche			; comportements inatendus, par exemple si l'état
	RightKey = KeyDown(205)	;flèche droite			; d'une touche change entre plusieurs vérifications
	JumpKey = KeyDown(57)	;espace				; de cette touche dans la boucle.
	FastKey = KeyDown(42)	;shift gauche

 

Maintenant appliquez les valeurs d'entrée pour le personnage du joueur et ensuite essayer de trouver quelle distance le joueur avancera à chaque trame. C'est un peu compliqué alors je vais juste vous laisser lire les commentaires pour que vous trouviez par vous même ce qui se passe.

	;Applique les forces d'entrée sur la position du joueur.
	YVel = YVel + .1					;Ajoute un leger mouvement vers le bas sur y (un nombre positif simule a gravité)
	If YVel > 19 Then YVel = 19
	If RightKey						;Vérifie si la touche flèche droite est appuyée.
		If FastKey					;Vérifie si la touche appliquée au déplacement rapide est appuyée (FastKey)
			If XVel < 7 Then XVel = XVel + .1	; si tel est le cas alors on augmente la vélocité de 7 pixels/trame
		Else
			If XVel < 4 Then XVel = XVel + .1	; Sinon on augmente la vélocité de seulement 4 pixels/trame
			If XVel > 4 Then XVel = XVel - .1	;Si Fastkey n'est pas appuyée alors on ralenti si necessaire.
		EndIf
	Else
		If XVel > 0 Then XVel = XVel * .8		;Si la touche flèche droite n'est pas appuyée alors on ralenti progressivement
	EndIf
	If LeftKey						;Vérifie si la touche flèche gauche est appuyée
		If FastKey					;Vérifie si la touche associée à Fastkey est elle aussi appuyée
			If XVel > -7 Then XVel = XVel - .1	; si tel est le cas alors on augmente la vélocité de 7 pixels/trame
		Else
			If XVel > -4 Then XVel = XVel - .1	; Sinon on diminue la vélocité de seulement -4 pixels/trame
			If XVel < -4 Then XVel = XVel + .1	;Si Fastkey n'est pas appuyée alors on ralenti si necessaire.
		EndIf
	Else
		If XVel < 0 Then XVel = XVel * .8		;Si la touche flèche gauche n'est pas appuyée alors on ralenti progressivement.
	EndIf
	If JumpKey And JumpKeyDown = False			;Vérifie si la touche de saut est appuyée (mais seulement quand elle est relachée)
		If AbleToJump = True				;Si le joueur peut sauter (ex: sur une platforme)
			AbleToJump = False			;Grinéfinir AbleToJump comme étant faux car le joueur est en train de sauter
			YVel = YVel - 19			;Grinéfini la vélocité verticale à -19 pour faire bouger le joueur vers le haut
			JumpKeyDown = True			;Grinéfini comme étant vrai pour que le joueur ne puisse
								;pas sauter denouveau tant que JumpKey n'est pas relachée
		EndIf
	ElseIf (Not JumpKey) And (AbleToJump = True)		;Si JumpKey n'est pas appuyée est que le joueur se trouve sur une platforme
		JumpKeyDown = False				; alors on défini JumpKeyDown comme étant faux pour empecher le joueur de sauter denouveau.
	EndIf
	If AbleToJump = False					;Si on est pas sur une platforme...
		If YVel < 19 Then YVel = YVel + .9		;alors on applique la gravité mais pas plus que la vélocité maximum
		If Not JumpKey And YVel<19 Then YVel=YVel+1	;Si l'utilisateur relache la touche de saut (Jumpkey) plus tôt alors
	EndIf							; on augmente la vélocité vers le  bas pour réduire la hauteur du saut
	;On essaye de faire bouger le joueur comme prévu
	;On essaye de faire bouger le joueur sur Y
	MoveSuccessful = False					;Réinitialise MoveSucessful comme étant faux.
	TileX = Floor((ScreenX+PlayerX-18+4*(YVel<0))/40)	;Grinétermine la tuile sur laquelle se trouve le joueur (+/-4 si déplacement vers le haut sur y)
	TileXR = Floor((ScreenX+PlayerX+18-4*(YVel<0))/40)	;Grinétermine la tuile située à droite du joueur
	Repeat							;On essaye de faire bouger le joueur en y aussi loin que possible
		If YVel < 0					;Si on tente un mouvement vers le haut alors
			TileY = Floor((ScreenY+PlayerY+YVel+5)/40)-2	; La tuile du dessus devient la tuile que l'on test
		ElseIf YVel > 0					;sinon si on essaye de bouger vers le bas
			If (ScreenY+PlayerY) Mod 40 < 0.5 And (ScreenY+PlayerY) Mod 40 > -0.5	;uniforme avec tuile?
				TileY = Floor((ScreenY+PlayerY+YVel)/40)	; On défini la tuile en dessous comme la tuile à tester
			Else
				TileY = Floor((ScreenY+PlayerY+YVel-.5)/40)	; On défini la tuile en dessous comme la tuile à tester
			EndIf
		Else						;Si Yvel = 0 (pas de déplacement haut/bas) alors
			MoveSuccessful = True			; On quitte la boucle car le joueur ne se déplace pas en Y
			TileY = Floor((ScreenY+PlayerY+YVel)/40);On doit quand même définir TileY
		EndIf
		If TileY=>LevelHeight Then GameOver=True	;Si le joueur tombe et sort du niveau alors le jeu se termine
		If TileY > -1 And TileY < LevelHeight		;Vérifie si TileY n'est pas hors de portée dans les comparaisons suivantes
			If Level(TileX,TileY)<4 And ((Level(TileXR,TileY)<4) Or (((ScreenX+PlayerX+20) Mod 40)=0));Check tile below < 4
				PlayerY = PlayerY + YVel	;Si TileY est une tuile vide (< 4 dans cet exemple) alors on autorise le joueur à se déplacer
				If YVel > 0 Then AbleToJump = False	;Le joueur tombe, on ne peut plus sauter
				MoveSuccessful = True		;Sortie de boucle, le joueur s'est bien déplacé
			EndIf
		EndIf
		If MoveSuccessful = False			;Si le déplacement à échoué, on essaye encore avec un déplacement moindre
			If YVel > 0				;Si on tente de bouger vers le bas alors
				YVel = YVel - .5		; On réduit la vélocité verticale (proche de zero)
				If YVel < 0 Then YVel = 0	; mais pas trop !
				AbleToJump = True		;Définir à True AbleToJump parce joueur sera d'atterrissage
				PlayerY = Floor(PlayerY)	;Retirez tout montant décimal afin que le joueur sera de niveau avec la surface
			Else					;Sinon si la tentative de coup vers le haut alors
				YVel = YVel + .5		; On réduit la vélocité verticale (proche de zero)
				If YVel > 0 Then YVel = 0	; mais pas trop !
			EndIf
		EndIf
	Until MoveSuccessful = True				;On essaye encore et encore jusqu'a ce que le joueur se déplace (même si seulement 0)
	;On essaye de faire bouger le joueur sur X
	MoveSuccessful = False					;Réinitialise MoveSucessful comme étant faux
	TileY = ScreenY + PlayerY				;On détermine par avance par convenance
	Repeat							;Tentative de déplacement du joueur en X aussi loin que possible
		If XVel > 0					;Si la tentative de déplacement se fait vers la droite alors
			TileX = Floor((ScreenX+PlayerX+XVel-21)/40)+1; On défini la tuile de droite comme étant la tuile à tester
		ElseIf XVel < 0					;sinon si la tentative de déplacement se fait vers la gauche alors
			TileX = Floor((ScreenX+PlayerX+XVel-20)/40)	; On définit la tuile de gauche comme étant la tuile à tester
		Else						;si Xvel = 0 (on ne bouge dans aucune direction) alors
			MoveSuccessful = True			; sortie de la boucle car le joueur ne se déplace pas en X
		EndIf
		If TileX>-1 And TileX<LevelWidth And GameOver=False;On vérifie que TileX/TileY ne sont pas hors de portée dans les comparaisons suivantes
			If Level(TileX,Floor((TileY+35)/40)-2)<4 And Level(TileX,Floor(TileY/40)-1)<4;Test si les tuiles ajacentes sont vides (<4)
				If ((Level(TileX, Floor(TileY/40)) < 4) Or ((TileY Mod 40 < .4) And (TileY Mod 40 > -.4)));Test si la tuile au dessous est elle aussi vide (au moins
					PlayerX = PlayerX + XVel	; que le joueur soit parfaitement aligné avec les tuiles); Si tel est le cas alors on déplce le joueur.
					If PlayerX < 0 Then PlayerX = 0	;Le joueur ne peut pas se déplacer en dehors de l'écran !
					MoveSuccessful = True		;Sortie de boucle, le joueur s'est bien déplacé
				EndIf
			EndIf
		EndIf
		If MoveSuccessful = False			;si la tentative de déplacement a échoué, on réessaye avec un déplacement plus petit
			If XVel > 0				;si on essaye de bouger vers la droite alors
				XVel = XVel - .5		; on réduit la vélocité verticale (proche de zero)
				If XVel < 0 Then XVel = 0	; mais pas trop !
			Else					;sinon si on essaye de bouger vers la gauche alors
				XVel = XVel + .5		; on réduit la vélocité horyzontale (proche de zero)
				If XVel > 0 Then XVel = 0	; mais pas trop!
			EndIf
		EndIf
	Until MoveSuccessful					;On essaye encore et encore jusqu'a ce que le joueur se déplace (même si seulement de 0)

 

Ajustement de l'écran pour s'assurer que le joueur est toujours dans l'écran:

	;Update screen position
	If PlayerX > 400					;Si le joueur se déplace trop près du coté droit de l'écran
		ScreenX = ScreenX + (PlayerX - 400)		; alors on déplace l'écran sur la même distance que celle parcourue lors du déplacement du joueur.
		If ScreenX > MaxScreenX				;Cependant, si l'écran dépasse la limite la plus à droite alors
			ScreenX = MaxScreenX			; on le déplace seulement jusqu'a cette limite.
		Else						;mais si l'écran peut bouger PEUT bouger vers la droite alors
			PlayerX = 400				; on défini la position du joueur en X à 400
		EndIf
	EndIf
	If PlayerX < 200					;Si le joueur se déplace trop près du coté gauche de l'écran
		ScreenX = ScreenX - (200 - PlayerX)		; alors on déplace l'écran sur la même distance que celle parcourue lors du déplacement du joueur.
		If ScreenX < 0					;Cependant, si l'écran dépasse la limite la plus à gauche alors
			ScreenX = 0				; on le déplace seulement jusqu'a cette limite.
		Else						;mais si l'écran peut bouger PEUT bouger vers la gauche alors
			PlayerX = 200				; on défini la position du joueur en X à 200
		EndIf
	EndIf
	If PlayerY > 400					;Si le joueur se déplace trop près du bas de l'écran
		ScreenY = ScreenY + (PlayerY - 400)		; alors on déplace l'écran sur la même distance que celle parcourue lors du déplacement du joueur.
		If ScreenY > MaxScreenY				;Cependant, si l'écran dépasse la limite le plus en bas alors
			ScreenY = MaxScreenY			; on le déplace seulement jusqu'a cette limite.
		Else						;mais si l'écran peut bouger PEUT bouger vers le bas alors
			PlayerY = 400				; on défini la position du joueur en Y à 400
		EndIf
	EndIf
	If PlayerY < 160					;Si le joueur se déplace trop près du haut de l'écran
		ScreenY = ScreenY - (160 - PlayerY)		; alors on déplace l'écran sur la même distance que celle parcourue lors du déplacement du joueur.
		If ScreenY < 0					;Cependant, si l'écran dépasse la limite la plus en haut alors
			ScreenY = 0				; on le déplace seulement jusqu'a cette limite.
		Else						;mais si l'écran PEUT bouger vers le haut alors
			PlayerY = 160				; on défini la position du joueur en Y à 160
		EndIf
	EndIf

 

Maintenant continuez et dessinez l'écran puis faites un Flip:

	;Draw the level
	TileX = ScreenX/40					;détermine la première tuile à dessiner
	XOffset = ScreenX Mod 40				;détermine le décalage de chaque tuile
	TileY = ScreenY/40					;détermine la première tuile à dessiner
	YOffset = ScreenY Mod 40				;détermine le décalage de chaque tuile
	For yIter = TileY To TileY+12				;boucle du haut vers le bas
		For xIter = TileX To TileX+16			;boucle de la gauche vers la droite
			If xIter > -1 And xIter < LevelWidth And yIter > -1 And yIter < LevelHeight
				Tile = Level(xIter, yIter)	;Obtient la tuile dans le tableau du niveau
				DrawImage tileImages, (xIter-TileX)*40-XOffset, (yIter-TileY)*40-YOffset, Tile
			EndIf
		Next
	Next

	;Draw the player					;Normally this would include animation
	DrawImage imgPlayer, PlayerX-20, PlayerY-80		; but we're keeping it simple in this example

	;Flip the screen
	Flip							;dessin du tampon de trame
	Cls							;vidage de l'écran (tampon de trame) (avec ClsColor)

 

Test pour savoir si le joueur se trouve devant une sortie de
niveau et si tel est le cas, on le transporte au niveau
suivant:

	;Test si le joueur se trouve devant une sortie de niveau
	TileX = PlayerX+ScreenX
	TileY = PlayerY+ScreenY
	For iter = 1 To NumExits
		If Int(TileX/40) = LevelExit(iter, 0)		;Vérifie si la position X du joueur = la position X de sortie
			If Abs(20-(TileX Mod 40)) < 5		;Vérifie si le joueur recouvre une grande partie de la sortie (entre 5 pixels)
				If Int(TileY/40-1) = LevelExit(iter, 1)	;Vérifie si la position Y du joueur = position Y de sortie
					CurLevel = LevelExit(iter,2);Passe du niveau actuel au suivant
					If CurLevel = 0		;Est-ce la fin du jeu ?
						GameOver = 2	; Si oui, alors on quitte
					Else			; Si non,alors on charge le niveau suivant
						LoadLevel(CurLevel, LevelExit(iter, 3), LevelExit(iter, 4));level, x, y
					EndIf
					Exit			;Une sortie de niveau est detectée, pas besoin de vérifier les autres
				EndIf
			EndIf
		EndIf
	Next

 

Pour finir, si GameOver était défini comme 'True' plus tôt
dans la boucle alors le jeu se termine!

	;Test si le jeu est terminé
	If GameOver						;Ce code est seulement utilisé ici dans cet exemple
		Color 150, 20, 20
		Rect 270, 220, 100, 60				;Dessine un rectangle rouge au milieu de l'écran
		Color 250, 250, 250
		If GameOver = 2
			Text 320, 250, "You Win!", True, True	;Dessine Vous avez gagné! dans le rectangle
		Else
			Text 320, 250, "Game Over", True, True	;Dessine Jeu terminé dans le rectangle
		EndIf
		Flip
		Repeat						;Boucle tant que l'utilisateur n'a pas
		Until KeyHit(1)					; appuyé sur la touche échappe
		End						; puis termine le programme.
	EndIf

 

Et voici le code tout entier que vous n'avez plus qu'a
copier&coller et éxecuter pour le voir tourner.

Keys used in this example:

keys used in this example

Left key	Move left
Right key	Move right
Spacebar	Jump
Left shift key	Move fast
Esc key		Exits program
Files used in this example:

files used in this example

right click and select
"Save Target As..."
bgtiles.png
jumpman.png

 

If you've reached this page and there's no index on the left, Click here to show the Index Page