. Comment afficher un sprite ?
. Comment gérer le déplacement d'un sprite ?
. Comment gérer les collisions ?
Ces quatre fonctionnalités seront incluses dans le code commenté ci-dessous.
Nous utiliserons successivement
■ LoadSprite() pour charger une texture représentant un sprite.
■ DisplaySprite() pour afficher un sprite dans un systéme de coordonnées x, y.
■ SpriteCollision() pour gérer les collisions entres deux sprites.
La gestion du déplacement des touches ◄- et -► est assurée par la fonction KeyboardPushed(). Cette fonctionnalité devra être au préalable initialisé par la fonction ExamineKeyboard().
Code : Tout sélectionner
Enumeration
#MainForm
EndEnumeration
;Sprite Background & mur
Global BackGround, Wall
;Sprite Ball: Position x & y de la ball et Velocité
Global Ball, BallX=400, BallY=100, VelocityY = 5
;Sprite Raquette: Position x & y de la raquette
Global Racket, RacketX=400, RacketY=500
;Cette procédure permet de charger les textures de chacun des sprites.
Procedure GamePreload()
UseJPEGImageDecoder()
;Chargement du background
Background = LoadSprite(#PB_Any, #PB_Compiler_Home +"Examples\3D\Data\Textures\soil_wall.jpg")
ZoomSprite(BackGround, 800, 600) ;On lui donne la taille de la fenetre
;Chargement de la texture représentant les murs
Wall = LoadSprite(#PB_Any, #PB_Compiler_Home +"Examples\3D\Data\Textures\RustySteel.jpg")
ZoomSprite(Wall, 800, 20) ;On donne une dimension car la texture est trop grande
;Chargement de l'image représentant la racket
Racket = LoadSprite(#PB_Any, #PB_Compiler_Home +"Examples\3D\Data\Textures\Wood.jpg")
ZoomSprite(Racket, 100, 20) ;On donne une dimension car la texture est trop grande
;Chargement de l'image représentant la ball
Ball = LoadSprite(#PB_Any, #PB_Compiler_Home +"Examples\3D\Data\Textures\grass.jpg")
ZoomSprite(Ball, 32, 32) ;On donne une dimension car la texture est trop grande
EndProcedure
;Cette procédure va mettre à jour la position des sprites. Elle est appelé depuis la boucle évenementielle.
Procedure GameUpdate()
;Evenements clavier
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
RacketX - 5 ;Déplacement de la raquette à gauche
EndIf
If KeyboardPushed(#PB_Key_Right)
RacketX + 5 ;Déplacement de la raquette à droite
EndIf
;Déplacement verical de la ball
BallY + VelocityY
;Mise à jour de l'affichage
DisplaySprite(BackGround, 0, 0) ;Background
DisplaySprite(Wall, 0, 0) ;Mur haut
DisplaySprite(Ball, BallX, BallY) ;Ball
DisplaySprite(Racket, RacketX, RacketY) ;Racket
;Collision de la ball avec la racket ou le mur du haut
If SpriteCollision(Ball, BallX, BallY, Racket, RacketX, RacketY) Or
SpriteCollision(Ball, BallX, BallY, Wall, 0, 0)
VelocityY * -1 ;Inversion de la vélocité de la ball
EndIf
EndProcedure
Procedure GameStart()
Protected Width = 800
Protected Height = 600
;Environnement 2D
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 And InitSound() = 0
MessageRequester("Error", "Sprite system can't be initialized", 0)
End
EndIf
;Fenetre
If OpenWindow(#mainform, 0, 0, Width, Height, "2D Tutoriel", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(#mainform), 0, 0, Width, Height)
GamePreload()
EndIf
EndIf
;Boucle evenementielle
Repeat
Repeat
Event = WindowEvent()
Select event
Case #PB_Event_CloseWindow
End
EndSelect
Until event=0
FlipBuffers()
ClearScreen(RGB(0,0,0))
GameUpdate()
Until KeyboardPushed(#PB_Key_Escape)
EndProcedure
GameStart()
Attention, je ne gère pas le rebond de la ball en fonction de l'origine du départ de la ball et du point d'impact.