File: tiroriente1a.pb - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

; philippe - Toulouse - 2013 - purebasic 4.61 x86
; sprite orient� : d'un point A � un point B

If InitMouse ()=0 Or InitKeyboard ()=0 Or InitSprite ()=0  Or InitSprite3D ()=0
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf
If InitSound()=0 Or InitMovie()=0
  MessageRequester("Error", "Can't open DirectX 7 Or Sound Card is not present", 0)
  End
EndIf

UsePNGImageDecoder()

; ������������������������������������������������������
;LoadFont ( 0 , "Comic Sans Ms" ,16, #PB_Font_Bold)
;LoadFont ( 1 , "Comic Sans Ms" ,30, #PB_Font_Bold)
Enumeration ; ici, on donne un petit nom � nos sprites( non, chuis pas un num�ro !):

#raquette
#tird
       
EndEnumeration

If OpenWindow ( 0 , 0, 0, 1024, 768, "tir orient� 2" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar| #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_ScreenCentered )
 OpenWindowedScreen ( WindowID ( 0 ), 0, 0, 1024, 768, 0, 1, 1) ; un ecran graphique dans la fen�tre.

  SetWindowColor(0, RGB (236,216,234))  
EndIf
KeyboardMode(#PB_Keyboard_International)

 CreateSprite ( #raquette , 64, 16, 0 )
 StartDrawing ( SpriteOutput ( #raquette )) ;- image pour la raquette
  BackColor ( RGB (0,0,0))
  Box (0,0, 64, 16, RGB (255, 255, 255))
 StopDrawing ()
 
 CreateSprite ( #tird , 32, 32, 0 )
 StartDrawing ( SpriteOutput ( #tird )) ;- image pour le tir
  BackColor ( RGB (0,0,0))
  Circle(16, 16, 16 , RGB (255, 0, 0))
 StopDrawing ()
 
Structure objet ;- variables pour les clones (liste chain�es).

objetetat.w

objetx.f
objety.f
objetxs.f
objetys.f
objetangle.f

objetspeed.w

EndStructure
Global NewList trait.objet() ; -> #raquette
Global NewList tir.objet() ; -> #tird  


Global etape.b, tempoA.b, nbrtir.w


Procedure.f GetAngle(gx,gy, tx,ty) ; g comme go( d�part de l'action) et t comme target( l'objet cible � toucher).
  a.f = tx-gx
  b.f = ty-gy
  c.f = Sqr(a*a+b*b)
  angle.f = -ACos(a/c)*57.29577

  If ty < gy : angle=360-angle : EndIf
  If ty > gy : angle=360+angle : EndIf

  ProcedureReturn angle+90
EndProcedure

; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************
 Event= WindowEvent ()
 Start3D() ; on place cette commande d�s le d�but de la boucle principale.

 ExamineMouse()
 ExamineKeyboard ()
 
If etape=0 ;- fabrication de la raquette
  LastElement(trait())
  AddElement(trait())
  trait()\objetetat=1
  trait()\objetx=512
  trait()\objety=640

  etape=1
EndIf

If etape=1
 
  ForEach trait()
    If trait()\objetetat=1;- raquette

      DisplayTransparentSprite ( #raquette , trait()\objetx, trait()\objety)
     
      If KeyboardPushed ( #PB_Key_Up ) And trait()\objety>10:trait()\objety-5:EndIf ; haut.
      If KeyboardPushed ( #PB_Key_Down ) And trait()\objety<732:trait()\objety+5:EndIf ; bas.    

      If KeyboardPushed ( #PB_Key_Right ) And trait()\objetx<932:trait()\objetx+5:EndIf ; droite.  
      If KeyboardPushed ( #PB_Key_Left ) And trait()\objetx>0:trait()\objetx-5:EndIf ; gauche.        
    EndIf    
  Next  



;- fabrication tir *************
  If KeyboardPushed(#PB_Key_X)=0 And tempoA=2:tempoA=0:EndIf
  If KeyboardPushed(#PB_Key_X) And tempoA=0:tempoA=1:EndIf
  If tempoA=1:tempoA=2
     
    LastElement(tir())
    AddElement(tir())
    tir()\objetetat=1
    tir()\objetx=512
    tir()\objety=384    
    tir()\objetspeed=16 ;- vitesse des boulettes

    ForEach trait()
      If trait()\objetetat=1;- raquette( ici la cible, car nous avons besoin de connaitre ses coordonn�es X et Y)
        ; pense b�te: GetAngle( bouletteX,bouletteY, cibleX,cibleY)
       
        tir()\objetangle = GetAngle(tir()\objetx,tir()\objety, trait()\objetx+16,trait()\objety)
       
        ; milieu de la raquette(taille:64*16) -> 64/2=32 puis 32-16( car disque rouge 16) et donc trait()\objetx+16
      EndIf
    Next
     
    tir()\objetxs = Sin(tir()\objetangle*(3.14/180))*tir()\objetspeed
    tir()\objetys = Cos(tir()\objetangle*(3.14/180))*tir()\objetspeed

  EndIf
; fin fabrication tir **********



nbrtir=0  
  ForEach tir()
    If tir()\objetetat=1;- clone tir
      nbrtir+1 ; connaitre le nbre de tirs
     
      DisplayTransparentSprite ( #tird , tir()\objetx, tir()\objety)
     
      tir()\objetx=tir()\objetx+tir()\objetxs
      tir()\objety=tir()\objety+tir()\objetys

     
      If tir()\objetx>1024 Or tir()\objetx<0 Or tir()\objety>700 Or tir()\objety<0
        DeleteElement(tir())
        Continue
      EndIf
     
    EndIf    
  Next  
   
EndIf
 
 
  StartDrawing ( ScreenOutput ())
    DrawingMode (1)
      ;DrawingFont ( FontID (0))
      FrontColor ( RGB (255,255,255))
     rezut1$= Str (rezut1)
     rezut2$= Str (rezut2)
     
     FrontColor ( RGB (154,154,154)) :DrawText (1+1,220+1, "rezut1: " +rezut1$)
     FrontColor ( RGB (234,234,234)) :DrawText (1,220, "rezut1: " +rezut1$)
     FrontColor ( RGB (154,154,154)) :DrawText (1+1,240+1, "rezut2: " +rezut2$)
     FrontColor ( RGB (234,234,234)) :DrawText (1,240, "rezut2: " +rezut2$)

      FrontColor ( RGB (154,154,154)) :DrawText (350+1,20+1, "push X")
      FrontColor ( RGB (234,234,234)) :DrawText (350,20, "push X")
 
      nbrtir$= Str (nbrtir)
      FrontColor ( RGB (164,21,21)) :DrawText (42+1, 4+1, "  " +nbrtir$)
      FrontColor ( RGB (253,201,255)) :DrawText (42, 4, "  " +nbrtir$)
 
  StopDrawing ()
 
 
 
  Stop3D(); on place cette commande � la fin de la boucle principale.
 FlipBuffers()
 ClearScreen(RGB(0, 42, 255))
; ******************************************************************************************************  
 If Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ):End:EndIf; si clique coin haut droit ou touche Esc, alors ferme fen�tre.
ForEver








; IDE Options = PureBasic 4.61 (Windows - x86)
; CursorPosition = 2
; FirstLine = 96
; Folding = -