Simple tennis

Programmation avancée de jeux en PureBasic
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Simple tennis

Message par Ollivier »

Le but c'est de faire des points. Chaque rebond de balle sur une raquette rajoute un cumul de points égal au nombre de balles présentes à l'écran au moment du rebond.

Tous les cent points, une nouvelle balle apparaît.

La partie est perdue s'il reste moins de deux balles à l'écran.

La roulette de la souris permet de changer le mode de déplacement des raquettes:
Mode 1: (Raquettes noires) Mode "symétrique"
Mode 2: (Raquettes bleues) Mode "jongleur d'élite"

Si quelqu'un connaît le nom du jeu original hautement mieux fait, qu'il n'hésite pas à le préciser. Je l'avais trouvé très bien.

Code : Tout sélectionner


   ExamineDesktops()
   
   DW = DesktopWidth(0)
   DH = DesktopHeight(0)
   DD = DesktopDepth(0)
   
   InitSprite()
   InitMouse()
   OpenScreen(DW, DH, DD, "")
   LoadFont(0, "courier new", 32)
   CreateSprite(0, DW, DH)
   CreateSprite(1, 16, 16)
   StartDrawing(SpriteOutput(1) )
      Circle(8, 8, 8, #White)
   StopDrawing()
   
   CreateSprite(2, 128, 16)
   StartDrawing(SpriteOutput(2) )
      Box(0, 0, 128, 16, #White)
      Box(2, 2, 124, 12, #Blue)
   StopDrawing()
   CreateSprite(3, 128, 16)
   StartDrawing(SpriteOutput(3) )
      Box(0, 0, 128, 16, #White)
      Box(2, 2, 124, 12, #Black)
   StopDrawing()
   Nb = 19
   Qty = 7
   Dim Ok.I(Nb)
   Dim BX.F(Nb)
   Dim BY.F(Nb)
   Dim BA.F(Nb)
   Dim BV.F(Nb)
   Lap = 100
   For I = 0 To 6
      Ok(I) = 1
      BX(I) = DW / 2.0
      BY(I) = DH / 2.0
      BA(I) = Random(628) / 100.0
      BV(I) = 4 + Random(40) / 10.0
   Next
   
   Repeat
      Delay(1)
      ExamineMouse()
      MDX = MouseDeltaX()
      MDY = MouseDeltaY()
      Opt = (Opt + MouseWheel() ) & 1
      DisplaySprite(0, 0, 0)
      For I = 0 To Nb
         If Ok(I)
            BX.F = BX(I)
            BY.F = BY(I)
            BA.F = BA(I)
            BV.F = BV(I)
            DisplaySprite(1, BX, BY)
            BX + Cos(BA) * BV
            BY + Sin(BA) * BV
            If (BX + 16 => (DW - 1) ) Or (BX <= 0) 
               BA = (#PI / 2.0 - BA) + #PI / 2.0 + Random(1) / 157.0
            EndIf
            If (BY <= 0)
               BA = (#PI - BA) + #PI
            EndIf
            If BY > (DH - 1.0)
               Ok(I) = 0
               Qty - 1
               If Qty <= 2
                  Break 2
               EndIf     
            EndIf
            If (BY + 16) => (DH - 18)
               Deca = -DW
               For J = 0 To 1
                  If (BX + 32 > (RX + Deca) ) And (BX - 16 < (RX + Deca) + 128)
                     BA = ((#PI - Modif) - BA) + #PI
                     BY = DH - 58
                     Score + Qty
                     If Score => Lap
                        Lap + 100
                        New = 1
                     EndIf
                  EndIf
                  Deca + DW
               Next
            EndIf
            If (BY + 16) => (DH - 38)
               Deca = - DW
               For J = 0 To 1
                  If (BX + 32 > (RX2 + Deca) ) And (BX - 16 < (RX2 + Deca) + 128)
                     BA = ((#PI - Modif) - BA) + #PI
                     BY = (DH - 78)
                     Score + Qty
                     If Score => Lap
                        Lap + 100
                        New = 1
                     EndIf
                  EndIf
                  Deca + DW
               Next
            EndIf
            DisplaySprite(2 + Opt, RX, (DH - 18.0) )
            DisplaySprite(2 + Opt, RX - DW, (DH - 18.0) )
            DisplaySprite(2 + Opt, RX2, (DH - 38.0) )
            DisplaySprite(2 + Opt, RX2 - DW, (DH - 38.0) )
            BX(I) = BX
            BY(I) = BY
            BV = BV * 1.0001
            BV(I) = BV
            BA(I) = BA
         Else
            If New
               Qty + 1
               Ok(I) = 1
               BX(I) = DW / 2.0
               BY(I) = DH / 2.0
               BA(I) = Random(628) / 100.0
               BV(I) = 4 + Random(40) / 10.0
               New = 0
            EndIf
         EndIf
      Next
      RX + MDX << 2
      If RX => DW: RX - DW: EndIf
      If RX < 0: RX + DW: EndIf
      If Opt
         RX2 = DW - RX - 128
      Else
         RX2 + MDY << 2
      EndIf
      If RX2 => DW: RX2 - DW: EndIf
      If RX2 < 0: RX2 + DW: EndIf
      StartDrawing(ScreenOutput() )
         DrawingFont(FontID(0) )
         DrawText(0, 0, Str(Score) )
      StopDrawing()
      FlipBuffers()
   Until MouseButton(2)
   CloseScreen()
   MessageRequester("Score", Str(Score) + " points")
   
Dernière modification par Ollivier le sam. 20/juin/2009 12:46, modifié 9 fois.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Message par Cool Dji »

C'est pas mal le concept d'avoir plus de points s'il reste plus de balles
bon, j'ai pas eu la patience d'attendre de perdre pour arrêter :oops:

Tu as joué combien de temps pour avoir 4000 points ?
Only PureBasic makes it possible
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Faut pas hésiter à stopper le jeu et recommencer pour maintenir les sept balles de départ. Les points arrivent alors vite, donc les nouvelles balles aussi (tous les 100 points). En te maintenant une douzaine de balles, tu vires les plus chiantes et tu maintiens le reste pendant un quart d'heure et poum, 4000 points!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

juste un petit reproche !

ici on est plusieurs a ne pas utiliser une resolution standard de 1024X768

ce serai bien de mettre du code qui soit capable de s'adapter :)

pas envie de modifier pour mon netbook (1024X600)

il me semble qu'un petit

Code : Tout sélectionner

ecranx = GetSystemMetrics_(#SM_CXSCREEN)
ecrany = GetSystemMetrics_(#SM_CYSCREEN)
ne serai pas de trop :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Dobro

Désolé! Un réflexe de PurePunch...

J'ai fait les modifications pour prendre la résolution du bureau. Merci!

Ollivier
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

244 points à vive allure( voir plus bas)

Après une brève recherche: Balls Seven

Le comportement raquette/balle est à travailler. Contrôler une deuxième raquette serait peut être une bonne idée. :)

Tu utilise un delay et un timer, alors que Fred à tout mis dans flipbuffer(), surtout avec la dernière mise à jour. Mais je ne veux pas relancer le débat, hum. Mais sache quand même que si je désactive les lignes suivantes:

Code : Tout sélectionner

;      Delay(1)
;      Repeat
;         Timer = ElapsedMilliseconds()
;      Until Timer > Delayed
 ;     Delayed = Timer + 16
ton jeu est ainsi beaucoup plus rapide, tout en étant très fluide, et testé sur mon vieux coucou qui plus est. :D

ps: tes codes purepunch déchirent, tu es aussi doué que tonton, ce qui n'est pas une mince performance !
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ma foi, si tu veux deux raquettes, ben j'en mets deux, mais là, tu vas jongler: moi, je perds toutes mes balles!

J'ai enlevé la synchro si tu dis que c'est ok sur 4.31, je te fais confiance. S'il y a quelqu'un chez qui c'est trop rapide, je la remettrai...
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

bonus multiball et double raquette permanent, cool

Message par beauregard »

Ollivier a écrit :Ma foi, si tu veux deux raquettes, ben j'en mets deux, mais là, tu vas jongler: moi, je perds toutes mes balles!
heu... non. Une petite modif du code corrigé par ollivier:

Code : Tout sélectionner

; 2 raquettes: mode d'emploi
   ExamineDesktops()
   
   DW = DesktopWidth(0)
   DH = DesktopHeight(0)
   DD = DesktopDepth(0)
   RX=DW/2 ; raquette 1
   RX2=DW/2 ; raquette 2
   
   InitSprite()
   InitMouse()
   OpenScreen(DW, DH, DD, "")
   LoadFont(0, "courier new", 32)
   CreateSprite(0, DW, DH)
   CreateSprite(1, 128, 16)
   StartDrawing(SpriteOutput(1) )
      Box(0, 0, 128, 16, RGB(0,0,255));#White)
      Box(2, 2, 128-4, 16-4, RGB(0,0,0))
   StopDrawing()
   CreateSprite(11, 128, 16)
   StartDrawing(SpriteOutput(11) )
      Box(0, 0, 128, 16, RGB(255,0,0));#White)
      Box(2, 2, 128-4, 16-4, RGB(0,0,0))
   StopDrawing()

   CreateSprite(2, 16, 16)
   StartDrawing(SpriteOutput(2) )
      Circle(8, 8, 8, #White)
   StopDrawing()
   
   Nb = 19
   Qty = 7
   Dim Ok.I(Nb)
   Dim BX.F(Nb)
   Dim BY.F(Nb)
   Dim BA.F(Nb)
   Dim BV.F(Nb)
   Lap = 100
   For I = 0 To 6
      Ok(I) = 1
      BX(I) = DW / 2.0
      BY(I) = DH / 2.0
      BA(I) = Random(628) / 100.0
      BV(I) = 4 + Random(40) / 10.0
   Next
   
   Repeat
      Delay(1)
      ExamineMouse()
      MDX = MouseDeltaX()
      MDY = MouseDeltaY()
      If Abs(MDX) => Abs(MDY)
         MDY = 0
      Else
         MDX = 0
      EndIf
      DisplaySprite(0, 0, 0)
      For I = 0 To Nb
         If Ok(I)
            BX.F = BX(I)
            BY.F = BY(I)
            BA.F = BA(I)
            BV.F = BV(I)
            DisplaySprite(2, BX, BY)
            BX + Cos(BA) * BV
            BY + Sin(BA) * BV
            If (BX + 16 => (DW - 1) ) Or (BX <= 0)
               BA = (#PI / 2.0 - BA) + #PI / 2.0 + Random(1) / 157.0
            EndIf
            If (BY <= 0)
               BA = (#PI - BA) + #PI
            EndIf
            If BY > (DH - 1.0)
               Ok(I) = 0
               Qty - 1
               If Qty <= 1
                  Break 2
               EndIf     
            EndIf
            ;- raquette 1
            If (BY + 16) => (DH - 18)
               Deca = -DW
               For J = 0 To 1
                  If (BX + 32 > (RX + Deca) ) And (BX - 16 < (RX + Deca) + 128)
                     BA = ((#PI - Modif) - BA) + #PI
                     BY = DH - 58
                     Score + Qty
                     If Score => Lap
                        Lap + 100
                        New = 1
                     EndIf
                  EndIf
                  Deca + DW
               Next
            EndIf
            ;- raquette 2
            If (BY + 16) => (DH - 18);38)
               Deca = - DW
               For J = 0 To 1
                  If (BX + 32 > (RX2 + Deca) ) And (BX - 16 < (RX2 + Deca) + 128)
                     BA = ((#PI - Modif) - BA) + #PI
                     BY = (DH - 58);78)
                     Score + Qty
                     If Score => Lap
                        Lap + 100
                        New = 1
                     EndIf
                  EndIf
                  Deca + DW
               Next
            EndIf
            DisplaySprite(1, RX, (DH - 38.0) )
            DisplaySprite(1, RX - DW, (DH - 38.0) )

            DisplaySprite(11, -RX, (DH - 18.0) )
            DisplaySprite(11, -(RX - DW), (DH - 18.0) )
            ;DisplaySprite(1, RX2, (DH - 38.0) )
            ;DisplaySprite(1, RX2 - DW, (DH - 38.0) )
            
            BX(I) = BX
            BY(I) = BY
            BV = BV * 1.0001
            BV(I) = BV
            BA(I) = BA
         Else
            If New
               Qty + 1
               Ok(I) = 1
               BX(I) = DW / 2.0
               BY(I) = DH / 2.0
               BA(I) = Random(628) / 100.0
               BV(I) = 4 + Random(40) / 10.0
               New = 0
            EndIf
         EndIf
      Next
      
      RX + MDX << 2
      If RX => DW: RX - DW: EndIf
      If RX < 0: RX + DW: EndIf
      
      RX2 = DW - RX
      If RX2 => DW: RX2 - DW: EndIf
      If RX2 < 0: RX2 + DW: EndIf
      
      StartDrawing(ScreenOutput() )
         DrawingFont(FontID(0) )
         DrawText(0, 0, Str(Score) )
      StopDrawing()
      FlipBuffers()
   Until MouseButton(2)
   CloseScreen()
   MessageRequester("Score", Str(Score) + " points")
   
Ollivier a écrit :J'ai enlevé la synchro si tu dis que c'est ok sur 4.31, je te fais confiance. S'il y a quelqu'un chez qui c'est trop rapide, je la remettrai...
faut passer à la 4.31, Djes est de bon conseil:
http://www.purebasic.fr/french/viewtopi ... ght=#99336
Dernière modification par beauregard le sam. 20/juin/2009 11:32, modifié 2 fois.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Euh t'avais juste à remplacer la ligne contenant

Code : Tout sélectionner

RX2 + MDY << 2
par

Code : Tout sélectionner

RX2 = DW - RX
et la gestion des collisions prenait le relais!

Et sinon j'ai la 4.31.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Ollivier a écrit :Euh t'avais juste à remplacer la ligne contenant

Code : Tout sélectionner

RX2 + MDY << 2
par

Code : Tout sélectionner

RX2 = DW - RX
et la gestion des collisions prenait le relais!

Et sinon j'ai la 4.31.
j'ai apporté la petite modif, et mis une couleur différencié pour les raquettes.... au début, c'est un peu déconcertant, mais on s'y fait rapidement, et toucher 2 balles situées d'un bout à l'autre de l'écran est assez jouissif. :D
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bon j'ai mis à jour ta modif. En fait, les deux modes sont dispo: on les choisit avec la roulette de la souris.
Répondre