|
|
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...
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) ;Load in the first level; Set players starting position
Function LoadLevel(lvl, startX, startY)
Select lvl
Case 1
Restore Data_Level1 ;Set data pointer to level 1
Case 2
Restore Data_Level2 ;Set data pointer to level 2
Case 3
Restore Data_Level3 ;Set data pointer to level 3
Default
RuntimeError("Error: Level " + lvl + " doesn't exist!")
End Select
;Read in the level width and height
Read LevelWidth ;Width of level in tiles
Read LevelHeight ;Height of level in tiles
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) ;Dimension grid that describes the game level at this time
;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 ;If player is near left edge of level then
ScreenX = 0 ; set the screen all the way left and
PlayerX = startX * 40 + 20 ; set players x starting pos
ElseIf startX > LevelWidth - 12 ;If player is near right edge of level then
ScreenX = LevelWidth * 40 - 640 ; set the screen all the way right, minus screen width and
PlayerX = startX * 40 - ScreenX + 20 ; set players x starting pos minus screen pos
Else ;If player isn't near left/right edges of level then
ScreenX = startX * 40 - 200 ; set the screen 5 tiles to the left of player and
PlayerX = 220 ; set the players x starting position at 220
EndIf
If startY < 4 ;If player is near top edge of the level then
ScreenY = 0 ; set the screen at the top and
PlayerY = (startY + 1) * 40 ; set players y starting pos
ElseIf startY > LevelHeight - 9 ;If player is near the bottom edge of the level then
ScreenY = LevelHeight * 40 - 480 ; set the screen all the way down, minus screen height and
PlayerY = (startY + 1) * 40 - ScreenY ; set players y starting position minus screen pos
Else ;If player isn't near top/bottom edges of level then
ScreenY = (startY + 1) * 40 - 160 ; set the screen 4 tiles above the player and
PlayerY = 160 ; set the players y starting position at 160
EndIf
MaxScreenX = 40 * LevelWidth - 640 - 1 ;Set the screens maximum x position
MaxScreenY = 40 * LevelHeight - 480 ;Set the screens maximum y position
;Read in the screen clearing color
Read clscol
If clscol = 1
ClsColor 100, 110, 200 ;Set cls color to sky color
Else
ClsColor 0, 0, 0 ;Set cls color to black
EndIf
;Read in exit data
Read NumExits ;Read in number of exits in the level
If NumExits > 10 Or NumExits < 1 Then RuntimeError("Error: Level " + lvl + " data is corrupt!")
Dim LevelExit(NumExits, 4) ;Dimension LevelExit array at this time
For iter = 1 To NumExits ;Iterate through the exits
Read LevelExit(iter, 0) ;Read the exits x position
Read LevelExit(iter, 1) ;Read the exits y position
Read LevelExit(iter, 2) ;Read which level the exit links to
Read LevelExit(iter, 3) ;Read new x pos on new level
Read LevelExit(iter, 4) ;Read new y pos on new level
Next
;Read in level data
For yIter = 0 To LevelHeight-1 ;Loop from top to bottom
For xIter = 0 To LevelWidth-1 ;Loop from left to right
Read Level(xIter, yIter) ;Read in tile data for each xIter, yIter location
If Level(xIter, yIter) > maxTile Or Level(xIter, yIter) < 0 Then RuntimeError("Error: Level " + lvl + " data is corrupt!")
Next
Next
;Reset some game variables
XVel = 0 ;Reset players velocitys or he'll keep on moving
YVel = 0 ; when entering into the next level
End Function
;Tile descriptions
;0 blank ;passable tile
;1 sky ;passable tile
;2 cloud ;passable tile
;3 background object ;passable tile
;4 solid block ;nonpassable tile
;5 soft block ;nonpassable tile
;6 grass ;nonpassable tile
.Data_Level1
;Level 1 description
Data 80, 12 ;Level width, height
Data 1 ;cls color = sky
Data 2 ;number of exits in this level
Data 76, 10, 2, 56, 8 ;exit location x, y; level number; start location x, y
Data 36, 9, 3, 1, 2 ;exit location x, y; level number; start location 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 ;Level width, height
Data 1 ;cls color = sky
Data 3 ;number of exits in this level
Data 55, 8, 1, 75, 10 ;exit location x, y; level number; start location x, y
Data 27, 7, 0, 0, 0 ;exit location x, y; ends game; start locations irrelevant
Data 22, 14, 3, 17, 12 ;exit location x, y; level number; start location 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 ;Level width, height
Data 0 ;cls color = black
Data 1 ;number of exits in this level
Data 17, 2, 1, 37, 7 ;exit location x, y; level number; start location 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
Now create a loop that updates the screen every frame. Add all of the remaining code inside of the loop where the comment is.
Gametimer = CreateTimer(60) ;Set and start the game timer (60 fps) ;Start game loop Repeat ;Start of the main loop WaitTimer Gametimer ;Wait for the timer to tick ;insert additional code here Until KeyHit(1) ;Repeats main loop until the user presses the Esc key End ;Ends the program
Collect the user inputs:
;Collect user input ;UpKey = KeyDown(200) ;Up arrow ;It's a good practice to collect these inputs only once ;DownKey = KeyDown(208) ;Down arrow ; per game loop. This will prevent odd behaviors from happening, LeftKey = KeyDown(203) ;Left arrow ; for instance if the state of a key changes between multiple RightKey = KeyDown(205) ;Right arrow ; checks of that key while still in the same loop. JumpKey = KeyDown(57) ;Spacebar FastKey = KeyDown(42) ;Left Shift key
Now apply the inputs to the players character and then figure out just how far the player will move that frame. This is kind of complex so I'll just let you read the included comments to figure out what's going on.
;Apply input forces to players position YVel = YVel + .1 ;Add slight downward y movement (a positive number simulates gravity) If YVel > 19 Then YVel = 19 If RightKey ;Check if the right key is being pressed If FastKey ;Check if the fast key is also being pressed If XVel < 7 Then XVel = XVel + .1 ; if so, then increase velocity up to 7 pixels/frame Else If XVel < 4 Then XVel = XVel + .1 ; if not, then only increase up to 4 pixels/frame If XVel > 4 Then XVel = XVel - .1 ;If FastKey isn't held down, then slow down if necessary EndIf Else If XVel > 0 Then XVel = XVel * .8 ;If right isn't held, then gradually slow down EndIf If LeftKey ;Check if the left key is being pressed If FastKey ;Check if the fast key is also being pressed If XVel > -7 Then XVel = XVel - .1 ; if so, then increase velocity up to -7 pixels/frame Else If XVel > -4 Then XVel = XVel - .1 ; if not, then only increase up to -4 pixels/frame If XVel < -4 Then XVel = XVel + .1 ;If FastKey isn't held down, then slow down if necessary EndIf Else If XVel < 0 Then XVel = XVel * .8 ;If left isn't held then gradually slow down EndIf If JumpKey And JumpKeyDown = False ;Check if jump key pressed (but only if it's been released) If AbleToJump = True ;If player is able to jump (i.e. on a platform) AbleToJump = False ;Set AbleToJump to false because player is now jumping YVel = YVel - 19 ;Set vertical velocity to -19 to cause the player to move up JumpKeyDown = True ;Set true so player can't jump again until JumpKey is released EndIf ElseIf (Not JumpKey) And (AbleToJump = True) ;If JumpKey isn't pressed and player is on a platform JumpKeyDown = False ; then set JumpKeyDown to false so that player can jump again EndIf If AbleToJump = False ;If not on a platform... If YVel < 19 Then YVel = YVel + .9 ;then apply gravity but not more than maximum velocity If Not JumpKey And YVel<19 Then YVel=YVel+1 ;If player let go of JumpKey early then EndIf ; increase downward velocity to make player not jump as high ;Now attempt to move the player by the amounts determined above ;Attempt to move the player in Y MoveSuccessful = False ;Reset MoveSuccessful to false TileX = Floor((ScreenX+PlayerX-18+4*(YVel<0))/40) ;Figure out tile that player is on (+/- 4 if moving up in Y) TileXR = Floor((ScreenX+PlayerX+18-4*(YVel<0))/40) ;Figure out tile to right of player as well Repeat ;Attempt to move the player in Y as far as possible If YVel < 0 ;If attempted move is up then TileY = Floor((ScreenY+PlayerY+YVel+5)/40)-2 ; set the tile above as tile to check against ElseIf YVel > 0 ;Else if attempted move is down then If (ScreenY+PlayerY) Mod 40 < 0.5 And (ScreenY+PlayerY) Mod 40 > -0.5 ;Even with tile? TileY = Floor((ScreenY+PlayerY+YVel)/40) ; set the tile below as tile to check against Else TileY = Floor((ScreenY+PlayerY+YVel-.5)/40) ; set the tile below as tile to check against EndIf Else ;If YVel = 0 (not moving up/down) then MoveSuccessful = True ; exit loop because player isn't moving in Y TileY = Floor((ScreenY+PlayerY+YVel)/40);Still need to set TileY though EndIf If TileY=>LevelHeight Then GameOver=True ;If player falls out of level then end the game If TileY > -1 And TileY < LevelHeight ;Verify that TileY won't be out of range in the following comparisons If Level(TileX,TileY)<4 And ((Level(TileXR,TileY)<4) Or (((ScreenX+PlayerX+20) Mod 40)=0));Check tile below < 4 PlayerY = PlayerY + YVel ;If TileY is an empty tile (< 4 in this example) then allow player to move If YVel > 0 Then AbleToJump = False ;Player is falling so don't allow jumping MoveSuccessful = True ;Exit the loop, successfully moved player EndIf EndIf If MoveSuccessful = False ;If attempted move failed, try again with smaller movement If YVel > 0 ;If attempted move is down then YVel = YVel - .5 ; make vertical velocity less (closer to zero) If YVel < 0 Then YVel = 0 ; but don't overdo it! AbleToJump = True ;Set AbleToJump to True because player will be landing PlayerY = Floor(PlayerY) ;Remove any decimal amount so player will be level with the surface Else ;Else if attempted move is up then YVel = YVel + .5 ; make vertical velocity less (closer to zero) If YVel > 0 Then YVel = 0 ; but don't overdo it! EndIf EndIf Until MoveSuccessful = True ;Try, try again, until succeed at moving player (even if only 0) ;Attempt to move the player in X MoveSuccessful = False ;Reset MoveSuccessful to false TileY = ScreenY + PlayerY ;Figure out in advance for convenience Repeat ;Attempt to move the player in X as far as possible If XVel > 0 ;If attempted move is to the right then TileX = Floor((ScreenX+PlayerX+XVel-21)/40)+1; set the tile to the right as tile to check against ElseIf XVel < 0 ;Else if attempted move is to the left then TileX = Floor((ScreenX+PlayerX+XVel-20)/40) ; set the tile to the left as tile to check against Else ;If XVel = 0 (not moving in either direction) then MoveSuccessful = True ; exit loop because player isn't moving in X EndIf If TileX>-1 And TileX<LevelWidth And GameOver=False;Verify TileX/TileY wont be out of range in following comparisons If Level(TileX,Floor((TileY+35)/40)-2)<4 And Level(TileX,Floor(TileY/40)-1)<4;Check if both side tiles are empty (<4) If ((Level(TileX, Floor(TileY/40)) < 4) Or ((TileY Mod 40 < .4) And (TileY Mod 40 > -.4)));Check if tile below is empty too (unless PlayerX = PlayerX + XVel ; the player is perfectly aligned with the tiles); If so, then move the player over If PlayerX < 0 Then PlayerX = 0 ;Player can't move offscreen! MoveSuccessful = True ;Exit the loop, successfully moved player EndIf EndIf EndIf If MoveSuccessful = False ;If attempted move failed, try again with smaller movement If XVel > 0 ;If attempted move is to the right then XVel = XVel - .5 ; make horizontal velocity less (closer to zero) If XVel < 0 Then XVel = 0 ; but don't overdo it! Else ;Else if attempted move is to the left then XVel = XVel + .5 ; make horizontal velocity less (closer to zero) If XVel > 0 Then XVel = 0 ; but don't overdo it! EndIf EndIf Until MoveSuccessful ;Try, try again, until succeed at moving player (even if only 0)
Adjust the screen to make sure the player is still onscreen:
;Update screen position If PlayerX > 400 ;If player is moving too close to the right side of the screen ScreenX = ScreenX + (PlayerX - 400) ; then move the screen over the same amount as the player moved If ScreenX > MaxScreenX ;However, if the screen is past the rightmost limit then ScreenX = MaxScreenX ; just set it to the rightmost limit Else ;But if the screen CAN move right then PlayerX = 400 ; set the players X position back to 400 EndIf EndIf If PlayerX < 200 ;If player is moving too close to the left side of the screen ScreenX = ScreenX - (200 - PlayerX) ; then move the screen over the same amount as the player moved If ScreenX < 0 ;However, if the screen is past the leftmost limit then ScreenX = 0 ; just set it to the leftmost limit Else ;But if the screen CAN move left then PlayerX = 200 ; set the players X position back to 200 EndIf EndIf If PlayerY > 400 ;If player is moving too close to the bottom of the screen ScreenY = ScreenY + (PlayerY - 400) ; then move the screen down the same amount as the player moved If ScreenY > MaxScreenY ;However, if the screen is past the bottommost limit then ScreenY = MaxScreenY ; just set it to the bottommost limit Else ;But if the screen CAN move down then PlayerY = 400 ; set the players Y position back to 400 EndIf EndIf If PlayerY < 160 ;If player is moving too close to the top of the screen ScreenY = ScreenY - (160 - PlayerY) ; then move the screen up the same amount as the player moved If ScreenY < 0 ;However, if the screen is past the topmost limit then ScreenY = 0 ; just set it to the topmost limit Else ;But if the screen CAN move up then PlayerY = 160 ; set the players Y position back to 160 EndIf EndIf
Now go ahead and draw the screen and then flip it:
;Draw the level TileX = ScreenX/40 ;Figure out the starting tile to draw XOffset = ScreenX Mod 40 ;Figure out how much to offset each tile TileY = ScreenY/40 ;Figure out the starting tile to draw YOffset = ScreenY Mod 40 ;Figure out how much to offset each tile For yIter = TileY To TileY+12 ;Loop from top to bottom For xIter = TileX To TileX+16 ;Loop from left to right If xIter > -1 And xIter < LevelWidth And yIter > -1 And yIter < LevelHeight Tile = Level(xIter, yIter) ;Get tile from the Level array DrawImage tileImages, (xIter-TileX)*40-XOffset, (yIter-TileY)*40-YOffset, Tile EndIf Next Next ;Flip the screen Flip ;Flip backbuffer to the front Cls ;Clear the screen (backbuffer) (with ClsColor)
Check if the player is standing on a level exit, and if so, transport him to the next level:
;Check if player is standing at a level exit TileX = PlayerX+ScreenX TileY = PlayerY+ScreenY For iter = 1 To NumExits If Int(TileX/40) = LevelExit(iter, 0) ;Check if players x pos. = the exits x pos. If Abs(20-(TileX Mod 40)) < 5 ;Check if player is covering up most of the exit (within 5 pixels) If Int(TileY/40-1) = LevelExit(iter, 1) ;Check if players y pos. = the exits y pos. CurLevel = LevelExit(iter,2);Change current level to new level If CurLevel = 0 ;Reached end of game? GameOver = 2 ; if so, then quit Else ; if not, then load next level LoadLevel(CurLevel, LevelExit(iter, 3), LevelExit(iter, 4));level, x, y EndIf Exit ;A level exit was found, no need to check for others EndIf EndIf EndIf Next
Lastly, if GameOver was set to true earlier in the loop then end the game!
;Check if game is over If GameOver ;The following code is just used here in this example Color 150, 20, 20 Rect 270, 220, 100, 60 ;Draw a red rectangle in the middle of the screen Color 250, 250, 250 If GameOver = 2 Text 320, 250, "You Win!", True, True ;Draw You Win! into the rectangle Else Text 320, 250, "Game Over", True, True ;Draw Game Over into the rectangle EndIf Flip Repeat ;Repeats until the user Until KeyHit(1) ; presses the Esc key End ; and ends the program EndIf
And here is the entire code pieced together so that you can copy&paste it
and immediately run it to see how it works.
|
|
| If you've reached this page and there's no index on the left, Click here to show the Index Page | |