Newton 2016.....featuring PureSat_One!
Petit rafraîchissement!
J'ai remis la source corrigée sur le premier message (grâce à EDIT!)
J'ai rajouté les échelles utilisées dans le menu F1
A+
J'ai rajouté les échelles utilisées dans le menu F1
A+
Elevé au MSX !
J'ai aussi corrigé quelques petites erreurs de placement des sprites!
Les valeurs possibles de satellisation on légèrement changées!!!
Les valeurs possibles de satellisation on légèrement changées!!!
Dernière modification par Huitbit le mer. 18/janv./2006 4:00, modifié 1 fois.
Elevé au MSX !
Mon cas s'aggrave!!!

Mea culpa, mea maxima culpa!
J'ai essayé d'effacer après ton message parce que le bouton propose editer/supprimer.... mais j'y arrive pas, la routine quoi!
Elevé au MSX !
Petite amélioration!
J'ai rajouté le tracer de la trajectoire, ça manquait!
(voir premier message)
Je crois que pour EDIT, c'est bon!
J'avais posé une question sur les gadgets:
Peut-on mettre un gadget(qui réponde quand on clique dessus!) sur un "screen" (pour pas avoir de problèmes, je les met toujours sur le "window")?

(voir premier message)
Je crois que pour EDIT, c'est bon!

J'avais posé une question sur les gadgets:
Peut-on mettre un gadget(qui réponde quand on clique dessus!) sur un "screen" (pour pas avoir de problèmes, je les met toujours sur le "window")?
Elevé au MSX !
Bonjour Huitbit.
Pour répondre à ta question sur le screen et les gadgets, à ma connaissance c'est non. Il faut les fabriquer. Je crois qu'il y a un post de Chris qui en parle, mais je ne suis pas sur.
Pour ma part, je te met un exemple de ce que j'utilise dans ce cas:
Il y a peut être plus simple. Moi j'utilisai déjà ce truc en GFA quand je n'utilisai pas les fenêtres. Le spécialiste de la question c'est sûrement Dobro. 
J'espère avoir répondu à ta question.
A+
André.
Pour répondre à ta question sur le screen et les gadgets, à ma connaissance c'est non. Il faut les fabriquer. Je crois qu'il y a un post de Chris qui en parle, mais je ne suis pas sur.

Pour ma part, je te met un exemple de ce que j'utilise dans ce cas:
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

J'espère avoir répondu à ta question.
A+
André.
sinon pour une boucle correcte, sans ralentissement ni consommation cpu excessive :
interessant ce code merci.
interessant ce code merci.
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
Okay!
@Dobro, Good07
Merci pour l'info sur les gadgets!
j'avais pas pensé à les dessiner!
C'est vrai qu'un truc automatique ça aurait été pratique, mais là on peut donner la forme que l'on veut(cercle, ellipse,...) du moment qu'on teste correctement la zone de click!
@Flype
Pour les boucles repeat, windowevent() , la différence est impressionante, on passe de >90% à <35% sans grande modification!!
Ce doit être là que Dobro voulait que je mette mon delay!!!!!
Un repeat mal placé, ça fait la différence!
Est-ce qu'il y a une structure idéale type de gestion des évenements(est-ce que c'est celle-là)?
Parce qu'un truc que je mettrais en début de programme de manière systématique, ça serait vraiment bien (c'est ce que je fais, mais je contrôle pas grand chose en fait, comme tu as pû le remarquer, je fais un peu du copier coller sans refléchir
!!!! ):P
Hasta la proxima!
Merci pour l'info sur les gadgets!
j'avais pas pensé à les dessiner!
C'est vrai qu'un truc automatique ça aurait été pratique, mais là on peut donner la forme que l'on veut(cercle, ellipse,...) du moment qu'on teste correctement la zone de click!
@Flype
Pour les boucles repeat, windowevent() , la différence est impressionante, on passe de >90% à <35% sans grande modification!!
Ce doit être là que Dobro voulait que je mette mon delay!!!!!
Un repeat mal placé, ça fait la différence!

Parce qu'un truc que je mettrais en début de programme de manière systématique, ça serait vraiment bien (c'est ce que je fais, mais je contrôle pas grand chose en fait, comme tu as pû le remarquer, je fais un peu du copier coller sans refléchir

Hasta la proxima!
Elevé au MSX !