; 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 = -