Page 1 sur 2

Petit casse brique avec bug !!!

Publié : ven. 04/juin/2004 8:30
par Good07
Bonjour à tous.

Je voulais creer (histoie de programmer quelque chose...) un petit casse brique genre Diabolo sur Atari. Cela me permettai de voir comment fonctionne les listes. Mais malheureusement je suis bloqué :mad:
Ca bug au chargement du deuxième tableau re...:mad:
Et je ne comprend pas pourquoi... 8O

Je vous donne le code, c'est programmé à l'arach mais il permet de se familiariser avec diverses commandes de Pure.

Merci pour vos conseils :D

André.

Code : Tout sélectionner


; Essai casse brique 
; genre Diabolo sur Atari
; Le seul casse brique qui permet de monter au créneau
; version 1.0 du 05/06/2004
; Click Gauche sur la souris pour démarrer





Global xb.w,yb.w,axb.w,ayb.w,dxb.w,dyb.w,deb_jeu.b,br.w,nbb.w


If InitSprite() = 0 Or InitKeyboard() = 0 Or InitPalette() = 0 Or InitMouse() = 0 Or InitSound()=0 
  MessageRequester("Erreur", "Impossible d'initialiser DirectX 7 Ou plus", 0) 
  End 
EndIf 

;LoadSound(0,"data\CERAMIC5.wav") ici on charge le son de la brique cassée...
;LoadSound(1,"data\Pong.wav") ici celui du rebond

