VENOMWORLD

Pong 2016

Voici une représentation du célèbre Pong. Je lui ai apporté une petite touche de modernité en terme graphique. Même si je ne suis pas un pro du graphisme. Le jeu ne comporte pas encore d’IA. Un joueur se sert des flèches haut et bas, et l’autre des touches clavier Z et S. Le premier à 10 gagne la partie.

Pour plus de « punch » dans la partie, la balle ne sort pas de l’écran. Elle rebondi simplement dessus mais les points y sont comptés. Cela permet de jouer en « non-stop » tout le long de la manche.

Code source

; ///////////////////////////////////////////////
; //      Autor :         Venom                //
; //      Project name :  Pong 2016            //
; //      Version :       V 1.0                //
; //      Compilator :    PureBasic V5.41      //
; //      Date :          22/03/2016           //
; //      OS :            Windows 10           //
; ///////////////////////////////////////////////


;- Window Constants
Enumeration
  #Window_0
EndEnumeration


;- Gadgets Constants
Enumeration
  #Fond
  #Ball
  #Raquette1H
  #Raquette1B
  #Raquette2H
  #Raquette2B
  #BarreH
  #BarreB
  #BlocCentral
  
  #Alphabet
  #Alphabet32
  
  #SonCollision
  #SonCollisionRaquette
  #SonOver
EndEnumeration


;- Activation des supports png etc...
UsePNGImageDecoder()


;- Chemin vers les differants fichiers
Cheminimages$ = "gfx\"
Cheminisons$ = "sfx\"

     
;-  On déclare les procedures
Declare AfficheText(ID, PosX, PosY, Text$, Hauteur, Transparence)


;- Initialisation environnement sprite
  If InitSprite() = 0
    MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
    End
  EndIf
  
  
;- Initialisation environnement clavier
  If InitKeyboard() = 0
    MessageRequester("Erreur", "Impossible d'initialisé le clavier !", 0)
    End
  EndIf
  
  
;- Initialisation environnement son
  If InitSound() = 0
    MessageRequester("Erreur", "Impossible d'initialisé le son", 0)
    End
  EndIf


;- on initialise les differantes tailles / positions de la fenetre et des sprites
  LargeurFenetre = 800
  HauteurFenetre = 450
  
  PosXRaquette1 = LargeurFenetre-40
  PosYRaquette1 = HauteurFenetre/2-50 
  
  PosXRaquette2 = 20
  PosYRaquette2 = HauteurFenetre/2-50
  
  PosXBall = LargeurFenetre/2-10
  PosYBall = 20
  
  VitesseBall = 7
  DirectionX = VitesseBall
  DirectionY = VitesseBall
  
  ScoreGaucheDemarrage = 0
  ScoreDroiteDemarrage = 0
  
