Page 1 sur 1

Simple tennis

Publié : ven. 19/juin/2009 1:32
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")
   

Publié : ven. 19/juin/2009 14:25
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 ?

Publié : ven. 19/juin/2009 17:59
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!

Publié : ven. 19/juin/2009 18:28
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 :)

Publié : ven. 19/juin/2009 18:47
par Ollivier
@Dobro

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

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

Ollivier

Publié : ven. 19/juin/2009 22:03
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 !

Publié : sam. 20/juin/2009 6:27
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...

bonus multiball et double raquette permanent, cool

Publié : sam. 20/juin/2009 10:41
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

Publié : sam. 20/juin/2009 11:13
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.

Publié : sam. 20/juin/2009 11:31
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

Publié : sam. 20/juin/2009 12:48
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.