If OpenWindow(0, 0, 0, 400, 500, #PB_Window_SystemMenu | #PB_Window_ScreenCentered , "Good07-Brique") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf
hdl=WindowID(0)
OpenWindowedScreen(hdl,0,0,400,500,1,0,0)


CreateSprite(1,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(1))
Box(0,0,30,10,RGB(255,0,0))
StopDrawing()

CreateSprite(2,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(2))
Box(0,0,30,10,RGB(0,0,255))
StopDrawing()

CreateSprite(3,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(3))
Box(0,0,30,10,RGB(0,0,0))
Box(2,2,26,6,RGB(125,125,125))
Box(5,5,20,1,RGB(255,255,255))
StopDrawing()



CreateSprite(4,35,5,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(4))
Box(0,0,5,5,RGB(255,0,0))
Box(5,0,30,5,RGB(101,246,154))
Box(30,0,5,5,RGB(255,0,0))
StopDrawing()

CreateSprite(5,400,500,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(5))
Box(0,0,400,500,RGB(255,255,255))
StopDrawing()

CreateSprite(6,10,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(6))
Circle(5,5,5,RGB(128,128,128))
StopDrawing()

Structure briques
  type.b
  x.l
  y.l
  cp.b
EndStructure

NewList brique.briques(); on crée une liste pour gérer les briques

Procedure Niveau_jeu(); on rempli la liste avec la position des briques et leur type(1,2 ou 3)
y=15
x=15
Read lb.w
Read cb.w
Read nbb.w
For m=1 To lb
  For n=1 To cb
    Read tp.b
    If tp=1
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    If tp=2
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    If tp=3
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    x+33
  Next n
  y+15
  x=15
Next m
EndProcedure

Procedure Mouvement_Balle()
  xb=xb+dxb
  yb=yb+dyb
  If xb<0
    dxb=3
    axb=0
  EndIf
  If xb>390
    dxb=-3
    axb=390
  EndIf
  If yb<0
    dyb=3
    ayb=0
  EndIf
  If yb>490
    dyb=-3
    ayb=490
  EndIf
EndProcedure

Procedure init(Niv)
deb_jeu=0 
br=0
nbb=0
xpos=200
ypos=400 
ClearList(brique())
Select tab  
  Case 1
  Restore Niveau1
  Case 2
  Restore Niveau2
EndSelect
Niveau_jeu() 
EndProcedure 

init(1)

Repeat 
  StartSpecialFX() 
  ClearScreen(0, 0, 0)
  DisplaySprite(5,0,0)  
  ResetList(brique()) 
  While NextElement(brique())    
    DisplaySprite(brique()\type, brique()\x, brique()\y)
    If SpriteCollision(6, xb, yb, brique()\type, brique()\x, brique()\y)
      dxb_t=axb-brique()\x
      dyb_t=ayb-brique()\y
      If dxb_t<=0
        dxb=3
      Else
        dxb=-3
      EndIf
      If dyb_t<=0
        dyb=-3
      Else
        dyb=3
      EndIf
      axb=brique()\x
      ayb=brique()\y
      If brique()\type=1;si c'est une brique de type 1 on casse !
        ;PlaySound(0); on joue le son de la brique cassée      
        DeleteElement(brique())
        br=br+1
      EndIf
      If brique()\type=2 And brique()\cp<3; si c'est une brique de type 2 on compte les coups...
        brique()\cp=brique()\cp+1
        ;PlaySound(1): on joue le son du rebond tant que la brique ne se casse pas.
      EndIf
      If brique()\type=2 And brique()\cp>2; si elle a été touchée + de 2 fois on casse aussi ! (pas de quartier...)
        ;PlaySound(0); cette fois si elle est cassée (ouf...) et on ...voir plus haut.
        DeleteElement(brique())
        br=br+1
      EndIf
    EndIf 
  Wend 
  If br=nbb ;Si toutes les briques sont cassées on passe au niveau 2 et là ça bug dur dur ...?????
    init(2)
  EndIf
  If deb_jeu=1
    Mouvement_Balle()
    DisplayTransparentSprite(4,xPos,yPos)
    DisplayTransparentSprite(6,xb,yb)
    If SpriteCollision(6,xb,yb,3,xPos,yPos)
      ;PlaySound(1): rebond sur la raquette
      dyb=-3
      axb=xPos
      ayb=yPos
    EndIf    
  Else
    DisplayTransparentSprite(4,xpos,ypos)
    DisplayTransparentSprite(6,xpos+12,ypos-10)
  EndIf
  StopSpecialFX()
  FlipBuffers()   
  ExamineKeyboard() 
  ExamineMouse()
  xPos=MouseX()
  yPos=MouseY()
  If xpos>365:xpos=365:EndIf
  If ypos>490:ypos=490:EndIf
  If MouseButton(1)<>0
    deb_jeu=1
    xb=xPos+15
    yb=yPos-10
    axb=xb
    ayb=yb
    dxb=3
    dyb=-3
  EndIf    
Until KeyboardPushed(#PB_Key_Escape) 
End




DataSection

;1=brique qui se casse dès qu'elle est touchée
;2=brique qu'il faut toucher 2 fois pour qu'elle se casse
;3= brique incassable
;Première ligne de data= premier chiffre nombre de lignes de briques: 2eme nombre de colonnes: 3eme nombre de briques à casser.
Niveau1:

Data.w 8,11,83
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,3,1,3,1,3,1,3,1,3,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 2,2,2,2,2,2,2,2,2,2,2

Niveau2:

Data.w 10,11,105
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,3,1,3,1,3,1,3,1,3,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1

EndDataSection

Publié : ven. 04/juin/2004 9:17
par cederavic
ben chez moi sa marche impecable...

Publié : ven. 04/juin/2004 9:21
par Chris
Chez moi, il y a un bug au tableau 2, il y a toujours un bloc de 4 briques qui manquent.

Chris :)

Publié : ven. 04/juin/2004 9:28
par comtois
Ce qui déconne c'est l'appui sur le bouton gauche de la souris .
Si tu appuies dessus en cours de partie , ça plante.

Je n'ai pas regardé pourquoi , j'ai faim , je vais déjeuner,mais ça te fait une piste à explorer :)

Publié : ven. 04/juin/2004 9:42
par Chris
comtois a écrit :Ce qui déconne c'est l'appui sur le bouton gauche de la souris .
Si tu appuies dessus en cours de partie , ça plante.

