Code: Select all
;/ ANGLES , DISTANCE & PROJECTILLES
;/ PUREBASIC 4.0
;/ Par Cpl.Bator
Structure VECTOR2
x.f
y.f
EndStructure
Structure Projectille
Position.VECTOR2 ; Position courante de notre projectille
Origin.VECTOR2 ; Point de départ du projectille
angle.f ; Angle en degrée du projectille
Vitesse.f ; Vitesse du projectille
Physic_Timer.f ; Temps du projectille (la gravité est basé sur son temps de "vie")
EndStructure
Global NewList Ball.Projectille()
#GRAVITE = 9.8
;/INITIALISATION DES COMPOSANTS DIRECTX
InitSprite() : InitKeyboard() : InitMouse()
OpenWindow(0,0,0,800,600,"ANGLES ET DISTANCE",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,800,600,1,0,0)
Declare Distance(x1,y1,x2,y2)
Declare Return_Angle(x1.f,y1.f,x2.f,y2.f)
Declare ShootProjectille(x.f,y.f,angle.f,Force.f) ; Procedure qui va servir à tirer un projectille
Declare DisplayProjectilles() ; Procedure d'affichage et de gestion de nos projectilles
ShowCursor_(1)
Repeat
event.l = WindowEvent()
ClearScreen(0) : ExamineMouse() : ExamineKeyboard()
_Distance.l = Distance(MouseX(),MouseY(),0,600)
_Angle.f = Return_Angle(0,600,MouseX(),MouseY())
StartDrawing(ScreenOutput())
;INFOS
Box(0,0,182,62,RGB(255,255,255))
Box(0,0,180,60,RGB(10,10,200))
DrawingMode(#PB_2DDrawing_Transparent)
FrontColor(RGB(0,128,255))
DrawText(0,0 ,"DISTANCE (pixel) = "+Str(_Distance))
DrawText(0,20,"ANGLE (degrée) = "+Str(_Angle))
DrawText(0,40,"CLICK FOR SHOOT!")
;TRACAGE DE LIGNE
LineXY(0,600,MouseX(),MouseY(),RGB(255,0,0))
StopDrawing()
If MouseButton(#PB_MouseButton_Left)<>0 And Flag.b=0
Flag=1
ShootProjectille(0,600,_Angle,_Distance)
EndIf
If MouseButton(#PB_MouseButton_Left)=0 And Flag=1
Flag=0
EndIf
DisplayProjectilles()
FlipBuffers()
Until event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
End
;/PROCEDURES MATHEMATIQUES
Procedure Distance(x1,y1,x2,y2)
Protected Result.f
Result = Sqr( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) )
ProcedureReturn Result
EndProcedure
Procedure Return_Angle(x1.f,y1.f,x2.f,y2.f) ; DEGREE
A.f = x1-x2
B.f = y1-y2
C.f = -Sqr(A*A+B*B)
angle.f = ACos(A/C)*180/#PI
If y1 < y2 : angle=360-angle : EndIf
ProcedureReturn Abs(angle - 360)
EndProcedure
;/GESTION DES PROJECTILLES
Procedure ShootProjectille(x.f,y.f,angle.f,Force.f)
AddElement(Ball())
With Ball()
\Origin\x = x
\Origin\y = y
\angle = angle
\Vitesse = Force/2
EndWith
EndProcedure
Procedure DisplayProjectilles()
StartDrawing(ScreenOutput())
ForEach Ball()
With Ball()
;Gestion de la courbe
\Position\x = \Origin\x + (\Vitesse*Cos((\angle)*#PI/180)*\Physic_Timer)
\Position\y = \Origin\y + (\Vitesse*Sin((\angle)*#PI/180)*\Physic_Timer)+(0.5*#GRAVITE*(\Physic_Timer*\Physic_Timer))
\Physic_Timer + 0.1
Circle(\Position\x,\Position\y,2,RGB(255,255,255))
If \Position\y > 600
\angle = 360-\angle ;/ Attention, le 360-angle ne fonctionne qu'avec le bas de l'écran, et oui, c'est trop facile sinon :D
\Physic_Timer = 0 ;/ imaginer que votre balle arrive avec un angle de 45° (vers le bas-droite) , elle doit repartir vers
\Origin\x= \Position\x ;/ un angle de 315° (360-45), je ne vais pas rentrer dans les détails, pour être au top, il faut utilisé les vecteurs
\Origin\y= 600 ;/ et les normales d'une boite de collision, mais bon... on verra ca plus tard... :D
\Vitesse - 2
EndIf
;Gestion de la sorite de l'écran
If \Position\x >800 Or \Vitesse<=0
DeleteElement(Ball())
EndIf
EndWith
Next
StopDrawing()
EndProcedure