Publié : lun. 16/janv./2006 16:55
Au fait le satellite peut aussi partir vers la gauche(angle>90)!
Forums PureBasic - Français
http://forums.purebasic.com/french/
Code : Tout sélectionner
#scrw=1024
#scrh=768
#depth=32
#curseur=0
InitSprite()
InitKeyboard()
InitMouse()
If OpenScreen(#scrw,#scrh,#depth,"Essai Bouton")=0
MessageRequester("Attention !", "Could not create DirectX screen",#PB_MessageRequester_Ok)
End
EndIf
CreateSprite(#curseur,16,16,0)
StartDrawing(SpriteOutput(#curseur))
LineXY(8,0,8,16,RGB(255,0,0))
LineXY(0,8,16,8,RGB(255,0,0))
StopDrawing()
Repeat
ExamineMouse()
ClearScreen(251,254,230); on efface l'écran ensuite on dessine le bouton
StartDrawing(ScreenOutput())
Box(10,10,50,20,RGB(196,196,196))
LineXY(10,10,60,10,RGB(255,255,255))
LineXY(10,10,10,29,RGB(255,255,255))
LineXY(60,11,60,29,RGB(0,0,0))
LineXY(10,29,59,29,RGB(0,0,0))
DrawingMode(1)
Locate(15,12)
DrawText("Retour")
StopDrawing()
xcurseur=MouseX()
ycurseur=MouseY()
DisplayTransparentSprite(#curseur,xcurseur,ycurseur)
StartDrawing(ScreenOutput())
Locate(100,10)
DrawText("Touche Escape pour Quitter")
StopDrawing()
; On teste la position de la souris pour savoir si on a bien cliquer sur le bouton. Si oui on dessine le bouton enfoncé
If xcurseur+8>10 And ycurseur+8>10 And xcurseur+8<60 And ycurseur+8<30 And MouseButton(1)<>0
StartDrawing(ScreenOutput())
LineXY(10,10,60,10,RGB(0,0,0))
LineXY(10,10,10,29,RGB(0,0,0))
LineXY(60,11,60,29,RGB(255,255,255))
LineXY(10,29,59,29,RGB(255,255,255))
Locate(10,100)
DrawText("Bouton enfoncé")
StopDrawing()
; Mettre ici l'action à exécuter si le bouton a été enfoncé
EndIf
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape); press Esc to quit
CloseScreen()
End
MerciLe spécialiste de la question c'est sûrement Dobro
Code : Tout sélectionner
;**********constante **********
#pi=3.1415927
#LargeurEcran=896
#HauteurEcran=600
#rayon_terre=128
#coeff_gravitation=-160548.26 ; -G*Masse_Terre*#rayon_terre^2/Rayon_Terre^2
;*****************variables utilisées********************
;*****************pour dessiner le fond d'écran**********
x_tache.f=0
y_tache.f=0
r_tache.f=0
;****************pour le satellite************************
x_PureSat_One.f=432
y_PureSat_One.f=110
old_x_PureSat_One=x_PureSat_One
old_y_PureSat_One=y_PureSat_One
altitude.f=40
v_PureSat_One.f=35
Angle_PureSat_One=45
vx_PureSat_One.f=0
vy_PureSat_One.f=0
r_PureSat_One=Sqr(Pow((x_PureSat_One-432),2)+Pow((y_PureSat_One-284),2)); rayon de l'orbite
dt.f=0.08 ;pas de calcul
pause.l=1; 1:pause 0:relance
depart.l=0; 1: lancement 0: retour à la base!
trace.l=0; 1:tracer 0:effacer
Enumeration
#spr_background
#spr_PureSat_One
#spr_calque
#spr_calquevierge
EndEnumeration
;*****************initialisation**************************
InitKeyboard()
InitSprite()
InitSprite3D()
;*****************écrans*********************************
OpenWindow(1,1,1,#LargeurEcran,#HauteurEcran+20,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Appuyez sur F1 puis Départ pour paramétrer et réussir la mise en orbite du satellite!"); on ouvre une fenêtre
OpenWindowedScreen(WindowID(1),0,0,#LargeurEcran,#HauteurEcran,0,1,1); on met un écran dedans
LoadFont(1,"Papyrus",11,#PB_Font_HighQuality|#PB_Font_Bold )
;************** sprite fond d'écran**********************
CreateSprite(#spr_background,#LargeurEcran,#HauteurEcran)
StartDrawing(SpriteOutput(#spr_background))
For tache =1 To 1000 ; fond étoilé
x_tache=Random(#LargeurEcran-5)
y_tache=Random(#HauteurEcran-5)
Plot(x_tache,y_tache,RGB(Random(50)+200,Random(50)+200,Random(100)+150))
Next tache
Circle(#LargeurEcran/2,#HauteurEcran/2,128,RGB($0,$4A,$95));globe+montagne
LineXY(428,175,458,175,RGB($0,$4A,$95))
LineXY(458,175,448,156,RGB($0,$4A,$95))
LineXY(448,156,440,168,RGB($0,$4A,$95))
LineXY(440,168,435,162,RGB($0,$4A,$95))
LineXY(435,162,428,175,RGB($0,$4A,$95))
FillArea(448,168,RGB($0,$4A,$95),RGB($80,$80,$0))
For tache =1 To 600; taches sur le globe
x_tache=Random(256)
y_tache=Random(256)
r_tache=Random(8)
If (Pow((x_tache+320-#LargeurEcran/2),2)+Pow((y_tache+172-#HauteurEcran/2),2))<Pow(#rayon_terre-8,2)
Circle(x_tache+320,y_tache+172,r_tache,RGB(Random(180),$80,$0))
EndIf
Next tache
StopDrawing()
;**********************sprite PureSat_One*********************************
CreateSprite(#spr_PureSat_One,32,32,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr_PureSat_One))
LineXY(8,16,24,16,RGB($40,$80,$80))
Circle(16,16,5,RGB($80,$80,$80))
Box(0,10,8,12,RGB($61,$AF,$AF))
Box(24,10,8,12,RGB($61,$AF,$AF))
LineXY(16,10,16,8,RGB($FF,$80,$0))
Circle(16,7,2,RGB($FF,$0,$0))
StopDrawing()
CreateSprite3D(#spr_PureSat_One,#spr_PureSat_One)
;**********sprite calque******************************
CreateSprite(#spr_calque,#LargeurEcran,#HauteurEcran)
;**********sprite calquevierge********************
CreateSprite(#spr_calquevierge,#LargeurEcran,#HauteurEcran)
;***************************gadgets********************
CreateGadgetList(WindowID(1))
ButtonGadget(1,0,#HauteurEcran,90,20,"Départ" )
ButtonGadget(2,90,#HauteurEcran,90,20,"Pause/Reprise")
ButtonGadget(3,180,#HauteurEcran,90,20,"Tracer/Effacer")
ButtonGadget(4,270,#HauteurEcran,90,20,"Quitter")
;*****************************************************
Repeat ; boucle principale
Delay(25)
Select WindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_EventGadget
Select EventGadgetID()
Case 1 ;initialisation ou retour à la base!
x_PureSat_One.f=432
y_PureSat_One.f=150-altitude
old_x_PureSat_One=x_PureSat_One
old_y_PureSat_One=y_PureSat_One
r_PureSat_One=Sqr(Pow((x_PureSat_One-432),2)+Pow((y_PureSat_One-284),2))
vx_PureSat_One=v_PureSat_One*Cos(-Angle_PureSat_One*#pi/180)
vy_PureSat_One=v_PureSat_One*Sin(-Angle_PureSat_One*#pi/180)
i=0
depart=depart+1
pause=0
If depart>1
depart=0
EndIf
Case 2; appuie sur pause
pause=pause+1
If pause>1
pause=0
EndIf
Case 3; appuie sur tracer/effacer
trace=trace+1
If trace>1
trace=0
EndIf
Case 4; fin
End
EndSelect
EndSelect
; menu interactif pour le paramétrage du satellite
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
pause=1
depart=0
v_PureSat_One=ValF(InputRequester("Conditions initiales","Donnez la vitesse de lancement (1 unité ~ 0,233 km/s) :",StrF(v_PureSat_One)) )
Angle_PureSat_One=ValF(InputRequester("Conditions initiales","Donnez l'angle de lancement(0~360) :",StrF(Angle_PureSat_One)))
altitude=ValF(InputRequester("Conditions initiales","Donnez l'altitude (1 unité ~ 49,8 km) :",StrF(altitude)))
x_PureSat_One=432
y_PureSat_One=150-altitude
old_x_PureSat_One=x_PureSat_One
old_y_PureSat_One=y_PureSat_One
r_PureSat_One=Sqr(Pow((x_PureSat_One-432),2)+Pow((y_PureSat_One-284),2))
vx_PureSat_One=v_PureSat_One*Cos(-Angle_PureSat_One*#pi/180)
vy_PureSat_One=v_PureSat_One*Sin(-Angle_PureSat_One*#pi/180)
i=0
EndIf
EndIf
;********************angle de rotation du sprite***************************************************************
If pause=0 And depart=1
i=i+1
If i>=360
i=0
EndIf
;**********calcul des coordonnées**********
r_PureSat_One=Sqr(Pow((x_PureSat_One-432),2)+Pow((y_PureSat_One-284),2))
If r_PureSat_One>#rayon_terre+2 ; si le satellite ne touche pas le sol
vx_PureSat_One=vx_PureSat_One+#coeff_gravitation*(x_PureSat_One-432)*dt/Pow(r_PureSat_One,3)
vy_PureSat_One=vy_PureSat_One+#coeff_gravitation*(y_PureSat_One-284)*dt/Pow(r_PureSat_One,3)
old_x_PureSat_One=x_PureSat_One
old_y_PureSat_One=y_PureSat_One
x_PureSat_One=x_PureSat_One+vx_PureSat_One*dt
y_PureSat_One=y_PureSat_One+vy_PureSat_One*dt
Else
pause=1
depart=2
r_PureSat_One=134
EndIf
EndIf
;******************************affichage des sprites et du texte*************
DisplaySprite(#spr_background,0,0)
StartDrawing(ScreenOutput())
DrawingFont(FontID())
FrontColor(255,255,255)
DrawingMode(1)
Locate(0,0)
DrawText("Altitude h= "+StrF((r_PureSat_One-134)*6380/128)+" km")
If depart=1
Locate(0,20)
DrawText("Vitesse v= "+StrF(Sqr(Pow(vx_PureSat_One,2)+Pow(vy_PureSat_One,2))*Sqr(6380000/128)/1000)+" km/s")
Else
Locate(0,20)
DrawText("Vitesse v= 0 km/s ")
EndIf
StopDrawing()
Start3D()
RotateSprite3D(#spr_PureSat_One,i*6,0)
DisplaySprite3D(#spr_PureSat_One,x_PureSat_One,y_PureSat_One)
Stop3D()
;*********tracé des trajectoires****************
If trace=1
StartDrawing(SpriteOutput(#spr_calque))
If x_PureSat_One+16>=0 And x_PureSat_One+16<(#LargeurEcran-1) And y_PureSat_One+16>=0 And y_PureSat_One+16<(#HauteurEcran-1)
LineXY(old_x_PureSat_One+16, old_y_PureSat_One+16,x_PureSat_One+16,y_PureSat_One+16,RGB($FF,$FF,$0))
EndIf
StopDrawing()
EndIf
If trace=1
DisplayTransparentSprite(#spr_calque,0,0)
Else
CopySprite(#spr_calquevierge,#spr_calque)
EndIf
;******************************************************************
FlipBuffers ()
ForEver