Je n'ai pas regardé pourquoi , j'ai faim , je vais déjeuner,mais ça te fait une piste à explorer :)
Moi, j'ai ajouté un WhileWindowEvent():Wend dans la boucle, et ça plante plus à ce niveau là.

Va savoir pourquoi!!!

Par contre, heureusement que le code est court, parce que pour débugger quand tu sais pas à quoi correspondent les variables! :lol:

D'où l'utilité de donner des noms significatifs aux variables et aux constantes :wink:

Chris :)

Publié : ven. 04/juin/2004 10:10
par Good07
Merci à tous pour vos réponses. :D

Comtois avait raison c'était la gestion du click de la souris qui buggait. J'ai corrigé le problème apparement ça fonctionne .
Je pense que ça fait une bonne base de départ pour la programmation de ce genre de jeu. IL reste encore du boulot, le score les bonus et surtout une meilleure présentation.
Quelques idées aussi :
accélerer la balle en fonction de la force de frappe de la raquette. Ajouter de la gravité à certaine boule pour quelle aient plus de mal à remonter.
Gérer le rebond en fonction du mouvement de la raquette...
Enfin quoi...Recréer Diabolo en Pure.

Je vais encore me coucher à 3h00 du Mat mais je sais que je ne suis pas le seul :D
André.

Code : Tout sélectionner


; Essai casse brique 
; genre Diabolo sur Atari
; Le seul casse brique qui permet de monter au créneau
; version 1.0 du 05/06/2004
; Click Gauche sur la souris pour démarrer





Global xb.w,yb.w,axb.w,ayb.w,dxb.w,dyb.w,deb_jeu.b,br.w,nbb.w


If InitSprite() = 0 Or InitKeyboard() = 0 Or InitPalette() = 0 Or InitMouse() = 0 Or InitSound()=0 
  MessageRequester("Erreur", "Impossible d'initialiser DirectX 7 Ou plus", 0) 
  End 
EndIf 

;LoadSound(0,"data\CERAMIC5.wav") ici on charge le son de la brique cassée...
;LoadSound(1,"data\Pong.wav") ici celui du rebond

