|
|
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 |
![]() |
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.
|
|
| If you've reached this page and there's no index on the left, Click here to show the Index Page | |