Bon c'est absolument pas optimisé ! Je me suis basé sur ce qu'a fait Comtois (encore une fois....que ferais-je sans toi
Code : Tout sélectionner
;Code de colision avec un rectangle... d'apres un code de comtois
;http://www.purebasic.fr/french/viewtopic.php?t=1960
Structure Rectangle
X.l ;Coordonée Central X
Y.l ;Coordonée Central Y
R.l ;Demi Diagonal du Rectangle
Angle.l ;Angle de Rotation
X1.l
Y1.l
X2.l
Y2.l
X3.l
Y3.l
X4.l
Y4.l
EndStructure
Global Rect.Rectangle
Rect\X=400
Rect\Y=300
Rect\R=150
If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSprite3D()=0 Or InitSound()=0
MessageRequester("Error","DirectX 7+ is needed.",0)
End
EndIf
OpenWindow(0,0,0,800,600,"Planete Alien ",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0, 800, 600, 0, 0, 0)
Procedure Drawrect()
LineXY(Rect\X1,Rect\Y1,Rect\X2,Rect\Y2,RGB(255,255,255))
LineXY(Rect\X2,Rect\Y2,Rect\X3,Rect\Y3,RGB(255,255,255))
LineXY(Rect\X3,Rect\Y3,Rect\X4,Rect\Y4,RGB(255,255,255))
LineXY(Rect\X4,Rect\Y4,Rect\X1,Rect\Y1,RGB(255,255,255))
Circle(Rect\X1,Rect\Y1,10,RGB(255,0,0))
Circle(Rect\X2,Rect\Y2,10,RGB(255,0,0))
Circle(Rect\X3,Rect\Y3,10,RGB(255,0,0))
Circle(Rect\X4,Rect\Y4,10,RGB(255,0,0))
EndProcedure
Procedure Signe(a.l)
If a>0
ProcedureReturn 1
ElseIf a=0
ProcedureReturn 0
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure Coli()
;Test la collision du point avec le triangle
;pour en savoir plus http://tanopah.jo.free.fr/seconde/region.html
;Plan 1
xu1=Rect\X2-Rect\X1:yu1=Rect\Y2-Rect\Y1
c1=Rect\Y1*xu1-Rect\X1*yu1
P1=Rect\X3*yu1-Rect\Y3*xu1+c1
AX1=MouseX()*yu1-MouseY()*xu1+c1
;Plan 2
xu2=Rect\X3-Rect\X2:yu2=Rect\Y3-Rect\Y2
c2=Rect\Y2*xu2-Rect\X2*yu2
P2=Rect\X1*yu2-Rect\Y1*xu2+c2
AX2=MouseX()*yu2-MouseY()*xu2+c2
;Plan 3
xu3=Rect\X1-Rect\X3:yu3=Rect\Y1-Rect\Y3
c3=Rect\Y3*xu3-Rect\X3*yu3
P3=Rect\X2*yu3-Rect\Y2*xu3+c3
AX3=MouseX()*yu3-MouseY()*xu3+c3
If Signe(AX1)=Signe(P1) And Signe(AX2)=Signe(P2) And Signe(AX3)=Signe(P3)
ProcedureReturn #True
Else
xu1=Rect\X3-Rect\X1:yu1=Rect\Y3-Rect\Y1
c1=Rect\Y1*xu1-Rect\X1*yu1
P1=Rect\X4*yu1-Rect\Y4*xu1+c1
AX1=MouseX()*yu1-MouseY()*xu1+c1
;Plan 2
xu2=Rect\X4-Rect\X3:yu2=Rect\Y4-Rect\Y3
c2=Rect\Y3*xu2-Rect\X3*yu2
P2=Rect\X1*yu2-Rect\Y1*xu2+c2
AX2=MouseX()*yu2-MouseY()*xu2+c2
;Plan 3
xu3=Rect\X1-Rect\X4:yu3=Rect\Y1-Rect\Y4
c3=Rect\Y4*xu3-Rect\X4*yu3
P3=Rect\X3*yu3-Rect\Y3*xu3+c3
AX3=MouseX()*yu3-MouseY()*xu3+c3
If Signe(AX1)=Signe(P1) And Signe(AX2)=Signe(P2) And Signe(AX3)=Signe(P3)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndIf
EndProcedure
#DEG=#PI/180
Repeat
ExamineMouse()
ExamineKeyboard()
Rect\X=400+100*Sin(Rect\Angle*#DEG)
Rect\Y=300+100*Cos(Rect\Angle*#DEG)
Rect\Angle+1
If Rect\Angle>360:Rect\Angle=0:EndIf
Rect\X1=Rect\X+Rect\R*Cos((Rect\Angle-25)*#DEG)
Rect\Y1=Rect\Y+Rect\R*Sin((Rect\Angle-25)*#DEG)
Rect\X2=Rect\X+Rect\R*Cos((Rect\Angle+25)*#DEG)
Rect\Y2=Rect\Y+Rect\R*Sin((Rect\Angle+25)*#DEG)
Rect\X3=Rect\X+Rect\R*Cos((Rect\Angle+180-25)*#DEG)
Rect\Y3=Rect\Y+Rect\R*Sin((Rect\Angle+180-25)*#DEG)
Rect\X4=Rect\X+Rect\R*Cos((Rect\Angle-180+25)*#DEG)
Rect\Y4=Rect\Y+Rect\R*Sin((Rect\Angle-180+25)*#DEG)
;Si ma souris passe dans le rectangle
If Coli()
ClearScreen(RGB(255,255,255))
Else
ClearScreen(0)
EndIf
StartDrawing(ScreenOutput())
Drawrect()
Circle(MouseX(),MouseY(),10,RGB(0,255,0))
StopDrawing()
Delay(1)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)