Un peu d'histoire...
Depuis la nuit des temps, l'Homme, dès qu'il avait le ventre plein, levait les yeux vers le ciel (hé oui, à quoi pensiez-vous?).
Et il s'est vite aperçu qu'il y avait des "étoiles" qui ne se comportaient pas comme les autres.
Planète vient du grec "planêtês" qui veut dire astre errant.
La trajectoire de Mars(et des autres planètes) dans le ciel est assez surprenante puisque la planète fait "marche arrière" à une certaine période de l'année!
C'est la rétrogradation de Mars.
J'ai fait un petit bilan de toutes les fonctions(voir les autres sources!) que j'ai vu (à part clipsprite et grabsprite).
Cette fois-ci pour faire les sprites des ombres j'ai utilisé drawingmod(4) et fillarea(c'est plus rapide)!
J'utilise une image (format PNG) 32*32 de Mars sur fond noir et une image (format PNG de 64*64 de la Terre) sur fond noir
le prog est fait pour un écran de 1028*768
Voilà le code commenté:
Code : Tout sélectionner
;**********rétrogradation de Mars**********
;**********constantes*********
#pi = 3.1415927
#rayon_terre=6.38
#orbite_terre=1
#periode_terre=1
#rayon_mars=3.40
#orbite_mars=1.524
#periode_mars= 1.88
Enumeration
#spr_background
#spr_terre
#spr_ombreterre
#spr_miniterre
#spr_mars
#spr_ombremars
#spr_minimars
#spr_calque
#spr_calquevierge
EndEnumeration
;**********variables**********
angle.f=0
inc_angle.f=0.8
angle_mars.f=25.9
x_terre.f=0
y_terre.f=0
x_miniterre.f=0
y_miniterre.f=0
x_mars.f=0
y_mars.f=0
x_minimars.f=0
y_minimars.f=0
trace.l=0
Pause.l=0
;**********initialisation**********
InitSprite()
InitSprite3D()
InitKeyboard()
OpenWindow(1,0,0,1024,768,#PB_Window_ScreenCentered| #PB_Window_BorderLess,"Rétrogradation de la planète Mars")
OpenWindowedScreen(WindowID(1),0,0,1024,736,0,0,0)
UsePNGImageDecoder()
LoadFont(1,"Papyrus",11,#PB_Font_HighQuality)
;**********fond d'écran**********
CreateSprite(#spr_background,1024,736)
StartDrawing(SpriteOutput(#spr_background))
For etoile =0 To 1000 ;étoiles du cadre principal
x_etoile=Random(758)+5
y_etoile=Random(726)+5
Plot(x_etoile,y_etoile,RGB(Random(10)+240,Random(10)+240,Random(10)+240))
Next etoile
For etoile=0 To 100 ;étoiles du petit cadre
x_etoile=Random(250)+773
y_etoile=Random(246)+5
Plot(x_etoile,y_etoile,RGB(Random(10)+240,Random(10)+240,Random(10)+240))
Next etoile
Circle(896,128,32,RGB($FF,$FF,$0));dessin du mini soleil
Circle(896,128,24,RGB($FF,$FF,$80))
Circle(896,128,16,RGB($FF,$FF,$BF))
Box(768,256,256,256,RGB($0,$80,$80));zone d'infos sur la Terre
Box(768,512,256,224,RGB($80,$40,$40));zone d'infos sur Mars
StopDrawing()
;********** sprite Terre**********
LoadSprite(#spr_terre,"terre.png",#PB_Sprite_Texture)
CreateSprite3D(#spr_terre,#spr_terre)
;**********sprite ombre terre******
CreateSprite(#spr_ombreterre,64,64,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr_ombreterre))
DrawingMode(4);dessine sans remplir les surfaces
Circle(32,32,32,RGB($23,$23,$23))
Line(32,0,0,64,RGB($23,$23,$23))
FillArea(33,32,RGB($23,$23,$23),RGB($23,$23,$23))
StopDrawing()
CreateSprite3D(#spr_ombreterre,#spr_ombreterre)
;**********sprite miniterre**********
CreateSprite(#spr_miniterre,16,16,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr_miniterre))
DrawingMode(4);dessine sans remplir les surfaces
Circle(8,8,8,RGB($0,$40,$80))
Line(8,0,0,16,RGB($0,$40,$80))
FillArea(9,8,RGB($0,$40,$80),RGB($0,$40,$80))
FillArea(7,8,RGB($0,$40,$80),RGB($0,$FF,$FF))
StopDrawing()
CreateSprite3D(#spr_miniterre,#spr_miniterre)
;********** sprite mars*********
LoadSprite(#spr_mars,"mars.png",#PB_Sprite_Texture)
CreateSprite3D(#spr_mars,#spr_mars)
;**********sprite ombre mars******
CreateSprite(#spr_ombremars,32,32,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr_ombremars))
DrawingMode(4);dessine sans remplir les surfaces
Circle(16,16,15,RGB($23,$23,$23))
Line(16,0,0,32,RGB($23,$23,$23))
FillArea(17,16,RGB($23,$23,$23),RGB($23,$23,$23))
StopDrawing()
CreateSprite3D(#spr_ombremars,#spr_ombremars)
;**********sprite minimars**********
CreateSprite(#spr_minimars,8,8,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr_minimars))
DrawingMode(4);dessine sans remplir les surfaces
Circle(4,4,4,RGB($80,$40,$40))
Line(4,0,0,8,RGB($80,$40,$40))
FillArea(5,4,RGB($80,$40,$40),RGB($80,$40,$40))
FillArea(3,4,RGB($80,$40,$40),RGB($FF,$0,$0))
StopDrawing()
CreateSprite3D(#spr_minimars,#spr_minimars)
;**********sprite calque**********
CreateSprite(#spr_calque,768,736)
;**********sprite calque vierge**********
CreateSprite(#spr_calquevierge,768,736)
;*********boutons de commande**********
CreateGadgetList(WindowID(1))
ButtonGadget(1,0,736,90,32,"Quitter" )
ButtonGadget(2,90,736,90,32,"Tracer / Effacer")
ButtonGadget(3,180,736,90,32,"Pause / Reprise")
ButtonGadget(4,270,736,55,32,"Ralentir")
ButtonGadget(5,325,736,55,32,"Accélérer")
;**********programme principal*********
Repeat ; boucle principale
Repeat
event = WindowEvent()
Select event
Case #PB_EventGadget
Select EventGadgetID()
Case 1
End
Case 2
trace=trace+1
If trace>1
trace=0
EndIf
Case 3
Pause=Pause+1
If Pause>1
Pause=0
inc_angle=0.8
EndIf
Case 4
If inc_angle>0.4
inc_angle=inc_angle-0.2
Else
inc_angle=0.2
EndIf
Case 5
If inc_angle <2
inc_angle=inc_angle+0.2
Else
inc_angle=2
EndIf
EndSelect
EndSelect
Until event = #Null
If Pause=0
angle=angle+inc_angle
If angle>=36000 ; observation sur un siècle
angle=0
EndIf
EndIf
;*********fond d'écran**********
DisplaySprite(#spr_background,0,0)
;**********infos sur les deux planètes**********
StartDrawing(ScreenOutput())
DrawingFont(FontID())
FrontColor(255,255,255)
DrawingMode(1)
Locate(768,256)
DrawText(" Planète Terre "+Str(Int(365.25*angle/360))+" jours ( "+Str(Int(angle/360))+" an(s))")
Locate(768,296)
DrawText(" Rayon terrestre = 6380 km")
Locate(768,336)
DrawText(" Jour sidéral = 23h 56min 4s ")
Locate(768,356)
DrawText(" ( mouvement ralenti sur l'écran )")
Locate(768,396)
DrawText(" Période de révolution T = 365,25 jours")
Locate(768,436)
DrawText(" Déphasage Mars / Terre: ")
Locate(768,456)
DrawText(" 25,9° le 7 janvier 2006 ")
Locate(768,512)
DrawText(" Planète Mars ")
Locate(768,552)
DrawText(" Rayon martien = 3400 km")
Locate(768,592)
DrawText(" Jour sidéral = 24h 37min 23s ")
Locate(768,612)
DrawText(" ( mouvement ralenti sur l'écran )")
Locate(768,652)
DrawText(" Période de révolution T = 687 jours")
StopDrawing()
;**********calcul des trajectoires**********
x_miniterre=64*#orbite_terre*Cos(-angle*#pi/180)+888
y_miniterre=64*#orbite_terre*Sin(-angle*#pi/180)+120
x_minimars=64*#orbite_mars*Cos(-angle*#pi/(180*1.88)+angle_mars)+892
y_minimars=64*#orbite_mars*Sin(-angle*#pi/(180*1.88)+angle_mars)+124
x_mars=2.1*(x_minimars-x_miniterre)+360
y_mars=2.1*(y_minimars-y_miniterre)+360
;**********affichage des sprites et rotation*********
Start3D()
Sprite3DQuality(1)
RotateSprite3D(#spr_terre,-angle*4,0)
RotateSprite3D(#spr_mars,-angle*1.02877*4,0)
RotateSprite3D(#spr_ombreterre,-angle,0)
RotateSprite3D(#spr_ombremars,-angle/1.88,0)
RotateSprite3D(#spr_miniterre,-angle,0)
RotateSprite3D(#spr_minimars,-angle/1.88,0)
DisplaySprite3D(#spr_miniterre,x_miniterre,y_miniterre)
DisplaySprite3D(#spr_minimars,x_minimars,y_minimars)
Sprite3DBlendingMode(5,3);mixage des sprites pour effet d'ombre
DisplaySprite3D(#spr_terre,352,352)
DisplaySprite3D(#spr_ombreterre,352,352)
If x_mars<752
DisplaySprite3D(#spr_mars,x_mars,y_mars)
DisplaySprite3D(#spr_ombremars,x_mars,y_mars)
EndIf
Stop3D()
;**********tracé des trajectoires**********
StartDrawing(SpriteOutput(#spr_calque))
If x_mars>1 And x_mars<760 And y_mars>1 And y_mars<734
Plot(x_mars+16,y_mars+16,RGB($FF,$0,$0));tracé en rouge de la trajectoire
Else
trace=0; interdiction de tracer
EndIf
StopDrawing()
If trace=1 ;on trace
DisplayTransparentSprite(#spr_calque,0 ,0)
Else
CopySprite(#spr_calquevierge,#spr_calque); ou on efface!
EndIf
FlipBuffers ()
ForEver
Si vous avez des idées pour améliorer, lachez-vous!
A+