If OpenWindow(0, 0, 0, 400, 500, #PB_Window_SystemMenu | #PB_Window_ScreenCentered , "Good07-Brique") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf
hdl=WindowID(0)
OpenWindowedScreen(hdl,0,0,400,500,1,0,0)


CreateSprite(1,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(1))
Box(0,0,30,10,RGB(255,0,0))
StopDrawing()

CreateSprite(2,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(2))
Box(0,0,30,10,RGB(0,0,255))
StopDrawing()

CreateSprite(3,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(3))
Box(0,0,30,10,RGB(0,0,0))
Box(2,2,26,6,RGB(125,125,125))
Box(5,5,20,1,RGB(255,255,255))
StopDrawing()



CreateSprite(4,35,5,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(4))
Box(0,0,5,5,RGB(255,0,0))
Box(5,0,30,5,RGB(101,246,154))
Box(30,0,5,5,RGB(255,0,0))
StopDrawing()

CreateSprite(5,400,500,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(5))
Box(0,0,400,500,RGB(255,255,255))
StopDrawing()

CreateSprite(6,10,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(6))
Circle(5,5,5,RGB(128,128,128))
StopDrawing()

Structure briques
  type.b
  x.l
  y.l
  cp.b
EndStructure

NewList brique.briques(); on crée une liste pour gérer les briques

Procedure Niveau_jeu(); on rempli la liste avec la position des briques et leur type(1,2 ou 3)
y=15
x=15
Read lb.w
Read cb.w
Read nbb.w
For m=1 To lb
  For n=1 To cb
    Read tp.b
    If tp=1
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    If tp=2
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    If tp=3
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    x+33
  Next n
  y+15
  x=15
Next m
EndProcedure

Procedure Mouvement_Balle()
  xb=xb+dxb
  yb=yb+dyb
  If xb<0
    dxb=3
    axb=0
  EndIf
  If xb>390
    dxb=-3
    axb=390
  EndIf
  If yb<0
    dyb=3
    ayb=0
  EndIf
  If yb>490
    dyb=-3
    ayb=490
  EndIf
EndProcedure

Procedure init(Niv)
deb_jeu=0 
br=0
nbb=0
xpos=200
ypos=400 
ClearList(brique())
Select tab  
  Case 1
  Restore Niveau1
  Case 2
  Restore Niveau2
EndSelect
Niveau_jeu() 
EndProcedure 

init(1)

Repeat
  EventID.l = WaitWindowEvent() 
  StartSpecialFX() 
  ClearScreen(0, 0, 0)
  DisplaySprite(5,0,0)  
  ResetList(brique()) 
  While NextElement(brique())    
    DisplaySprite(brique()\type, brique()\x, brique()\y)
    If SpriteCollision(6, xb, yb, brique()\type, brique()\x, brique()\y)
      dxb_t=axb-brique()\x
      dyb_t=ayb-brique()\y
      If dxb_t<=0
        dxb=3
      Else
        dxb=-3
      EndIf
      If dyb_t<=0
        dyb=-3
      Else
        dyb=3
      EndIf
      axb=brique()\x
      ayb=brique()\y
      If brique()\type=1;si c'est une brique de type 1 on casse !
        ;PlaySound(0); on joue le son de la brique cassée      
        DeleteElement(brique())
        br=br+1
      EndIf
      If brique()\type=2 And brique()\cp<3; si c'est une brique de type 2 on compte les coups...
        brique()\cp=brique()\cp+1
        ;PlaySound(1): on joue le son du rebond tant que la brique ne se casse pas.
      EndIf
      If brique()\type=2 And brique()\cp>2; si elle a été touchée + de 2 fois on casse aussi ! (pas de quartier...)
        ;PlaySound(0); cette fois si elle est cassée (ouf...) et on ...voir plus haut.
        DeleteElement(brique())
        br=br+1
      EndIf
    EndIf 
  Wend 
  If br=nbb ;Si toutes les briques sont cassées on passe au niveau 2 et là ça bug dur dur ...?????
    init(2)
  EndIf
  If deb_jeu=1
    Mouvement_Balle()
    DisplayTransparentSprite(4,xPos,yPos)
    DisplayTransparentSprite(6,xb,yb)
    If SpriteCollision(6,xb,yb,3,xPos,yPos)
      ;PlaySound(1): rebond sur la raquette
      dyb=-3
      axb=xPos
      ayb=yPos
    EndIf    
  Else
    DisplayTransparentSprite(4,xpos,ypos)
    DisplayTransparentSprite(6,xpos+12,ypos-10)
  EndIf
  StopSpecialFX()
  FlipBuffers()   
  ExamineKeyboard() 
  ExamineMouse()
  xPos=MouseX()
  yPos=MouseY()
  If xpos>365:xpos=365:EndIf
  If ypos>490:ypos=490:EndIf
  If EventID=#WM_LButtonDown And bouton_click=0 And deb_jeu=0
    deb_jeu=1
    xb=xPos+15
    yb=yPos-10
    axb=xb
    ayb=yb
    dxb=3
    dyb=-3
    bouton_click=0
  EndIf    
Until KeyboardPushed(#PB_Key_Escape) 
End




DataSection

;1=brique qui se casse dès qu'elle est touchée
;2=brique qu'il faut toucher 2 fois pour qu'elle se casse
;3= brique incassable
;Première ligne de data= premier chiffre nombre de lignes de briques: 2eme nombre de colonnes: 3eme nombre de briques à casser.
Niveau1:

Data.w 8,11,83
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,3,1,3,1,3,1,3,1,3,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 2,2,2,2,2,2,2,2,2,2,2

Niveau2:

Data.w 10,11,105
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,3,1,3,1,3,1,3,1,3,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1

EndDataSection

Publié : ven. 04/juin/2004 10:46
par Good07
Pour la gestion de la souris ça marche sans problèmes. Par contre j'ai effectivement un trou dans le nouveau tableau à l'endrois de la dernière brique cassée dans le tableau précédent, comme si la balle commençais à casser des briques dans un tableau qui n'est même pas créé. Bizarre... 8O

J'ai essayé la gestion de la liste avec des nombres et en faisant un Clearlist() puis en rechargeant la liste avec de nouvelles données. Ca marche impeccable...Mais où sont donc passé mes briques... :evil:

Un enzyme glouton :?:

Je cherche :roll:

André inspecteur pas mal un briqué dans cette affaire :wink:

Publié : ven. 04/juin/2004 11:26
par Backup
tu peux allez recuperer mon casse brique (purenoide_final)
sur mon site menu "PureBasic"
ça te donnera peut etre des idees pour la suite de ton programme
et pis quand t'aura trop mal a la tete avec ton listing ça te passera 5 Minutes !!
:lol: :lol:

Publié : ven. 04/juin/2004 11:31
par comtois
Teste les collisions seulement si la partie est commencée

Code : Tout sélectionner

    If deb_jeu
      If SpriteCollision(6, xb, yb, brique()\type, brique()\x, brique()\y) 
      etc...


Publié : ven. 04/juin/2004 12:36
par Anonyme2
La deuxième version marche bien sous WIN98 SE. :D

Problèmes : parfois la balle passe à travers les brique gris/noir avec le trait au milieu (c'est l'impression que j'ai).

Après avoir franchi les 2 paliers ça plante car il n'y a plus de datas à lire.

Amélioration; vitesse de la balle, angle de rebonds différents et taille de la raquette qui pourrait diminuer avec les niveaux y compris bloquer la position en y

Publié : ven. 04/juin/2004 13:33
par Crystal Noir
Good07 => Avatar "Comme vous avez pu le constater, nous avons l'oeil sur vous depuis quelques temps Mr Anderson. Nous pensons que vous menez une double vie......" :wink:

Sans dec refaire une matrice en pure ca pourrait être marrant lol. Chez moi ton soft il pète direct :cry:

Publié : ven. 04/juin/2004 13:37
par Good07
Pour Chris

Je sais pour les variables c'est pas terrible, mais j'ai fait au plus court. Je rectifirais cela plus tard.

Pour Comtois

Le problème venait effectivement de là. J'ai rectifié la ligne en ajoutant un and : If deb_jeu=1 And SpriteCollision(6, xb, yb, brique()\type, brique()\x, brique()\y)

Merci maintenant ça marche nickel :D

Pour Dobro

J'ai voulu recupéré ton programme mais j'ai un message chaque fois que j'essaye : :(

The requested URL /Purebasic/Purenoïde_final.zip was not found on this server.

Je vois qu'il n'y a pas que mes briques qui disparaissent :wink:

voici le code corrigé.

Merci à tous André.

Code : Tout sélectionner


; Essai casse brique 
; genre Diabolo sur Atari
; Le seul casse brique qui permet de monter au créneau
; version 1.0 du 05/06/2004
; Click Gauche sur la souris pour démarrer





Global xb.w,yb.w,axb.w,ayb.w,dxb.w,dyb.w,deb_jeu.b,br.w,nbb.w,tab.b


If InitSprite() = 0 Or InitKeyboard() = 0 Or InitPalette() = 0 Or InitMouse() = 0 Or InitSound()=0 
  MessageRequester("Erreur", "Impossible d'initialiser DirectX 7 Ou plus", 0) 
  End 
EndIf 

;LoadSound(0,"data\CERAMIC5.wav") ici on charge le son de la brique cassée...
;LoadSound(1,"data\Pong.wav") ici celui du rebond

If OpenWindow(0, 0, 0, 400, 500, #PB_Window_SystemMenu | #PB_Window_ScreenCentered , "Good07-Brique") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf
hdl=WindowID(0)
OpenWindowedScreen(hdl,0,0,400,500,1,0,0)


CreateSprite(1,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(1))
Box(0,0,30,10,RGB(255,0,0))
StopDrawing()

CreateSprite(2,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(2))
Box(0,0,30,10,RGB(0,0,255))
StopDrawing()

CreateSprite(3,30,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(3))
Box(0,0,30,10,RGB(0,0,0))
Box(2,2,26,6,RGB(125,125,125))
Box(5,5,20,1,RGB(255,255,255))
StopDrawing()



CreateSprite(4,35,5,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(4))
Box(0,0,5,5,RGB(255,0,0))
Box(5,0,30,5,RGB(101,246,154))
Box(30,0,5,5,RGB(255,0,0))
StopDrawing()

CreateSprite(5,400,500,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(5))
Box(0,0,400,500,RGB(255,255,255))
StopDrawing()

CreateSprite(6,10,10,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(6))
Circle(5,5,5,RGB(128,128,128))
StopDrawing()

Structure briques
  type.b
  x.l
  y.l
  cp.b
EndStructure

NewList brique.briques(); on crée une liste pour gérer les briques

Procedure Niveau_jeu(); on rempli la liste avec la position des briques et leur type(1,2 ou 3)
y=15
x=15
Read lb.w
Read cb.w
Read nbb.w
For m=1 To lb
  For n=1 To cb
    Read tp.b
    If tp=1
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    If tp=2
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    If tp=3
      AddElement(brique())
      brique()\type=tp
      brique()\x=x
      brique()\y=y
    EndIf
    x+33
  Next n
  y+15
  x=15
Next m
EndProcedure

Procedure Mouvement_Balle()
  xb=xb+dxb
  yb=yb+dyb
  If xb<0
    dxb=3
    axb=0
  EndIf
  If xb>390
    dxb=-3
    axb=390
  EndIf
  If yb<0
    dyb=3
    ayb=0
  EndIf
  If yb>490
    dyb=-3
    ayb=490
  EndIf
EndProcedure

Procedure init(Niv)
deb_jeu=0 
br=0
nbb=0
xpos=200
ypos=400 
ClearList(brique())
Select tab  
  Case 1
  Restore Niveau1
  Case 2
  Restore Niveau2
  Case 3
  MessageRequester("Good07 Brique","Cest Fini pour l'instant",#PB_MessageRequester_OK)
  End
EndSelect
Niveau_jeu() 
EndProcedure 

tab=1
init(tab)

Repeat
  EventID.l = WaitWindowEvent() 
  StartSpecialFX() 
  ClearScreen(0, 0, 0)
  DisplaySprite(5,0,0)  
  ResetList(brique()) 
  While NextElement(brique())    
    DisplaySprite(brique()\type, brique()\x, brique()\y)
    If deb_jeu=1 And SpriteCollision(6, xb, yb, brique()\type, brique()\x, brique()\y)
      dxb_t=axb-brique()\x
      dyb_t=ayb-brique()\y
      If dxb_t<=0
        dxb=3
      Else
        dxb=-3
      EndIf
      If dyb_t<=0
        dyb=-3
      Else
        dyb=3
      EndIf
      axb=brique()\x
      ayb=brique()\y
      If brique()\type=1;si c'est une brique de type 1 on casse !
        ;PlaySound(0); on joue le son de la brique cassée      
        DeleteElement(brique())
        br=br+1
      EndIf
      If brique()\type=2 And brique()\cp<3; si c'est une brique de type 2 on compte les coups...
        brique()\cp=brique()\cp+1
        ;PlaySound(1): on joue le son du rebond tant que la brique ne se casse pas.
      EndIf
      If brique()\type=2 And brique()\cp>2; si elle a été touchée + de 2 fois on casse aussi ! (pas de quartier...)
        ;PlaySound(0); cette fois si elle est cassée (ouf...) et on ...voir plus haut.
        DeleteElement(brique())
        br=br+1
      EndIf
    EndIf 
  Wend 
  If br=nbb ;Si toutes les briques sont cassées on passe au niveau suivant
    tab=tab+1
    init(tab)
  EndIf
  If deb_jeu=1
    Mouvement_Balle()
    DisplayTransparentSprite(4,xPos,yPos)
    DisplayTransparentSprite(6,xb,yb)
    If SpriteCollision(6,xb,yb,3,xPos,yPos)
      ;PlaySound(1): rebond sur la raquette
      dyb=-3
      axb=xPos
      ayb=yPos
    EndIf    
    Else
      DisplayTransparentSprite(4,xpos,ypos)
      DisplayTransparentSprite(6,xpos+12,ypos-10)
  EndIf
  StopSpecialFX()
  FlipBuffers()   
  ExamineKeyboard() 
  ExamineMouse()
  xPos=MouseX()
  yPos=MouseY()
  If xpos>365:xpos=365:EndIf
  If ypos>490:ypos=490:EndIf
  If EventID=#WM_LButtonDown And bouton_click=0 And deb_jeu=0
    deb_jeu=1
    xb=xPos+15
    yb=yPos-10
    axb=xb
    ayb=yb
    dxb=3
    dyb=-3
    bouton_click=0
  EndIf    
Until KeyboardPushed(#PB_Key_Escape) 
End




DataSection

;1=brique qui se casse dès qu'elle est touchée
;2=brique qu'il faut toucher 2 fois pour qu'elle se casse
;3= brique incassable
;Première ligne de data= premier chiffre nombre de lignes de briques: 2eme nombre de colonnes: 3eme nombre de briques à casser.
Niveau1:

Data.w 8,11,83
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,3,1,3,1,3,1,3,1,3,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 2,2,2,2,2,2,2,2,2,2,2

Niveau2:

Data.w 10,11,105
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,2,1,2,1,2,1,2,1,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,3,1,3,1,3,1,3,1,3,1
Data.b 1,1,1,1,1,1,1,1,1,1,1
Data.b 1,1,1,1,1,1,1,1,1,1,1

EndDataSection

Publié : ven. 04/juin/2004 13:56
par Chris
Pour Chris

Je sais pour les variables c'est pas terrible, mais j'ai fait au plus court. Je rectifirais cela plus tard.
C'était pas une remarque désobligeante, mais juste une démonstration par l'exemple de ce que tout programmeur devrait faire. :wink:

Abandonne ton code pendant 6 mois, et reprends le.

Ta première réflexion sera :" Oh p....n!!! , si seulement j'avais mis des noms explicites à mes variables :lol:

Chris :)

Publié : ven. 04/juin/2004 14:46
par Backup
@good07
J'ai voulu recupéré ton programme mais j'ai un message chaque fois que j'essaye :

The requested URL /Purebasic/Purenoïde_final.zip was not found on this server.

Je vois qu'il n'y a pas que mes briques qui disparaissent
Merci de m'avoir prevenu !!!

je suis en train de refaire un peu la structure(encore!elle sont partout !)
de mon site , et j'ai carrement oublier de verifier mes liens !!
voila qui est réparé !! Merci encore t'es le seul a me l'avoir dit
le site existe depuis longtemps ,c'est dire le nombre de visiteurs !! :D

Publié : ven. 04/juin/2004 17:25
par Good07
Pour Chris

Je ne l'ai pas pris pour une remarque désobligeante. Ce forum est très convivial et les remarques sont très constructives. Mais tu sais dans l'ardèche on est un peu avare et on économise sur tout même sur la longueur des variables. :wink:
Et confidence pour confidence je vais t'avouer que même moi j'ai du mal à m'y retrouver mais surtout il ne faut pas le répéter . :oops:

Pour Dobro

Merci je vais pouvoir le télécharger.

Pour Denis

J'ai réglé le Pb avec les datas. Enfin il faudrait faire plus de tableau mais pour l'instant ce n'est pas mon principal soucis. J'ai pu observer aussi quelquefois un comportement bizarre de la balle vis a vis des briques mais le problème c'est que cela ne se répète pas à chaque fois.

Pour cristal noir

Argh ! je suis repéré ... Moi qui croyais pouvoir me promener dans la matrice incognito c'est râté. Par contre dois-je comprendre que le code ne marche pas chez toi :?:

je mets mes lunettes pour passer inaperçu. 8)


A+ :lol: