2D : Un mur, une raquette et une ball.
Publié : ven. 09/mai/2014 21:40
. Comment charger la texture d'un sprite non animé ?
. 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().N'hésitez pas à consulter l'aide consacrée aux sprites ainsi que l'aide sur les fonctionnalités du clavier en particulier ExamineKeyboard(), KeyboardPushed() quand une touche est pressée et KeyboardReleased() quand une touche est relâchée.
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.
. 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.