Je rentre de congé et je prends le train en marche. J'ai lu avec attention les messages et j'ai testé les deux programmes. Je constate que la fonction spritecollision réagit assez bizarement quelquefois. J'ai donc fais une compilation des deux listing en espérant que Dobro et Christ ne m'en tiendront pas rigueur et je vous livre mes résultats. Pour la fonction de Chris apparement elle n'est jamais prise en défaut. Pour le listing de Dobro avec une brique énorme et une petite balle cela semble fonctionner normalement mais en la laissant tourné un petit moment on constate certaines anomalies.
Pour la mienne qui est en fait celle de Dobro dans la fenêtre de Chris, laissez la tourner un moment et vous verrez que tout n'est pas rose. Mais le plus bizarre c'est que cela ne se produit pas tout le temps.
Code : Tout sélectionner
#Window = 0
#Width = 300
#Height = 300
Enumeration
#brique
#balle
EndEnumeration
Global xbrique,ybrique,xpas,ypas,xb,yb,flag
dep = 1
Procedure Sprites()
; Procedure de création des sprites
If CreateSprite(#brique,128,24,0) ; Sprite Fixe
StartDrawing(SpriteOutput(#brique))
Box(0,0,128,24,RGB($FF,$0,$0))
StopDrawing()
EndIf
If CreateSprite(#balle,20,20,0) ; Sprite Mobile
StartDrawing(SpriteOutput(#balle))
Circle(10,10,10,RGB($0,$0,$FF))
StopDrawing()
EndIf
EndProcedure
;- Initialisation de DirectX
If InitSprite() = 0 Or InitKeyboard() = 0
End
EndIf
;- Ouverture de la fenêtre et de l'écran
hwnd = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "")
OpenWindowedScreen(hwnd, 0, 0, #Width, #Height, 0, 0, 0)
Sprites()
;- Initialisation des sprites
xbrique = 86 : ybrique = 138
xb= 0 : yb= 0
xpas = 3 : ypas = 3
;- Boucle des évènements
Repeat
ClearScreen(0, 0, 0) : ExamineKeyboard()
; Affichage des sprites
DisplayTransparentSprite(#brique, xbrique, ybrique)
DisplayTransparentSprite(#balle, xb, yb)
FlipBuffers()
xb=xb + xpas
yb=yb + ypas
If SpritePixelCollision(#balle, xb, yb, #brique, xbrique, ybrique)<>0 And xb<xbrique And flag=0
flag=1
SetWindowTitle(#Window,"Collision à gauche")
xpas=-xpas
Goto su ; sort du test !!!
EndIf
If SpritePixelCollision(#balle, xb, yb, #brique, xbrique, ybrique)<>0 And xb>xbrique+118 And flag=0
flag=1
SetWindowTitle(#Window,"Collision à droite")
xpas=-xpas
Goto su ; sort du test !!!
EndIf
If SpritePixelCollision(#balle, xb, yb, #brique, xbrique, ybrique)<>0 And yb<ybrique And flag=0
flag=1
SetWindowTitle(#Window,"Collision au dessus")
ypas=-ypas
Goto su ; sort du test !!!
EndIf
If SpritePixelCollision(#balle, xb, yb, #brique, xbrique, ybrique)<>0 And yb>ybrique+14 And flag=0
flag=1
SetWindowTitle(#Window,"Collision au dessous")
ypas=-ypas
Goto su ; sort du test !!!
EndIf
su:
If flag=1
attente+1
EndIf
If attente>4
attente=0
flag=0
EndIf
;Delay(2)
If KeyboardPushed(#PB_Key_Escape) : quit = 1 : EndIf
If KeyboardPushed(#PB_Key_Left) : xbrique - dep : EndIf
If KeyboardPushed(#PB_Key_Right) : xbrique + dep : EndIf
If KeyboardPushed(#PB_Key_Up) : ybrique - dep : EndIf
If KeyboardPushed(#PB_Key_Down) : ybrique + dep : EndIf
If xb <=0 : xpas= -xpas : EndIf
If yb <=0 : ypas= -ypas : EndIf
If xb >=280 : xpas= -xpas : EndIf
If yb >=280 : ypas= -ypas : EndIf
While WindowEvent() : Wend
Until quit = 1

Mais je m'en était déja apercu quand j'avais posté mon petit casse-brique.
Peut-être qu'en apportant quelques correction ?

A plus