;- on ouvre la fenetre
If OpenWindow(#Window_0, 0, 0, LargeurFenetre, HauteurFenetre, "Pong 2016", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    If OpenWindowedScreen(WindowID(#Window_0), 0, 0, LargeurFenetre, HauteurFenetre)
;- on charge les images
      LoadSprite(#Fond, Cheminimages$+"fond.png", 0)
      LoadSprite(#Ball, Cheminimages$+"ball.png", #PB_Sprite_PixelCollision)
      LoadSprite(#Raquette1H, Cheminimages$+"raquette-1H.png", #PB_Sprite_PixelCollision)
      LoadSprite(#Raquette1B, Cheminimages$+"raquette-1B.png", #PB_Sprite_PixelCollision)
      LoadSprite(#Raquette2H, Cheminimages$+"raquette-1H.png", #PB_Sprite_PixelCollision)
      LoadSprite(#Raquette2B, Cheminimages$+"raquette-1B.png", #PB_Sprite_PixelCollision)
      LoadSprite(#BarreH, Cheminimages$+"barreH.png", 0)
      LoadSprite(#BarreB, Cheminimages$+"barreB.png", 0)
      LoadSprite(#BlocCentral, Cheminimages$+"bloc.png", 0)
      
      
;- on charge le sprite alphabetique 64
      LoadSprite(#Alphabet,Cheminimages$+"font x64 white.png", #PB_Sprite_AlphaBlending); on charge le sprite qui contient les caractères
      Global String$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; on ecrit tout les caractères identique au sprite (sa va permettre de connaitre la position des lettres que l'on désire afficher)
      
      
;- on charge le sprite alphabetique 32
      LoadSprite(#Alphabet32,Cheminimages$+"font x32 white.png", #PB_Sprite_AlphaBlending); on charge le sprite qui contient les caractères
      Global String$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; on ecrit tout les caractères identique au sprite (sa va permettre de connaitre la position des lettres que l'on désire afficher)
      
      
;- on charge les sons
      LoadSound(#SonCollision, Cheminisons$+"collision.wav")
      SoundVolume(#SonCollision, 10)
      LoadSound(#SonCollisionRaquette, Cheminisons$+"collision raquette.wav")
      SoundVolume(#SonCollisionRaquette, 10)
      LoadSound(#SonOver, Cheminisons$+"game over.wav")
      SoundVolume(#SonOver, 20)

   EndIf
   
EndIf 


  Repeat
    ; Il est très important de traiter tous les évènements restants dans la file d'attente à chaque tour
    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
        
        Case #PB_Event_CloseWindow
          End 
      EndSelect
    Until Event = 0
    
   
    ClearScreen(RGB(0, 0, 0))
    ExamineKeyboard()
    KeyboardMode(#PB_Keyboard_International)
    
    
;- on affiche le fond, les barres haute et basse bleu et les blocs central
    DisplaySprite(#Fond, 0, 0)
    DisplaySprite(#BarreH, 0, 0)
    DisplaySprite(#BarreB, 0, 430)
    
    For YBloc = 20 To 415 Step 30
     DisplaySprite(#BlocCentral, LargeurFenetre/2-10, YBloc)
    Next
    
    
;- on affiche la raquette 1 et 2 au démarrage
    DisplayTransparentSprite(#Raquette1H, PosXRaquette1, PosYRaquette1)
    DisplayTransparentSprite(#Raquette1B, PosXRaquette1, PosYRaquette1+50)
    DisplayTransparentSprite(#Raquette2H, PosXRaquette2, PosYRaquette2)
    DisplayTransparentSprite(#Raquette2B, PosXRaquette2, PosYRaquette2+50)
     

;- on appuie sur la touche du haut
    If KeyboardPushed(#PB_Key_Up)
      If PosYRaquette1 > 20
        PosYRaquette1 = PosYRaquette1-5
       ElseIf PosYRaquette1 = 0
        PosYRaquette1 = PosYRaquette1
      EndIf 
    EndIf
    
    
;- on appuie sur la touche du bas
    If KeyboardPushed(#PB_Key_Down)
      If PosYRaquette1 < HauteurFenetre-120
        PosYRaquette1 = PosYRaquette1+5
       ElseIf PosYRaquette1 = HauteurFenetre-100
        PosYRaquette1 = PosYRaquette1
      EndIf 
    EndIf
    
    
;- on appuie sur la touche Z
    If KeyboardPushed(#PB_Key_Z)
      If PosYRaquette2 > 20
        PosYRaquette2 = PosYRaquette2-5
       ElseIf PosYRaquette2 = 0
        PosYRaquette2 = PosYRaquette2
      EndIf 
    EndIf
    
    
;- on appuie sur la touche S
    If KeyboardPushed(#PB_Key_S)
      If PosYRaquette2 < HauteurFenetre-120
        PosYRaquette2 = PosYRaquette2+5
       ElseIf PosYRaquette2 = HauteurFenetre-100
        PosYRaquette2 = PosYRaquette2
      EndIf 
    EndIf
    
    
;- on affiche la balle au démarrage
    TransparentSpriteColor(#Ball, RGB(255, 0, 255))
    DisplayTransparentSprite(#Ball, PosXBall, PosYBall)
    
    
;- gestion des collisions de la balle dans la fenetre en Y  
    PosYBall + DirectionY
    If PosYBall > HauteurFenetre-30
      DirectionY = -VitesseBall
       PlaySound(#SonCollision, 0)
    EndIf
    If PosYBall < 10 
      DirectionY =  VitesseBall
       PlaySound(#SonCollision, 0)
    EndIf 
    
    
;- gestion des collisions de la balle dans la fenetre en X 
    PosXBall + DirectionX
    If PosXBall > LargeurFenetre-20
      DirectionX = -VitesseBall
       PlaySound(#SonOver, 0)
       ScoreGaucheDemarrage = ScoreGaucheDemarrage+1 ; ajoute 1 au score de gauche si la balle touche le mur de droite
    EndIf
    If PosXBall < 0 
      DirectionX =  VitesseBall
       PlaySound(#SonOver, 0)
        ScoreDroiteDemarrage = ScoreDroiteDemarrage+1 ; ajoute 1 au score de droite si la balle touche le mur de gauche
    EndIf
    
    
;- verifie si le score de gauche arrive a 10 pour terminé la manche
    If ScoreGaucheDemarrage = 10
      AfficheText(#Alphabet, LargeurFenetre/2-288, HauteurFenetre/2-32, "GAME OVER", 64, 255); on affiche game over
      AfficheText(#Alphabet32, LargeurFenetre/2-304, HauteurFenetre/2+50, "ESPACE POUR REJOUER", 32, 255); on affiche game over
      PosXBall = LargeurFenetre/2-10
      PosYBall = HauteurFenetre/2-10
      VitesseBall = 0
      PosYRaquette1 = HauteurFenetre/2-50 
      PosYRaquette2 = HauteurFenetre/2-50 
      EndOfGame = #True
    EndIf 
    
    
;- verifie si le score de droite arrive a 10 pour terminé la manche
    If ScoreDroiteDemarrage = 10
      AfficheText(#Alphabet, LargeurFenetre/2-288, HauteurFenetre/2-32, "GAME OVER", 64, 255); on affiche game over
      PosXBall = LargeurFenetre/2-10
      PosYBall = HauteurFenetre/2-10
      VitesseBall = 0
      PosYRaquette1 = HauteurFenetre/2-50 
      PosYRaquette2 = HauteurFenetre/2-50 
      EndOfGame = #True
    EndIf 
    
    
;- gestion de collision avec la raquette H1
    If SpriteCollision(#Ball, PosXBall, PosYBall, #Raquette1H, PosXRaquette1, PosYRaquette1)
      DirectionX = -VitesseBall
      DirectionY = -VitesseBall
      PlaySound(#SonCollisionRaquette, 0)
    EndIf 
;- gestion de collision avec la raquette B1
    If SpriteCollision(#Ball, PosXBall, PosYBall, #Raquette1B, PosXRaquette1, PosYRaquette1+50)
      DirectionX = -VitesseBall
      DirectionY = VitesseBall
      PlaySound(#SonCollisionRaquette, 0)
    EndIf 
    
    
;- gestion de collision avec la raquette H2
    If SpriteCollision(#Ball, PosXBall, PosYBall, #Raquette2H, PosXRaquette2, PosYRaquette2)
      DirectionX = VitesseBall
      DirectionY = -VitesseBall
      PlaySound(#SonCollisionRaquette, 0)
    EndIf 
;- gestion de collision avec la raquette B2
    If SpriteCollision(#Ball, PosXBall, PosYBall, #Raquette2B, PosXRaquette2, PosYRaquette2+50)
      DirectionX = VitesseBall
      DirectionY = VitesseBall
      PlaySound(#SonCollisionRaquette, 0)
    EndIf 
    
    
;- on affiche le score de gauche
    AfficheText(#Alphabet, LargeurFenetre/2-128, 15, Str(ScoreGaucheDemarrage), 64, 255); on appele la procedure avec les options voulu
    
    
;- on affiche le score de droite
    AfficheText(#Alphabet, LargeurFenetre/2+64, 15, Str(ScoreDroiteDemarrage), 64, 255); on appele la procedure avec les options voulu
    
    
;- Reset du jeu via la touche espace. Merci Falsam
    If KeyboardReleased(#PB_Key_Space)
      If EndOfGame = #True

        ScoreGaucheDemarrage = 0
        ScoreDroiteDemarrage = 0
 
        VitesseBall = 6
        
        DirectionX = VitesseBall
        DirectionY = VitesseBall 
        
        PosXBall = LargeurFenetre/2-10
        PosYBall = 0
        
        PosXRaquette1 = LargeurFenetre-40
        PosYRaquette1 = HauteurFenetre/2-50 
  
        PosXRaquette2 = 20
        PosYRaquette2 = HauteurFenetre/2-50

        EndOfGame = #False
      EndIf
    EndIf 


    FlipBuffers()


;- appuie sur la touche echap
  Until KeyboardPushed(#PB_Key_Escape)
  End





;- Procedure pour afficher un texte via le sprite Font  
Procedure AfficheText(ID, PosX, PosY, Text$, Hauteur, Transparence)
For i=1 To Len(Text$)               ; regarde chaque lettre de la chaine (ici PUREBASIC)
 For j=1 To Len(String$)            ; cherche la position de la lettre de la chaine dans le sprite
	If Mid(Text$, i, 1) = Mid(String$, j, 1) ; si on a trouvé,
	 ClipSprite(ID, (j-1)*Hauteur, 0, Hauteur, Hauteur)  ; on selectionne la lettre

	 DisplayTransparentSprite(ID, PosX+i*Hauteur-Hauteur, PosY, Transparence); affiche la lettre dans un sprite
	 j=Len(String$) ; on sort de la boucle de recherche de la lettre dans l'image
	EndIf 
 Next
Next
EndProcedure

N’hésitez pas a me faire part de votre ressenti et/ou critique.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *