Basic Univers
; Author : comtois
; Date :   20/04/2007


; Code de collision avec un rectangle en rotation... 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
  mx = MouseX() : my = MouseY()
  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 = Mx*yu1 - My*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 = Mx*yu2 - My*xu2 + c2
  ; Plan 3
  xu3 = Rect\X4 - Rect\X3: yu3 = Rect\Y4 - Rect\Y3
  c3 = Rect\Y3*xu3 - Rect\X3*yu3
  P3 = Rect\X1*yu3 - Rect\Y1*xu3 + c3
  AX3 = Mx*yu3 - My*xu3 + c3
  ; Plan 4
  xu4 = Rect\X1 - Rect\X4: yu4 = Rect\Y1 - Rect\Y4
  c4 = Rect\Y4*xu4 - Rect\X4*yu4
  P4 = Rect\X3*yu4 - Rect\Y3*xu4 + c4
  AX4 = Mx*yu4 - My*xu4 + c4

  If  Signe(AX1)= Signe(P1) And Signe(AX2)= Signe(P2) And Signe(AX3)= Signe(P3) And Signe(AX4)= Signe(P4)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  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(#Blue)
  Else
    ClearScreen(0)
  EndIf
 
  StartDrawing(ScreenOutput())
    Drawrect()
    Circle(MouseX(), MouseY(), 10, RGB(0, 255, 0))
   
  StopDrawing()
 
 
 
  Delay(1)
 
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)