J'ai rajouté :
la variable "trace" pour savoir si il fallait tracer ou pas les courbes
le sprite "calque" pour dessiner les trajectoires
le sprite "calque noir" pour écraser le sprite "calque" lorsqu'on revient au mode normal (pour cela j'ai utilisé(et découvert!!!) la fonction copysprite )
j'utilise les mêmes sprites que Cédéravic (voir page 1 du sujet)
j'ai étiré l'écran
j'ai activé la touche F4 (quand on appuie ça trace!)
P.S chez moi j'ai modifié le sprite "background" qui était un peu trop lumineux
Voilà le code:
Code : Tout sélectionner
;***************variables utilisées**********************
xs.f=260; pour le soleil
ys.f=220
xt.f=0; pour la terre
yt.f=0
xl.f=0; pour la lune
yl.f=0
rt.f=160; rayon de l'orbite terrestre
rl.f=50; rayon de l'orbite lunaire
theta.f=0; angle pour la rotation de la terre
phi.f=0; angle pour la rotation de la lune
psi.f=0; angle de rotation de la lune par rapport au soleil
psi1.f=0; variable qui permet de travailler avec 0<psi<360
alpha1.f=0 ; angles qui nous renseignent sur les parties éclairées et sombres de la lune
alpha2.f=0
alpha3.f=0
alpha4.f=0
Angle.f = 0.0
IncAngle.f = 0.5
trace=0
#Pi=3.1415927
; Enumeration des constantes pour les sprites (ça evite de s'embrouiller avec les nombres)
Enumeration
#SPR_Background
#spr_calque
#spr_calquenoir
#SPR_Terre
#SPR_OmbreTerre
#SPR_Lune
#SPR_LuneMini
#SPR_OmbreLune
#SPR_Soleil
#SPR_RayonsSoleil
EndEnumeration
;*************initialisation**********************
InitSprite()
InitKeyboard()
InitSprite3D ()
OpenWindow (1, 1,1, 1000, 840,#PB_Window_ScreenCentered+ #PB_Window_SystemMenu , "Les phases de la Lune" ) ; on ouvre une fenetre
OpenWindowedScreen ( WindowID (1) , 0, 0, 600, 500, 1, 1, 1) ; on met un ecran dedans !!
UsePNGImageDecoder()
LoadFont(1, "Lucida Console", 8, #PB_Font_HighQuality | #PB_Font_Bold)
LoadSprite(#SPR_Background, "Background.png")
;***********************sprite terre***************************************
LoadSprite(#SPR_Terre, "Terre.png", #PB_Sprite_Texture)
CreateSprite3D(#SPR_Terre, #SPR_Terre)
; Creation de 2 sprite temporaire pour faire le sprite d'ombrage de la terre
TempSpr1 = CreateSprite (#PB_Any,32,32) ;terre éclairée sprite 32*32
StartDrawing ( SpriteOutput (TempSpr1))
Circle (16,16, 16, RGB(196, 196, 196))
StopDrawing ()
TempSpr2 = CreateSprite (#PB_Any,32,32) ; terre non éclairée sprite 32*32
StartDrawing ( SpriteOutput (TempSpr2))
Circle (16,16, 16, RGB(12,12, 12))
StopDrawing ()
ClipSprite(TempSpr1,0,0,16,32);découpage terre éclairée
ClipSprite(TempSpr2,16,0,16,32); découpage terre non éclairée
DisplaySprite(TempSpr1,100,100);affichage des deux sprites
DisplaySprite(TempSpr2,116,100)
GrabSprite(#SPR_OmbreTerre,100,100,32,32,#PB_Sprite_Texture) ;capture d'écran et création du sprite(3) terre
; moitié éclairée moitié sombre
CreateSprite3D(#SPR_OmbreTerre,#SPR_OmbreTerre)
FreeSprite(TempSpr1)
FreeSprite(TempSpr2)
;******************************sprite lune**************************************
LoadSprite(#SPR_Lune, "Lune.png", #PB_Sprite_Texture)
CreateSprite3D(#SPR_Lune, #SPR_Lune)
LoadSprite(#SPR_LuneMini, "Lune_mini.png", #PB_Sprite_Texture)
CreateSprite3D(#SPR_LuneMini, #SPR_LuneMini)
; Creation de 2 sprite temporaire pour faire le sprite d'ombrage de la lune
TempSpr1 = CreateSprite (#PB_Any,16,16) ;lune éclairée sprite 16*16
StartDrawing ( SpriteOutput (TempSpr1))
Circle (8,8,8, RGB(235, 235, 235))
StopDrawing ()
TempSpr2 = CreateSprite (#PB_Any,16,16) ; lune non éclairée sprite 16*16
StartDrawing ( SpriteOutput (TempSpr2))
Circle (8,8, 8, RGB(115, 115, 115))
StopDrawing ()
ClipSprite(TempSpr1,0,0,8,16);découpage lune éclairée
ClipSprite(TempSpr2,8,0,8,16); découpage lune non éclairée
DisplaySprite(TempSpr1,100,132);affichage des deux sprites
DisplaySprite(TempSpr2,108,132)
GrabSprite(#SPR_OmbreLune,100,132,16,16,#PB_Sprite_Texture) ;capture d'écran et création du sprite(6) lune
CreateSprite3D(#SPR_OmbreLune,#SPR_OmbreLune)
FreeSprite(TempSpr1)
FreeSprite(TempSpr2)
;*********************************** sprite soleil******************************
LoadSprite(#SPR_Soleil, "Soleil.png", #PB_Sprite_Texture)
CreateSprite3D(#SPR_Soleil, #SPR_Soleil)
LoadSprite(#SPR_RayonsSoleil, "RayonsSoleil.png", #PB_Sprite_Texture)
CreateSprite3D(#SPR_RayonsSoleil, #SPR_RayonsSoleil)
;************************************calque**************************************
CreateSprite(#spr_calque,600,500)
;************************************calquenoir**************************************
CreateSprite(#spr_calquenoir,600,500)
;***************************programme principal****************************************
Repeat ; boucle principale
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = #Null
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
If KeyboardReleased(#PB_Key_F1)
Pause=1-Pause
EndIf
If KeyboardReleased(#PB_Key_F2)
Pause=1
Angle=ValF(InputRequester("Titre","Donnez l'angle en degré :",StrF(Angle)))
EndIf
If KeyboardReleased(#PB_Key_F3)
IncAngle=ValF(InputRequester("Titre","Donnez le pas d'incrementation de l'angle :",StrF(IncAngle)))
EndIf
If KeyboardReleased(#PB_Key_F4)
trace=trace+1
If trace>1
trace=0
EndIf
EndIf
EndIf
; ***********calcul des trajectoires*************
If Pause=0
Angle + IncAngle
If Angle>=360
Angle=0
EndIf
EndIf
theta=#Pi*Angle/180 ;conversions en radians
phi=#Pi*Angle/15 -Int(Angle/30)*2*#Pi ; calcul pour garder 0<phi<360
xt=xs+rt*Cos(-theta); coords de la terre
yt=ys+rt*Sin(-theta)
xl=xt+rl*Cos(-phi); coords de la lune
yl=yt+rl*Sin(-phi)
If (xl-xs)>0 ; calcul de psi, l'angle Lune/Soleil
psi=180*ATan((yl-ys)/(xl-xs))/#Pi ; psi directement en degrés!
EndIf
If (xl-xs)<0
psi=180*(ATan((yl-ys)/(xl-xs))/#Pi-1); psi en degrés
EndIf
;****************affichage des sprites***************************
DisplaySprite(#SPR_Background, 0, 0) ; Pas de besoin de ClearScreen car le sprite recouvre tout l'écran
;travail avec des angles positifs
If psi<=0
psi1=-psi
EndIf
If psi>0
psi1=360-psi
EndIf
alpha1=180+psi1-phi*180/#Pi ; alpha=psi-phi modulo 180
alpha2=-180+psi1-phi*180/#Pi ; à cause de ça je teste tous les cas
alpha3= psi1-phi*180/#Pi
alpha4= 360+psi1-phi*180/#Pi
StartDrawing(ScreenOutput())
DrawingFont(FontID())
FrontColor(255,255,255)
DrawingMode(1)
Locate(5,440)
DrawText("F1 visualisation de la phase de la Lune | F2 choix de l'angle Terre/Soleil")
Locate(5,460)
DrawText ("F3 choix du pas d'incrémentation de l'angle |F4 trajectoires | Esc quitter")
Locate(xt+20,yt+20)
DrawText(StrF(theta*180/#Pi,2))
Locate(xl+12,yl+12)
DrawText(StrF(phi*180/#Pi,2))
If Pause = 1
LineXY(xt,yt,xl,yl,RGB(255, 255, 255)); ligne qui relie la Terre à la Lune pour préciser où se
;trouve l'observateur
EndIf
;en fonction de l'alpha choisi, la manière de dessiner change
;********alpha1*****************
If alpha1>=0 And alpha1<=180
Locate(10,5)
DrawText("Partie éclairée de la Lune = "+StrF(alpha1*100/180,2)+" %")
If Cos(alpha1*#Pi/180)<0 And Sin(alpha1*#Pi/180)>0
Circle(568,32,32,RGB(128, 128, 128))
Box(568,0,32,64,RGB(0, 0, 0))
Ellipse(568,32,32*Cos(alpha1*#Pi/180),32,RGB(128, 128, 128))
EndIf
If Cos(alpha1*#Pi/180)>0 And Sin(alpha1*#Pi/180)>0
Circle(568,32,32,RGB(128, 128, 128))
Ellipse(568,32,32*Cos(alpha1*#Pi/180),32,RGB(0,0,0))
Box(568,0,32,64,RGB(0, 0, 0))
EndIf
EndIf
;*******alpha2******************
If alpha2>0 And alpha2<180
Locate(10,5)
DrawText("Partie éclairée de la Lune = "+StrF(alpha2*100/180,2)+"%")
If Cos(alpha2*#Pi/180)<0 And Sin(alpha2*#Pi/180)>0
Circle(568,32,32,RGB(128, 128, 128))
Box(568,0,32,64,RGB(0, 0, 0))
Ellipse(568,32,32*Cos(alpha2*#Pi/180),32,RGB(128, 128, 128))
EndIf
If Cos(alpha2*#Pi/180)>0 And Sin(alpha2*#Pi/180)>0
Circle(568,32,32,RGB(128, 128, 128))
Ellipse(568,32,32*Cos(alpha2*#Pi/180),32,RGB(0,0,0))
Box(568,0,32,64,RGB(0, 0, 0))
EndIf
EndIf
;*********************alpha3************
If alpha3>0 And alpha3<180
Locate(10,5)
DrawText("Partie éclairée de la Lune = "+StrF(100-alpha3*100/180,2)+"%")
If Cos(alpha3*#Pi/180)<0 And Sin(alpha3*#Pi/180)>0
Circle(568,32,32,RGB(128, 128, 128))
Ellipse(568,32,32*Cos(alpha3*#Pi/180),32,RGB(0,0,0))
Box(536,0,32,64,RGB(0, 0, 0))
EndIf
If Cos(alpha3*#Pi/180)>0 And Sin(alpha3*#Pi/180)>0
Circle(568,32,32,RGB(128, 128, 128))
Box(536,0,32,64,RGB(0, 0, 0))
Ellipse(568,32,32*Cos(alpha3*#Pi/180),32,RGB(128, 128, 128))
EndIf
EndIf
;**************************alpha4**********
If alpha4>0 And alpha4<180
Locate(10,5)
DrawText("Partie éclairée de la Lune = "+StrF(100-alpha4*100/180,2)+"%")
If Cos(alpha4*#Pi/180)<0 And Sin(alpha4*#Pi/180)>0
Circle(568,32,32,RGB(128, 128, 128))
Ellipse(568,32,32*Cos(alpha4*#Pi/180),32,RGB(0,0,0))
Box(536,0,32,64,RGB(0, 0, 0))
EndIf
If Cos(alpha4*#Pi/180)>0 And Sin(alpha4*#Pi/180)>0
Circle(568,32,32,RGB(128, 128, 128))
Box(536,0,32,64,RGB(0, 0, 0))
Ellipse(568,32,32*Cos(alpha4*#Pi/180),32,RGB(128, 128, 128))
EndIf
EndIf
;*********************************************************
LineXY(535,0,600,0) ; cadre pour la Lune en haut à droite
LineXY(535,0,535,64)
LineXY(600,0,600,64)
LineXY(535,64,600,64)
StopDrawing()
Start3D(); utilisation des effets de la 3D pour la rotation des sprites
RotateSprite3D(#SPR_Terre,-theta*180/#Pi,0); rotation de la terre avec l'angle en degrés
RotateSprite3D(#SPR_OmbreTerre,-theta*180/#Pi,0)
RotateSprite3D(#SPR_LuneMini,psi,0) ; rotation de la Lune
RotateSprite3D(#SPR_OmbreLune,psi,0)
Sprite3DBlendingMode(5, 7) ; change le BlendingMode pour un meilleur effet
DisplaySprite3D(#SPR_RayonsSoleil,xs-48,ys-48, 255) ; affichage rayons soleil
DisplaySprite3D(#SPR_Soleil,xs-48,ys-48, 255) ; affichage soleil
Sprite3DBlendingMode(5, 6)
DisplaySprite3D(#SPR_Terre,xt-16,yt-16, 255) ; affichage terre
DisplaySprite3D(#SPR_OmbreTerre, xt-16,yt-16,128)
DisplaySprite3D(#SPR_LuneMini,xl-8,yl-8, 255) ; affichage lune
DisplaySprite3D(#SPR_OmbreLune, xl-8,yl-8, 128)
DisplaySprite3D(#SPR_Lune, 536, 1, 128) ; ombrage lune (haut droit)
Stop3D()
;*******************visualisation de la trajectoire*****************
StartDrawing(SpriteOutput(#spr_calque))
Plot(xl,yl,RGB($80,$0,$FF))
Plot(xt,yt,RGB($0,$FF,$FF))
StopDrawing()
If trace=1
DisplayTransparentSprite(#spr_calque,0,0)
Else
CopySprite(#spr_calquenoir,#spr_calque)
EndIf
;************************************************
FlipBuffers () ;
Delay(60)
ForEver
Hasta la vista!
Si on m'avait dit j'y aurais pas cru!!! Vive PureBasic!!!
Question: est-ce possible d'enlever le carré noir autour de la terre???(si on fonce le décor y a pas de problèmes (pani pwoblem quoi!)