Soleil, Terre, Lune....en perspective cavalière (petite MAJ)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Soleil, Terre, Lune....en perspective cavalière (petite MAJ)

Message par Huitbit »

Bonjour et bonne année à tous (ou bonne galette!)

Image

Ce n'est encore qu'un embryon, mais au cas où on m'emprunterait mon ordinateur(le jour de Noël, le Père Noël a essayé de forcer la porte de mon garage :?)

Je souhaite reprendre le programme des phases de la Lune mais en y mettant trois vues différentes (un cadran pour chaque astre).
La perspective cavalière s'adapte idéalement au phénomène vu le rapport des distances(de plus c'est cette représentation qui est utilisée dans les livres)
Je fais quelques approximations car le véritable objectif est de lier la phase de la Lune avec la latitude!
J'ai quand même tenue compte de l'inclinaison de 5° de l'orbite lunaire.

Il y a énormément de constante car pour éviter une fonte de neurones, j'ai décidé de travailler avec un repère (O,x,y) avec les axes dirigés traditionnellement.
Pour l'instant je mets juste les choses en place, je donnerai des détails quand le programme sera plus avancé

REMARQUE : j'ai changé d'écran 1280*1024, j'ai lancé le programme sur un écran 1024*768 sans aucune modifications, on dirait que l'ordinateur fait un redimensionnement automatique! 8O
Est-ce normal? Sinon je ferais un version paramétrable!

Je n'ai pas géré dans le premier cadran, le chevauchement de la Terre et de la Lune, dois-je utiliser la collision des sprites(ça serait super pratique)?

J'ai quelques questions générales sur l'optimisation(voir fin du post)

Code : Tout sélectionner

;********************************* 
;soleil,terre,lune, perspective cavalière 
;PB V4.02 
;MAJ1 passage dela lune derrière le soleil>>>DOBRO
;MAJ2 phases de la lune+ pause=F1+pôles nord et sud
;********************************* 
;constantes 
#l_ecran=1280 
#h_ecran=1024 

#e=8; grandeur caracteristique pour les dessins 
#l_cadre=(#l_ecran-3*#e)*0.5 
#h_cadre=(#h_ecran-3*#e)*0.5 

;**********cadre A********** 
#x_cadre_a=#e 
#y_cadre_a=#h_ecran-#e 
#x_soleil=#x_cadre_a+#l_cadre*0.5 
#y_soleil=#y_cadre_a-#h_cadre*0.5 
#r_soleil=4*#e 
#r_terre_cadre_a=2*#e 
#r_lune_cadre_a=0.5*#e 
#rayon_orbite_terre_a=7*#r_soleil 
#rayon_orbite_lune_a=#r_soleil 
;**********cadre B********** 
#x_cadre_b=2*#e+#l_cadre 
#y_cadre_b=#y_cadre_a 
#x_terre_cadre_b=#x_cadre_b+#l_cadre*0.5 
#y_terre_cadre_b=#y_cadre_b-#h_cadre*0.5 
#r_terre_cadre_b=4*#e 
#r_lune_cadre_b=2*#e 
#changement_echelle_lune_b=7 
#inclinaison_axe_rotation_terre=23.4333*#PI/180;   23°26'
;**********cadre C********** 
#x_cadre_c=#x_cadre_b 
#y_cadre_c=#e+#h_cadre 
#x_lune_cadre_c=#x_cadre_c+#l_cadre*0.5 
#y_lune_cadre_c=#y_cadre_c-#h_cadre*0.5 
#r_lune_cadre_c=4*#e
;**********cadre D********** 
#x_cadre_d=#x_cadre_a 
#y_cadre_d=#y_cadre_c 

;**********Divers********* 
#coefficient_quadrilatere=7.2 
#k_cos_alpha=0.35 
#k_sin_alpha=0.35 
#trimestre_1=365*0.25 
#trimestre_2=365*0.5 
#trimestre_3=365*0.75 

Enumeration 
    #spr_arriere_plan 
    #spr_terreA_d 
    #spr_terreA_p 
    #spr_lune_A 
    #spr_terreB_d 
    #spr_terreB_p 
    #spr_luneB_d 
    #spr_luneB_p 
    #spr_luneC_d
    #spr_luneC_p
EndEnumeration 
Structure donnees 
    x_3D.f 
    y_3D.f 
    z_3D.f 
    x_2D.f 
    y_2D.f 
    phase.f 
    rayon_orbite.f 
    inclinaison_orbite.f 
EndStructure 

;variables 
nombres_etoile.l 
x_etoile.l 
y_etoile.l 
jour.l=0 
terre.donnees 
lune.donnees 
pause.b=0

Procedure.f conversion_3D_2D(*astre.donnees) 
    *astre\x_2D=*astre\x_3D+#k_cos_alpha**astre\y_3D 
    *astre\y_2D=*astre\z_3D+#k_sin_alpha**astre\y_3D 
EndProcedure 
Procedure.f rotation_selon_axe_y(*coordonnees.donnees) 
    *coordonnees\x_3D=*coordonnees\x_3D*Cos(*coordonnees\inclinaison_orbite)+*coordonnees\z_3D*Sin(*coordonnees\inclinaison_orbite) 
    *coordonnees\z_3D=-*coordonnees\x_3D*Sin(*coordonnees\inclinaison_orbite)+*coordonnees\z_3D*Cos(*coordonnees\inclinaison_orbite) 

EndProcedure 
Procedure.f tracer_quadrilatere_MNOP(x_centre.f,y_centre.f,rotation.l) 
    M.donnees 
    n.donnees 
    O.donnees 
    P.donnees 
    
    M\x_3D=-#coefficient_quadrilatere*#r_soleil 
    M\y_3D=#coefficient_quadrilatere*#r_soleil 
    M\z_3D=0 
    n\x_3D=#coefficient_quadrilatere*#r_soleil 
    n\y_3D=#coefficient_quadrilatere*#r_soleil 
    n\z_3D=0 
    O\x_3D=#coefficient_quadrilatere*#r_soleil 
    O\y_3D=-#coefficient_quadrilatere*#r_soleil 
    O\z_3D=0 
    P\x_3D=-#coefficient_quadrilatere*#r_soleil 
    P\y_3D=-#coefficient_quadrilatere*#r_soleil 
    P\z_3D=0 
    If rotation<>0 
        M\inclinaison_orbite=rotation*#PI/180 
        rotation_selon_axe_y(@M) 
        n\inclinaison_orbite=rotation*#PI/180 
        rotation_selon_axe_y(@n) 
        O\inclinaison_orbite=rotation*#PI/180 
        rotation_selon_axe_y(@O) 
        P\inclinaison_orbite=rotation*#PI/180 
        rotation_selon_axe_y(@P) 
    EndIf 
    conversion_3D_2D(@M) 
    conversion_3D_2D(@n) 
    conversion_3D_2D(@O) 
    conversion_3D_2D(@P) 
    StartDrawing(SpriteOutput(#spr_arriere_plan)) 
    ;DrawText(M\xA_2D+x_centre,#h_ecran*0.5-(M\yA_2D+y_centre+2*#intercadre),"Plan de l'écliptique") 
    LineXY(M\x_2D+x_centre,#h_ecran-(M\y_2D+y_centre),n\x_2D+x_centre,#h_ecran-(n\y_2D+y_centre),RGB(55,55,55)) 
    LineXY(P\x_2D+x_centre,#h_ecran-(P\y_2D+y_centre),O\x_2D+x_centre,#h_ecran-(O\y_2D+y_centre),RGB(55,55,55)) 
    LineXY(n\x_2D+x_centre,#h_ecran-(n\y_2D+y_centre),O\x_2D+x_centre,#h_ecran-(O\y_2D+y_centre),RGB(55,55,55)) 
    LineXY(M\x_2D+x_centre,#h_ecran-(M\y_2D+y_centre),P\x_2D+x_centre,#h_ecran-(P\y_2D+y_centre),RGB(55,55,55)) 
    StopDrawing() 
    
EndProcedure 
Procedure.f tracer_cercle(*coordonnees.donnees,inclinaison.l) 
    
EndProcedure 

;***************************************************************************************************************************************
InitSprite() 
InitMouse() 
InitKeyboard() 
OpenScreen(#l_ecran,#h_ecran,32,"Soleil, Terre, Lune 3D") 

;**********création du sprite de fond d'écran********** 
CreateSprite(#spr_arriere_plan,#l_ecran,#h_ecran) 
StartDrawing(SpriteOutput(#spr_arriere_plan)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
;dessin des cadres 
Box(#x_cadre_a,#h_ecran-#y_cadre_a,#l_cadre,#h_cadre,RGB(255, 255, 255)) 
Box(#x_cadre_b,#h_ecran-#y_cadre_b,#l_cadre,#h_cadre,RGB(255, 255, 255)) 
Box(#x_cadre_c,#h_ecran-#y_cadre_c,#l_cadre,#h_cadre,RGB(255, 255, 255)) 
Box(#x_cadre_d,#h_ecran-#y_cadre_d,#l_cadre,#h_cadre,RGB(255, 255, 255)) 
;fond étoilé 
For nombre_etoile=0 To 1000 
    x_etoile=#e+Random(2*#l_cadre+#e) 
    y_etoile=#e+Random(2*#h_cadre+#e) 
    
    ;cadre A 
    If  x_etoile>#x_cadre_a And x_etoile<#x_cadre_a+#l_cadre And y_etoile>(#h_ecran-#y_cadre_a) And y_etoile<(#h_ecran-#y_cadre_a+#h_cadre) 
        Plot(x_etoile,y_etoile,RGB(200,200,200)) 
        ;cadre B 
    ElseIf  x_etoile>#x_cadre_b And x_etoile<#x_cadre_b+#l_cadre And y_etoile>(#h_ecran-#y_cadre_b) And y_etoile<(#h_ecran-#y_cadre_b+#h_cadre) 
        Plot(x_etoile,y_etoile,RGB(200,200,200)) 
        ;cadre C    
    ElseIf  x_etoile>#x_cadre_c And x_etoile<#x_cadre_c+#l_cadre And y_etoile>(#h_ecran-#y_cadre_c) And y_etoile<(#h_ecran-#y_cadre_c+#h_cadre) 
        Plot(x_etoile,y_etoile,RGB(200,200,200)) 
    EndIf        
Next nombre_etoile 
;dessin du  Soleil) 
DrawingMode(#PB_2DDrawing_Default) 
For i=#r_soleil To 1 Step -1 
    Circle(#x_soleil, (#h_ecran-#y_soleil),i, RGB(255,255-2*i,255-4*i)) 
Next i 
;dessin des pôles dans le cadre B (pôle nord en rouge, pôle sud en bleu)
Line(#x_terre_cadre_b+#r_terre_cadre_b*Sin(#inclinaison_axe_rotation_terre),#h_ecran-(#y_terre_cadre_b+#r_terre_cadre_b*Cos(#inclinaison_axe_rotation_terre)),#r_terre_cadre_b*Sin(#inclinaison_axe_rotation_terre),-#r_terre_cadre_b*Cos(#inclinaison_axe_rotation_terre),RGB(255,0,0))
Line(#x_terre_cadre_b-#r_terre_cadre_b*Sin(#inclinaison_axe_rotation_terre),#h_ecran-(#y_terre_cadre_b-#r_terre_cadre_b*Cos(#inclinaison_axe_rotation_terre)),-#r_terre_cadre_b*Sin(#inclinaison_axe_rotation_terre),#r_terre_cadre_b*Cos(#inclinaison_axe_rotation_terre),RGB(0,0,255))

StopDrawing() 
;tracé des plans 
tracer_quadrilatere_MNOP(#x_soleil,#y_soleil,0) 
tracer_quadrilatere_MNOP(#x_terre_cadre_b,#y_terre_cadre_b,0) 
tracer_quadrilatere_MNOP(#x_terre_cadre_b,#y_terre_cadre_b,-5) 

;dessins de la Terre cadre A 
CreateSprite(#spr_terreA_d,2*#r_terre_cadre_a,2*#r_terre_cadre_a) 
StartDrawing(SpriteOutput(#spr_terreA_d)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
Circle(#r_terre_cadre_a,#r_terre_cadre_a,#r_terre_cadre_a,RGB(0,0,155)) 
Line(#r_terre_cadre_a,0,0,2*#r_terre_cadre_a,RGB(0,0,155)) 
FillArea(#r_terre_cadre_a-2,#r_terre_cadre_a,RGB(0,0,155),RGB(0,0,155)) 
FillArea(#r_terre_cadre_a+2,#r_terre_cadre_a,RGB(0,0,155),RGB(0,0,100)) 
StopDrawing() 

CreateSprite(#spr_terreA_p,2*#r_terre_cadre_a,2*#r_terre_cadre_a) 
StartDrawing(SpriteOutput(#spr_terreA_p)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
Circle(#r_terre_cadre_a,#r_terre_cadre_a,#r_terre_cadre_a,RGB(0,0,155)) 
Line(#r_terre_cadre_a,0,0,2*#r_terre_cadre_a,RGB(0,0,155)) 
FillArea(#r_terre_cadre_a+2,#r_terre_cadre_a,RGB(0,0,155),RGB(0,0,155)) 
FillArea(#r_terre_cadre_a-2,#r_terre_cadre_a,RGB(0,0,155),RGB(0,0,100)) 
StopDrawing() 

;dessin lune cadre A 
CreateSprite(#spr_lune_A,2*#r_lune_cadre_a,2*#r_lune_cadre_a) 
StartDrawing(SpriteOutput(#spr_lune_A)) 
DrawingMode(#PB_2DDrawing_Default) 
Circle(#r_lune_cadre_a,#r_lune_cadre_a,#r_lune_cadre_a,RGB(150,150,150)) 
StopDrawing() 

;dessins de la Terre cadre B 
CreateSprite(#spr_terreB_d,2*#r_terre_cadre_b,2*#r_terre_cadre_b) 
StartDrawing(SpriteOutput(#spr_terreB_d)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
Circle(#r_terre_cadre_b,#r_terre_cadre_b,#r_terre_cadre_b,RGB(0,0,155)) 
Line(#r_terre_cadre_b,0,0,2*#r_terre_cadre_b,RGB(0,0,155)) 
FillArea(#r_terre_cadre_b-2,#r_terre_cadre_b,RGB(0,0,155),RGB(0,0,155)) 
FillArea(#r_terre_cadre_b+2,#r_terre_cadre_b,RGB(0,0,155),RGB(0,0,100)) 
StopDrawing() 

CreateSprite(#spr_terreB_p,2*#r_terre_cadre_b,2*#r_terre_cadre_b) 
StartDrawing(SpriteOutput(#spr_terreB_p)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
Circle(#r_terre_cadre_b,#r_terre_cadre_b,#r_terre_cadre_b,RGB(0,0,155)) 
Line(#r_terre_cadre_b,0,0,2*#r_terre_cadre_b,RGB(0,0,155)) 
FillArea(#r_terre_cadre_b+2,#r_terre_cadre_b,RGB(0,0,155),RGB(0,0,155)) 
FillArea(#r_terre_cadre_b-2,#r_terre_cadre_b,RGB(0,0,155),RGB(0,0,100)) 
StopDrawing() 


;dessins de la Lune cadre B 
CreateSprite(#spr_luneB_d,2*#r_lune_cadre_b,2*#r_lune_cadre_b) 
StartDrawing(SpriteOutput(#spr_luneB_d)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
Circle(#r_lune_cadre_b,#r_lune_cadre_b,#r_lune_cadre_b,RGB(100,100,100)) 
Line(#r_lune_cadre_b,0,0,2*#r_lune_cadre_b,RGB(100,100,100)) 
FillArea(#r_lune_cadre_b-2,#r_lune_cadre_b,RGB(100,100,100),RGB(200,200,200)) 
FillArea(#r_lune_cadre_b+2,#r_lune_cadre_b,RGB(100,100,100),RGB(100,100,100)) 
StopDrawing() 

CreateSprite(#spr_luneB_p,2*#r_lune_cadre_b,2*#r_lune_cadre_b) 
StartDrawing(SpriteOutput(#spr_luneB_p)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
Circle(#r_lune_cadre_b,#r_lune_cadre_b,#r_lune_cadre_b,RGB(100,100,100)) 
Line(#r_lune_cadre_b,0,0,2*#r_lune_cadre_b,RGB(100,100,100)) 
FillArea(#r_lune_cadre_b+2,#r_lune_cadre_b,RGB(100,100,100),RGB(200,200,200)) 
FillArea(#r_lune_cadre_b-2,#r_lune_cadre_b,RGB(100,100,100),RGB(100,100,100)) 
StopDrawing() 

;dessins de la Lune cadre C
CreateSprite(#spr_luneC_d,2*#r_lune_cadre_c,2*#r_lune_cadre_c, #PB_Sprite_Texture) 
StartDrawing(SpriteOutput(#spr_luneC_d)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
Circle(#r_lune_cadre_c,#r_lune_cadre_c,#r_lune_cadre_c,RGB(100,100,100)) 
Line(#r_lune_cadre_c,0,0,2*#r_lune_cadre_c,RGB(100,100,100)) 
FillArea(#r_lune_cadre_c-2,#r_lune_cadre_c,RGB(100,100,100),RGB(200,200,200)) 
FillArea(#r_lune_cadre_c+2,#r_lune_cadre_c,RGB(100,100,100),RGB(100,100,100)) 
StopDrawing() 

CreateSprite(#spr_luneC_p,2*#r_lune_cadre_c,2*#r_lune_cadre_c, #PB_Sprite_Texture) 
StartDrawing(SpriteOutput(#spr_luneC_p)) 
DrawingMode(#PB_2DDrawing_Outlined ) 
Circle(#r_lune_cadre_c,#r_lune_cadre_c,#r_lune_cadre_c,RGB(100,100,100)) 
Line(#r_lune_cadre_c,0,0,2*#r_lune_cadre_c,RGB(100,100,100)) 
FillArea(#r_lune_cadre_c+2,#r_lune_cadre_c,RGB(100,100,100),RGB(200,200,200)) 
FillArea(#r_lune_cadre_c-2,#r_lune_cadre_c,RGB(100,100,100),RGB(100,100,100)) 
StopDrawing() 

;initialisation 
terre\rayon_orbite=#rayon_orbite_terre_a 
terre\x_3D= #rayon_orbite_terre_a 
terre\y_3D=0 
terre\z_3D=0 
terre\phase=2*#PI/365.25 
  
lune\rayon_orbite=#rayon_orbite_lune_a 
lune\inclinaison_orbite=-5*#PI/180 
lune\x_3D=#rayon_orbite_lune_a 
lune\y_3D=0 
lune\z_3D=0 
lune\phase=2*#PI/27.9
  
Repeat 
    ExamineMouse() 
    ExamineKeyboard() 
    Delay(100) 
  

    DisplaySprite(#spr_arriere_plan,0,0) 
    
    terre\x_3D=terre\rayon_orbite*Cos(terre\phase*jour) 
    terre\y_3D=terre\rayon_orbite*Sin(terre\phase*jour) 
    terre\z_3D=0 
    conversion_3D_2D(@terre)    
    
    lune\x_3D=lune\rayon_orbite*Cos(lune\phase*jour) 
    lune\y_3D=lune\rayon_orbite*Sin(lune\phase*jour) 
    lune\z_3D=0 
    rotation_selon_axe_y(@lune) 
    conversion_3D_2D(@lune) 
    
    If  SpriteCollision(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a+8, #h_ecran-( terre\y_2D+#y_soleil), #spr_lune_A, lune\x_2D+terre\x_2D+#x_soleil-#r_lune_cadre_a+8,#h_ecran-(lune\y_2D+terre\y_2D+#y_soleil) ) 
             
    If jour<#trimestre_1 
        DisplayTransparentSprite(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a) 
        DisplayTransparentSprite(#spr_terreB_d,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b) 
        DisplayTransparentSprite(#spr_luneB_d,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b) 
        StartDrawing(ScreenOutput()) 
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,155)) 
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,155)) 
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(200,200,200)) 
        StopDrawing() 
    ElseIf jour<#trimestre_2 
        DisplayTransparentSprite(#spr_terreA_p,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a) 
        DisplayTransparentSprite(#spr_luneB_p,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b) 
        DisplayTransparentSprite(#spr_terreB_p,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b) 
        StartDrawing(ScreenOutput()) 
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,155)) 
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,155)) 
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(200,200,200)) 
        StopDrawing() 
        
    ElseIf jour<=#trimestre_3 
        DisplayTransparentSprite(#spr_terreA_p,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a) 
        DisplayTransparentSprite(#spr_luneB_p,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b) 
        DisplayTransparentSprite(#spr_terreB_p,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b) 
        StartDrawing(ScreenOutput()) 
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,100)) 
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,100)) 
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(100,100,100)) 
        StopDrawing() 
        
    ElseIf jour>#trimestre_3 
        DisplayTransparentSprite(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a) 
        DisplayTransparentSprite(#spr_luneB_d,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b) 
        DisplayTransparentSprite(#spr_terreB_d,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b) 
        StartDrawing(ScreenOutput()) 
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,100)) 
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,100)) 
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(100,100,100)) 
        StopDrawing() 
    EndIf  
  DisplayTransparentSprite(#spr_lune_A,lune\x_2D+terre\x_2D+#x_soleil-#r_lune_cadre_a,#h_ecran-(lune\y_2D+terre\y_2D+#y_soleil)-#r_lune_cadre_a) 
    
Else 
      DisplayTransparentSprite(#spr_lune_A,lune\x_2D+terre\x_2D+#x_soleil-#r_lune_cadre_a,#h_ecran-(lune\y_2D+terre\y_2D+#y_soleil)-#r_lune_cadre_a) 
    If jour<#trimestre_1 
        DisplayTransparentSprite(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a) 
        DisplayTransparentSprite(#spr_terreB_d,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b) 
        DisplayTransparentSprite(#spr_luneB_d,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b) 
        StartDrawing(ScreenOutput()) 
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,155)) 
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,155)) 
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(200,200,200)) 
        StopDrawing() 
    ElseIf jour<#trimestre_2 
        DisplayTransparentSprite(#spr_terreA_p,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a) 
        DisplayTransparentSprite(#spr_luneB_p,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b) 
        DisplayTransparentSprite(#spr_terreB_p,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b) 
        StartDrawing(ScreenOutput()) 
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,155)) 
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,155)) 
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(200,200,200)) 
        StopDrawing() 
        
    ElseIf jour<=#trimestre_3 
        DisplayTransparentSprite(#spr_terreA_p,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a) 
        DisplayTransparentSprite(#spr_luneB_p,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b) 
        DisplayTransparentSprite(#spr_terreB_p,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b) 
        StartDrawing(ScreenOutput()) 
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,100)) 
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,100)) 
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(100,100,100)) 
        StopDrawing() 
        
    ElseIf jour>#trimestre_3 
        DisplayTransparentSprite(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a) 
        DisplayTransparentSprite(#spr_luneB_d,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b) 
        DisplayTransparentSprite(#spr_terreB_d,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b) 
        StartDrawing(ScreenOutput()) 
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,100)) 
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,100)) 
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(100,100,100)) 
        StopDrawing() 
    EndIf  
    
    EndIf 
    ;dessin des phases de la Lune
    a.f=Cos((lune\phase-terre\phase)*jour)
    b.f=Sin((lune\phase-terre\phase)*jour)
    If a>0 And b>0
    DisplaySprite(#spr_luneC_d,#x_lune_cadre_c-#r_lune_cadre_c,#h_ecran-#y_lune_cadre_c-#r_lune_cadre_c)  
    StartDrawing(ScreenOutput())
    Ellipse( #x_lune_cadre_c,#h_ecran-#y_lune_cadre_c,#r_lune_cadre_c*a,#r_lune_cadre_c,RGB(200,200,200))
    StopDrawing()
    EndIf
     If a<0 And b>0
    DisplaySprite(#spr_luneC_d,#x_lune_cadre_c-#r_lune_cadre_c,#h_ecran-#y_lune_cadre_c-#r_lune_cadre_c)  
    StartDrawing(ScreenOutput())
    Ellipse( #x_lune_cadre_c,#h_ecran-#y_lune_cadre_c,#r_lune_cadre_c*a,#r_lune_cadre_c,RGB(100,100,100))
    StopDrawing()
    EndIf
    If a<0 And b<0
    DisplaySprite(#spr_luneC_p,#x_lune_cadre_c-#r_lune_cadre_c,#h_ecran-#y_lune_cadre_c-#r_lune_cadre_c)  
    StartDrawing(ScreenOutput())
    Ellipse( #x_lune_cadre_c,#h_ecran-#y_lune_cadre_c,#r_lune_cadre_c*a,#r_lune_cadre_c,RGB(100,100,100))
    StopDrawing()
    EndIf
     If a>0 And b<0
    DisplaySprite(#spr_luneC_p,#x_lune_cadre_c-#r_lune_cadre_c,#h_ecran-#y_lune_cadre_c-#r_lune_cadre_c)  
    StartDrawing(ScreenOutput())
    Ellipse( #x_lune_cadre_c,#h_ecran-#y_lune_cadre_c,#r_lune_cadre_c*a,#r_lune_cadre_c,RGB(200,200,200))
    StopDrawing()
    EndIf
    
    ;fonction pause
      If  KeyboardPushed( #PB_Key_F1)
       pause=pause+1
        Delay(128)
         If pause>1
         pause=0
         EndIf
    EndIf 
    
    If pause=0
         jour=jour+0.7
    EndIf  
         
    FlipBuffers() 
        
    If jour>365 
        jour=0 
        ;initialisation 
        terre\rayon_orbite=#rayon_orbite_terre_a 
        terre\x_3D= #rayon_orbite_terre_a 
        terre\y_3D=0 
        terre\z_3D=0 
        terre\phase=2*#PI/365.25 
        
        lune\rayon_orbite=#rayon_orbite_lune_a 
        lune\x_3D=#rayon_orbite_lune_a 
        lune\y_3D=0 
        lune\z_3D=0 
        lune\phase=2*#PI/27.9 
        lune\inclinaison_orbite=-5*#PI/180 
        
    EndIf 
    
Until MouseButton(#PB_MouseButton_Right) Or KeyboardPushed(#PB_Key_Escape) 

 

Questions sur l'optimisation:
-dans mon cas, est-ce qu'il est plus intéressant de remplacer les procedures de conversion2D_3D et de rotation par des macros?

-j'ai jeté un coup d'oeil au C++ 8O (juste un coup d'oeil car pour l'instant PB me suffit largement :wink: ), est-ce que certains d'entre vous utilisent souvent les lib ou dll écrites en C++?

-combien de siècles ça prend d'apprendre le C++?

- idem pour l'assembleur!

-Au début je dessinais tout en direct avec des circle, line...etc, j'ai vu qu'avec des sprites ça marche 100000 fois mieux, est-ce normal?

Hasta la vista!
Merci d'avance
Dernière modification par Huitbit le mar. 16/janv./2007 3:28, modifié 3 fois.
Elevé au MSX !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Super !!!
Reste plus qu'à voir tourner la France ! :lol:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tiens, j'ai amelioré l'affichage du cadre A

la lune passe derriere la terre maintenant :D

il Manque une Fonction pour déterminer l'ordre d'affichage des Sprites en pure Basic !! :?

(le dernier sprite affiché recouvre les autres !!)
mais une fonction permettant de gerer cela serai un sacré plus !! :D


Code : Tout sélectionner

;*********************************
;soleil,terre,lune, perspective cavalière
;PB V4.02
;*********************************
;constantes
#l_ecran=1280
#h_ecran=1024

#e=8; grandeur caracteristique pour les dessins
#l_cadre=(#l_ecran-3*#e)*0.5
#h_cadre=(#h_ecran-3*#e)*0.5

;**********cadre A**********
#x_cadre_a=#e
#y_cadre_a=#h_ecran-#e
#x_soleil=#x_cadre_a+#l_cadre*0.5
#y_soleil=#y_cadre_a-#h_cadre*0.5
#r_soleil=4*#e
#r_terre_cadre_a=2*#e
#r_lune_cadre_a=0.5*#e 
#rayon_orbite_terre_a=7*#r_soleil
#rayon_orbite_lune_a=#r_soleil
;**********cadre B**********
#x_cadre_b=2*#e+#l_cadre
#y_cadre_b=#y_cadre_a
#x_terre_cadre_b=#x_cadre_b+#l_cadre*0.5
#y_terre_cadre_b=#y_cadre_b-#h_cadre*0.5
#r_terre_cadre_b=4*#e
#r_lune_cadre_b=2*#e
#changement_echelle_lune_b=7
;**********cadre C**********
#x_cadre_c=#x_cadre_b
#y_cadre_c=#e+#h_cadre
;**********cadre D**********
#x_cadre_d=#x_cadre_a
#y_cadre_d=#y_cadre_c

;**********Divers*********
#coefficient_quadrilatere=7.2
#k_cos_alpha=0.35
#k_sin_alpha=0.35
#trimestre_1=365*0.25
#trimestre_2=365*0.5
#trimestre_3=365*0.75


Enumeration
    #spr_arriere_plan
    #spr_terreA_d
    #spr_terreA_p
    #spr_lune_A
    #spr_terreB_d
    #spr_terreB_p
    #spr_luneB_d
    #spr_luneB_p 
EndEnumeration
Structure donnees
    x_3D.f
    y_3D.f
    z_3D.f
    x_2D.f
    y_2D.f
    phase.f
    rayon_orbite.f
    inclinaison_orbite.f
EndStructure

;variables
nombres_etoile.l
x_etoile.l
y_etoile.l
jour.l=0
terre.donnees
lune.donnees
Global flag=1

Procedure.f conversion_3D_2D(*astre.donnees)
    *astre\x_2D=*astre\x_3D+#k_cos_alpha**astre\y_3D
    *astre\y_2D=*astre\z_3D+#k_sin_alpha**astre\y_3D
EndProcedure
Procedure.f rotation_selon_axe_y(*coordonnees.donnees)
    *coordonnees\x_3D=*coordonnees\x_3D*Cos(*coordonnees\inclinaison_orbite)+*coordonnees\z_3D*Sin(*coordonnees\inclinaison_orbite)
    *coordonnees\z_3D=-*coordonnees\x_3D*Sin(*coordonnees\inclinaison_orbite)+*coordonnees\z_3D*Cos(*coordonnees\inclinaison_orbite)

EndProcedure
Procedure.f tracer_quadrilatere_MNOP(x_centre.f,y_centre.f,rotation.l)
    M.donnees
    n.donnees
    O.donnees
    P.donnees
    
    M\x_3D=-#coefficient_quadrilatere*#r_soleil
    M\y_3D=#coefficient_quadrilatere*#r_soleil
    M\z_3D=0
    n\x_3D=#coefficient_quadrilatere*#r_soleil
    n\y_3D=#coefficient_quadrilatere*#r_soleil
    n\z_3D=0
    O\x_3D=#coefficient_quadrilatere*#r_soleil
    O\y_3D=-#coefficient_quadrilatere*#r_soleil
    O\z_3D=0
    P\x_3D=-#coefficient_quadrilatere*#r_soleil
    P\y_3D=-#coefficient_quadrilatere*#r_soleil
    P\z_3D=0
    If rotation<>0
        M\inclinaison_orbite=rotation*#PI/180
        rotation_selon_axe_y(@M)
        n\inclinaison_orbite=rotation*#PI/180
        rotation_selon_axe_y(@n)
        O\inclinaison_orbite=rotation*#PI/180
        rotation_selon_axe_y(@O)
        P\inclinaison_orbite=rotation*#PI/180
        rotation_selon_axe_y(@P)
    EndIf
    conversion_3D_2D(@M)
    conversion_3D_2D(@n)
    conversion_3D_2D(@O)
    conversion_3D_2D(@P)
    StartDrawing(SpriteOutput(#spr_arriere_plan))
    ;DrawText(M\xA_2D+x_centre,#h_ecran*0.5-(M\yA_2D+y_centre+2*#intercadre),"Plan de l'écliptique")
    LineXY(M\x_2D+x_centre,#h_ecran-(M\y_2D+y_centre),n\x_2D+x_centre,#h_ecran-(n\y_2D+y_centre),RGB(55,55,55))
    LineXY(P\x_2D+x_centre,#h_ecran-(P\y_2D+y_centre),O\x_2D+x_centre,#h_ecran-(O\y_2D+y_centre),RGB(55,55,55))
    LineXY(n\x_2D+x_centre,#h_ecran-(n\y_2D+y_centre),O\x_2D+x_centre,#h_ecran-(O\y_2D+y_centre),RGB(55,55,55))
    LineXY(M\x_2D+x_centre,#h_ecran-(M\y_2D+y_centre),P\x_2D+x_centre,#h_ecran-(P\y_2D+y_centre),RGB(55,55,55))
    StopDrawing()
    
EndProcedure
Procedure.f tracer_cercle(*coordonnees.donnees,inclinaison.l)
    
EndProcedure

InitSprite()
InitMouse()
InitKeyboard()
OpenScreen(#l_ecran,#h_ecran,32,"Soleil, Terre, Lune 3D")

;**********création du sprite de fond d'écran**********
CreateSprite(#spr_arriere_plan,#l_ecran,#h_ecran)
StartDrawing(SpriteOutput(#spr_arriere_plan))
DrawingMode(#PB_2DDrawing_Outlined )
;dessin des cadres
Box(#x_cadre_a,#h_ecran-#y_cadre_a,#l_cadre,#h_cadre,RGB(255, 255, 255))
Box(#x_cadre_b,#h_ecran-#y_cadre_b,#l_cadre,#h_cadre,RGB(255, 255, 255))
Box(#x_cadre_c,#h_ecran-#y_cadre_c,#l_cadre,#h_cadre,RGB(255, 255, 255))
Box(#x_cadre_d,#h_ecran-#y_cadre_d,#l_cadre,#h_cadre,RGB(255, 255, 255))
;fond étoilé
For nombre_etoile=0 To 1000
    x_etoile=#e+Random(2*#l_cadre+#e)
    y_etoile=#e+Random(2*#h_cadre+#e)
    
    ;cadre A
    If  x_etoile>#x_cadre_a And x_etoile<#x_cadre_a+#l_cadre And y_etoile>(#h_ecran-#y_cadre_a) And y_etoile<(#h_ecran-#y_cadre_a+#h_cadre)
        Plot(x_etoile,y_etoile,RGB(200,200,200))
        ;cadre B
    ElseIf  x_etoile>#x_cadre_b And x_etoile<#x_cadre_b+#l_cadre And y_etoile>(#h_ecran-#y_cadre_b) And y_etoile<(#h_ecran-#y_cadre_b+#h_cadre)
        Plot(x_etoile,y_etoile,RGB(200,200,200))
        ;cadre C   
    ElseIf  x_etoile>#x_cadre_c And x_etoile<#x_cadre_c+#l_cadre And y_etoile>(#h_ecran-#y_cadre_c) And y_etoile<(#h_ecran-#y_cadre_c+#h_cadre)
        Plot(x_etoile,y_etoile,RGB(200,200,200))
    EndIf       
Next nombre_etoile

;dessin du  Soleil)
DrawingMode(#PB_2DDrawing_Default)
For i=#r_soleil To 1 Step -1
    Circle(#x_soleil, (#h_ecran-#y_soleil),i, RGB(255,255-2*i,255-4*i))
Next i
StopDrawing()
;tracé des plans
tracer_quadrilatere_MNOP(#x_soleil,#y_soleil,0)
tracer_quadrilatere_MNOP(#x_terre_cadre_b,#y_terre_cadre_b,0)
tracer_quadrilatere_MNOP(#x_terre_cadre_b,#y_terre_cadre_b,-5)






;dessins de la Terre cadre A
CreateSprite(#spr_terreA_d,2*#r_terre_cadre_a,2*#r_terre_cadre_a)
StartDrawing(SpriteOutput(#spr_terreA_d))
DrawingMode(#PB_2DDrawing_Outlined )
Circle(#r_terre_cadre_a,#r_terre_cadre_a,#r_terre_cadre_a,RGB(0,0,155))
Line(#r_terre_cadre_a,0,0,2*#r_terre_cadre_a,RGB(0,0,155))
FillArea(#r_terre_cadre_a-2,#r_terre_cadre_a,RGB(0,0,155),RGB(0,0,155))
FillArea(#r_terre_cadre_a+2,#r_terre_cadre_a,RGB(0,0,155),RGB(0,0,100))
StopDrawing()

CreateSprite(#spr_terreA_p,2*#r_terre_cadre_a,2*#r_terre_cadre_a)
StartDrawing(SpriteOutput(#spr_terreA_p))
DrawingMode(#PB_2DDrawing_Outlined )
Circle(#r_terre_cadre_a,#r_terre_cadre_a,#r_terre_cadre_a,RGB(0,0,155))
Line(#r_terre_cadre_a,0,0,2*#r_terre_cadre_a,RGB(0,0,155))
FillArea(#r_terre_cadre_a+2,#r_terre_cadre_a,RGB(0,0,155),RGB(0,0,155))
FillArea(#r_terre_cadre_a-2,#r_terre_cadre_a,RGB(0,0,155),RGB(0,0,100))
StopDrawing()

;dessins de la Terre cadre B
CreateSprite(#spr_terreB_d,2*#r_terre_cadre_b,2*#r_terre_cadre_b)
StartDrawing(SpriteOutput(#spr_terreB_d))
DrawingMode(#PB_2DDrawing_Outlined )
Circle(#r_terre_cadre_b,#r_terre_cadre_b,#r_terre_cadre_b,RGB(0,0,155))
Line(#r_terre_cadre_b,0,0,2*#r_terre_cadre_b,RGB(0,0,155))
FillArea(#r_terre_cadre_b-2,#r_terre_cadre_b,RGB(0,0,155),RGB(0,0,155))
FillArea(#r_terre_cadre_b+2,#r_terre_cadre_b,RGB(0,0,155),RGB(0,0,100))
StopDrawing()

CreateSprite(#spr_terreB_p,2*#r_terre_cadre_b,2*#r_terre_cadre_b)
StartDrawing(SpriteOutput(#spr_terreB_p))
DrawingMode(#PB_2DDrawing_Outlined )
Circle(#r_terre_cadre_b,#r_terre_cadre_b,#r_terre_cadre_b,RGB(0,0,155))
Line(#r_terre_cadre_b,0,0,2*#r_terre_cadre_b,RGB(0,0,155))
FillArea(#r_terre_cadre_b+2,#r_terre_cadre_b,RGB(0,0,155),RGB(0,0,155))
FillArea(#r_terre_cadre_b-2,#r_terre_cadre_b,RGB(0,0,155),RGB(0,0,100))
StopDrawing()


;dessins de la Lune cadre B
CreateSprite(#spr_luneB_d,2*#r_lune_cadre_b,2*#r_lune_cadre_b)
StartDrawing(SpriteOutput(#spr_luneB_d))
DrawingMode(#PB_2DDrawing_Outlined )
Circle(#r_lune_cadre_b,#r_lune_cadre_b,#r_lune_cadre_b,RGB(100,100,100))
Line(#r_lune_cadre_b,0,0,2*#r_lune_cadre_b,RGB(100,100,100))
FillArea(#r_lune_cadre_b-2,#r_lune_cadre_b,RGB(100,100,100),RGB(200,200,200))
FillArea(#r_lune_cadre_b+2,#r_lune_cadre_b,RGB(100,100,100),RGB(100,100,100))
StopDrawing()

CreateSprite(#spr_luneB_p,2*#r_lune_cadre_b,2*#r_lune_cadre_b)
StartDrawing(SpriteOutput(#spr_luneB_p))
DrawingMode(#PB_2DDrawing_Outlined )
Circle(#r_lune_cadre_b,#r_lune_cadre_b,#r_lune_cadre_b,RGB(100,100,100))
Line(#r_lune_cadre_b,0,0,2*#r_lune_cadre_b,RGB(100,100,100))
FillArea(#r_lune_cadre_b+2,#r_lune_cadre_b,RGB(100,100,100),RGB(200,200,200))
FillArea(#r_lune_cadre_b-2,#r_lune_cadre_b,RGB(100,100,100),RGB(100,100,100))
StopDrawing()


;dessin lune cadre A
CreateSprite(#spr_lune_A,2*#r_lune_cadre_a,2*#r_lune_cadre_a)
StartDrawing(SpriteOutput(#spr_lune_A))
DrawingMode(#PB_2DDrawing_Default)
Circle(#r_lune_cadre_a,#r_lune_cadre_a,#r_lune_cadre_a,RGB(150,150,150))
StopDrawing()



;initialisation
terre\rayon_orbite=#rayon_orbite_terre_a
terre\x_3D= #rayon_orbite_terre_a
terre\y_3D=0
terre\z_3D=0
terre\phase=2*#PI/365
 
lune\rayon_orbite=#rayon_orbite_lune_a
lune\inclinaison_orbite=-5*#PI/180
lune\x_3D=#rayon_orbite_lune_a
lune\y_3D=0
lune\z_3D=0
lune\phase=2*#PI/28
 
Repeat
    ExamineMouse()
    ExamineKeyboard()
    Delay(100)
    DisplaySprite(#spr_arriere_plan,0,0)
    
    terre\x_3D=terre\rayon_orbite*Cos(terre\phase*jour)
    terre\y_3D=terre\rayon_orbite*Sin(terre\phase*jour)
    terre\z_3D=0
    conversion_3D_2D(@terre)   
    
    lune\x_3D=lune\rayon_orbite*Cos(lune\phase*jour)
    lune\y_3D=lune\rayon_orbite*Sin(lune\phase*jour)
    lune\z_3D=0
    rotation_selon_axe_y(@lune)
    conversion_3D_2D(@lune)
    
    ;cadre A
    ;     DrawingMode(#PB_2DDrawing_Outlined )
    ;     Circle(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre,RGB(0,0,255))
    ;     LineXY(#x_soleil,#h_ecran-#y_soleil,terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),RGB(255,255,255))
    ;     Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre*Sin( terre\phase*jour),#r_terre,RGB(0,0,255))
    ;     Circle(lune\x_2D+terre\x_2D+#x_soleil,#h_ecran-(lune\y_2D+ terre\y_2D+#y_soleil),#r_lune,RGB(200,200,200))
    
    
    ; DrawingMode(#PB_2DDrawing_Default  )
    
    If  SpriteCollision(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a+20, #h_ecran-( terre\y_2D+#y_soleil), #spr_lune_A, lune\x_2D+terre\x_2D+#x_soleil-#r_lune_cadre_a+8,#h_ecran-(lune\y_2D+terre\y_2D+#y_soleil) ) 
        
        
    If jour<#trimestre_1
        DisplayTransparentSprite(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a)
        DisplayTransparentSprite(#spr_terreB_d,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b)
        DisplayTransparentSprite(#spr_luneB_d,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b)
        StartDrawing(ScreenOutput())
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,155))
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,155))
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(200,200,200))
        StopDrawing()
    ElseIf jour<#trimestre_2
        DisplayTransparentSprite(#spr_terreA_p,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a)
        DisplayTransparentSprite(#spr_luneB_p,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b)
        DisplayTransparentSprite(#spr_terreB_p,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b)
        StartDrawing(ScreenOutput())
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,155))
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,155))
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(200,200,200))
        StopDrawing()
        
    ElseIf jour<#trimestre_3
        DisplayTransparentSprite(#spr_terreA_p,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a)
        DisplayTransparentSprite(#spr_luneB_p,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b)
        DisplayTransparentSprite(#spr_terreB_p,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b)
        StartDrawing(ScreenOutput())
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,100))
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,100))
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(100,100,100))
        StopDrawing()
        
    ElseIf jour>#trimestre_3
        DisplayTransparentSprite(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a)
        DisplayTransparentSprite(#spr_luneB_d,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b)
        DisplayTransparentSprite(#spr_terreB_d,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b)
        StartDrawing(ScreenOutput())
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,100))
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,100))
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(100,100,100))
        StopDrawing() 
    EndIf  
 DisplayTransparentSprite(#spr_lune_A,lune\x_2D+terre\x_2D+#x_soleil-#r_lune_cadre_a,#h_ecran-(lune\y_2D+terre\y_2D+#y_soleil)-#r_lune_cadre_a)
    
Else
      DisplayTransparentSprite(#spr_lune_A,lune\x_2D+terre\x_2D+#x_soleil-#r_lune_cadre_a,#h_ecran-(lune\y_2D+terre\y_2D+#y_soleil)-#r_lune_cadre_a)
    If jour<#trimestre_1
        DisplayTransparentSprite(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a)
        DisplayTransparentSprite(#spr_terreB_d,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b)
        DisplayTransparentSprite(#spr_luneB_d,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b)
        StartDrawing(ScreenOutput())
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,155))
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,155))
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(200,200,200))
        StopDrawing()
    ElseIf jour<#trimestre_2
        DisplayTransparentSprite(#spr_terreA_p,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a)
        DisplayTransparentSprite(#spr_luneB_p,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b)
        DisplayTransparentSprite(#spr_terreB_p,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b)
        StartDrawing(ScreenOutput())
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,155))
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,155))
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(200,200,200))
        StopDrawing()
        
    ElseIf jour<#trimestre_3
        DisplayTransparentSprite(#spr_terreA_p,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a)
        DisplayTransparentSprite(#spr_luneB_p,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b)
        DisplayTransparentSprite(#spr_terreB_p,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b)
        StartDrawing(ScreenOutput())
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,100))
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,100))
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(100,100,100))
        StopDrawing()
        
    ElseIf jour>#trimestre_3
        DisplayTransparentSprite(#spr_terreA_d,terre\x_2D+#x_soleil-#r_terre_cadre_a,#h_ecran-( terre\y_2D+#y_soleil)-#r_terre_cadre_a)
        DisplayTransparentSprite(#spr_luneB_d,#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b-#r_lune_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b)-#r_lune_cadre_b)
        DisplayTransparentSprite(#spr_terreB_d,#x_terre_cadre_b-#r_terre_cadre_b,#h_ecran-#y_terre_cadre_b-#r_terre_cadre_b)
        StartDrawing(ScreenOutput())
        Ellipse(terre\x_2D+#x_soleil,#h_ecran-( terre\y_2D+#y_soleil),#r_terre_cadre_a*Sin( terre\phase*jour),#r_terre_cadre_a,RGB(0,0,100))
        Ellipse(#x_terre_cadre_b,#h_ecran-#y_terre_cadre_b,#r_terre_cadre_b*Sin( terre\phase*jour),#r_terre_cadre_b,RGB(0,0,100))
        Ellipse(#changement_echelle_lune_b*lune\x_2D+#x_terre_cadre_b,#h_ecran-(#changement_echelle_lune_b*lune\y_2D+#y_terre_cadre_b),#r_lune_cadre_b*Sin( terre\phase*jour),#r_lune_cadre_b, RGB(100,100,100))
        StopDrawing() 
    EndIf  
    EndIf
   
   
    
  
    
    FlipBuffers()
    
    jour=jour+1
    
    If jour>365
        jour=0
        ;initialisation
        terre\rayon_orbite=#rayon_orbite_terre_a
        terre\x_3D= #rayon_orbite_terre_a
        terre\y_3D=0
        terre\z_3D=0
        terre\phase=2*#PI/365
        
        lune\rayon_orbite=#rayon_orbite_lune_a
        lune\x_3D=#rayon_orbite_lune_a
        lune\y_3D=0
        lune\z_3D=0
        lune\phase=2*#PI/28
        lune\inclinaison_orbite=-5*#PI/180
        
    EndIf
    
Until MouseButton(#PB_MouseButton_Right)<>0 Or KeyboardPushed(#PB_Key_Escape)
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Salut tout le monde,
-combien de siècles ça prend d'apprendre le C++?
Le C++ n'est pas difficil a apprendre, si tu a la volonté ça ira tout seul... enfin pour moi ça a été tout seul en tout cas !
Rien de bien compliqué :wink:
- idem pour l'assembleur!
Alors là c'est un autre morceau, tout dépend de la personne et du type d'assembleur.
Plus tu a de logique plus tu aura facil à l'apprendre, et la logique tu va l'aquerir en programment en PB et en C++ si tu t'y met :wink:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Un exemple pour gérer la profondeur d'affichage
plus la valeur de profondeur est élevée plus le sprite correspondant sera au dessus des autres .

Code : Tout sélectionner

InitSprite()
InitKeyboard()
OpenScreen(800,600,32,"test")

Structure s_Sprite
  No.l
  Profondeur.l
EndStructure

#NbSprite = 9
Dim ListeSprite.s_Sprite(#NbSprite)

;Fabrique quelques sprites
CreateSprite(#NbSprite+1, 128, #NbSprite*25)
For i = 0 To #NbSprite
  CreateSprite(i,128,128)
  ListeSprite(i)\No = i
  ListeSprite(i)\Profondeur = Random(#NbSprite)
  StartDrawing(SpriteOutput(i))
    Box(0,0,128,128,Random($FFFFFF))
    DrawText(5,5,"Sprite n°"+Str(i))
  StopDrawing()
Next i

;Affiche l'ordre initial avant le tri dans un sprite
StartDrawing(SpriteOutput(#NbSprite+1))
  Box(0,0,128, #NbSprite*25,$FFFFFF)
  DrawText(4, 4 , "Profondeur initiale")
  For i = 0 To #NbSprite
    t$ = "Sprite n°"+Str(i) + " = " + Str(ListeSprite(i)\Profondeur) 
    DrawText(4, 24 + i*18, t$)
  Next  
StopDrawing()

;Tri selon la profondeur
SortStructuredArray(ListeSprite(), 0, OffsetOf(s_Sprite\Profondeur),  #PB_Sort_Long )

Repeat
  ExamineKeyboard()
  ;Affichage selon la profondeur
  For i = 0 To #NbSprite
    DisplaySprite(ListeSprite(i)\No,i * 20, i * 20)
  Next i
  DisplaySprite(#NbSprite+1,800 -130, 0)
  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) 
 
-dans mon cas, est-ce qu'il est plus intéressant de remplacer les procedures de conversion2D_3D et de rotation par des macros?
Je dirais que non. ça va gonfler la taille de l'exe inutilement pour un gain en vitesse pas si évident que ça vu la taille du prog ?

Le choix entre procédure et macro c'est toujours un compromis entre vitesse et taille de l'exe. Tu peux aussi faire le même compromis au moment de la compilation en choisissant entre Tout CPU ou CPU dynamique qui te fera un exe plus gros mais plus rapide.
-Au début je dessinais tout en direct avec des circle, line...etc, j'ai vu qu'avec des sprites ça marche 100000 fois mieux, est-ce normal?
Oui l'affichage des sprites passe par DirectX , et il est optimisé.
Dessiner un cercle ou une ligne met en oeuvre un algorithme de tracé pixel par pixel.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Good "moon"ning!

Message par Huitbit »

@Dobro
Super!
J'ai failli partir dans des calculs mortels, tu me sauves!
J'essaye de voir un peu comment la fonction de collision fonctionne puis je mettrai le code à jour!
Pour régler le petit problème de la Lune qui traverse d'un "poil" la Terre, je vais essayer de prendre un sprite lune_A plus grand(même lune mais contour noir plus grand).

@Wolfjeremy
Pour le C++, je veux bien te croire, mais le "Hello world!" en C++ ça donne pas envie!
Je m'y mettrai un jour :roll: pour être plus rigoureux en Purebasic!
La philosophie du C++ peut m'apporter une rigueur qui me fait souvent défaut :lol: en programmation!
Je pense que le C++ permet de mieux digérer les notions de dll, API, lib, pointeurs, gestion de la mémoire...etc.


@Comtois
Merci, encore un tut que je mets au chaud pour plus tard!
Dans un de tes post, j'ai lu que tu voulais mettre un peu de C++ dans ta 3D. Bilan? satisfaisant; assez satisfaisant; passable...

A propos d'optimisation...
J'ai lu à plusieurs reprises dans des forums que certains calculaient à l'avance dans des tableaux des cosinus, sinus, etc ou tout autre calcul trop long à faire en direct, ça vous est déjà arrivé?

Dans le cadran en bas à droite, il y aura la Lune.
En mode pause, je compte l'afficher telle qu'elle est en fonction de la latitude(rotation du sprite) (exemple, des fois la Lune "sourit"!)

A propos de la configuration de l'écran, RAS?


Moonbye
Elevé au MSX !
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

certains calculaient à l'avance dans des tableaux des cosinus, sinus, etc
Evidemment c'est le Ba BA de l'optimisation vitesse critique :)
Tout ce qui peut-être "pémaché" le doit!

Le redimmensionnement écran automatique est sûrement normal
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Pas sur que la cavalière soit la plus efficace, il y a des angles "morts" ou qui se chevauchent sur le même axe
Il existe des tonnes de variantes!
Perspective cavalière
Perspectives dimétriques
Perspective isométrique
etc
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

le principe est tout bete

vu que c'est le dernier sprite affiché qui passe sur l'autre

je regarde si les sprites se touches, si c'est le cas
une fois je fait afficher la lune avant la terre (elle passe derriere )
une fois je fait afficher la lune apres la terre (elle passe devant)

le problème c'est que la partie du code est doublé juste pour une histoire
de priorité d'affichage
il serai sûrement assez simple a Fred de nous faire une petite fonction
qui détermine la profondeur d'affichage

un peu comme l'exemple de Comtois, (qui reste important en nombre de lignes pour pas grand chose :D )

je préférerai nettement un paramètre supplémentaire dans les fonctions
Displaysprite() ! :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Good "moon"ning!

Message par comtois »

Huitbit a écrit : @Comtois
Dans un de tes post, j'ai lu que tu voulais mettre un peu de C++ dans ta 3D. Bilan? satisfaisant; assez satisfaisant; passable...
Bilan ? les procédures 3D nécessitent de nombreux calculs, donc j'ai repris la plupart de mes fonctions en C, effectivement je gagne en vitesse si je compare fonction par fonction, par contre sur un programme complet (Programme PureBasic utilisant les fonctions écrites en C), le gain n'est pas significatif.
Je n'ai pas vu le FPS s'envoler. Sans doute parce qu'il est surtout consommé par Ogre pour l'affichage ? Bref je n'ai pas été plus loin dans mon investigation.
Dobro a écrit :un peu comme l'exemple de Comtois, (qui reste important en nombre de lignes pour pas grand chose Very Happy )
la gestion de la profondeur d'affichage des sprites tient en une ligne, difficile de faire plus court !!(c'est le tri du tableau)

Le reste du code n'est que l'init de l'écran , la création des sprites et la boucle d'affichage, c'est nécessaire pour afficher des sprites.

Je n'ai pas regardé ton code mais puisque tu parles de test de collision, je ne pense pas que ce soit la bonne méthode puisque HuitBit calcule la profondeur en z des sprites, il suffit de gérer la profondeur d'affichage en utilisant la valeur de z, en faisant un tri sur cette valeur.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Good "moon"ning!

Message par Backup »

comtois a écrit : la gestion de la profondeur d'affichage des sprites tient en une ligne, difficile de faire plus court !!(c'est le tri du tableau)
ben oui mais t'a du mettre en place un tableau !

et si tu veux faire passer un sprite precis devant un autre precis aussi
puis d'un coup faire l'inverse, tu va t'arracher les cheveux (si t'en as :lol:)
car tu vas jongler avec des indices de tableau sans reelement savoir a qui appartiens cette profondeur
c'est possible, mais compliqué !

alors qu'un paramètre de profondeur de plan, pour les fonctions d'affichage
de sprite permettrai de pouvoir faire ce que l'on veux facilement

(en pseudo code )

affiche sprite 1, 255 <-- affiche le sprite 1 a une profondeur de 255 (maxi)
affiche sprite 2,10 <--ce sprite a une profondeur de 10 il passera devant

on pourrai faire

Code : Tout sélectionner

a=100
b=150
boucle:

  affiche sprite 1, a
  affiche sprite 2, b

  mem=a:a=b:b=mem ;<-- echange les profondeurs

fin de boucle
de cet façon c'est beaucoup plus simple de gerer qui passe devant qui !!

utile pour les personnage qui se noient ainsi dans le décors

passe devant un mur, mais derrière l'arbre qui est devant
et pour échapper a un chien peut "tourner" autour de l'arbre
soit il passe derrière, soit devant
bref ce principe existe dans de nombreux Basic, qui exploite les Sprites :D

cela permettrai de faire de la pseudo 3D :D comme l'exemple ci dessus a Huitbit :D

imaginez devoir faire un jeux de couture, ou l'aiguille doit passer
devant certain fil, et derrière d'autres
mais que cela puisse changer !


actuellement le purebasic, est fait pour des jeux, dont la profondeur des sprites est figé a l'avance !

bien sur que l'on peut trouver des moyen d'y arriver, mais cela complique sérieusement la tache !

un simple paramètre supplémentaire, dans les fonctions d'affichage de sprites, arrangerai bien l'histoire :D
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Moonlight shadow...

Message par Huitbit »

MAJ2(voir début du code post1)
On peut faire "PAUSE" avec F1
D'après l'inclinaison de la Terre, l'animation commence en hiver!
Je donnerai la possibilté de changer de vue dans le cadre A car des fois c'est pas très parlant!
Question: quand je change l'incrémentation des jours, dès fois ça bloque 8O
exemple: jour=jour+0.1 ou jour=jour+0.2 ...etc
@Frenchy Pilou
Pas sur que la cavalière soit la plus efficace, il y a des angles "morts" ou qui se chevauchent sur le même axe
Il existe des tonnes de variantes!
Tout à fait d'accord!
J'ai pris les infos sur wikipédia, j'avais le choix!
En fait j'ai pris la représentation qui simplifiait au maximun les calculs et que l'on trouve systématiquement dans les livres de cours(pas la plus efficace :wink: )!
En effet, mon problème principal ça aurait été de dessiner beaucoup de cercles dans l'espace sans passer par les ellipses(les seules ellipses disponibles sont verticales ou horizontales!).
La seule ellipse que je devrais "dessiner"(avec les cosinus ou avec euler) c'est celle qui correspond à la latitude!
Si vous avez d'autres astuces pour représenter les cercles inclinés en 3D, ça m'interesse! :wink:



A propos des projections orthogonales, le seul calcul de coefficients que j'ai compris correspond à la 3D isométrique.
Dans les autres cas, j'ai du mal à visualiser le plan de projection.
Si quelqu'un a une adresse, ça m'interesse!

@Dobro
J'ai mis le premier post à jour
Je n'ai pas encore corrigé le léger problème pour la collision Terre-Lune mais c'est prévu(je peux bien faire ça vu que tu m'as machouillé le travail)


J'ai envie de contacter l'Institut de Mecanique Celeste et de Calcul des Ephemerides(IMCCE) pour travailler "proprement".
L'idéal ce serait qu'ils me donnent toutes les équations, je pourrais me concentrer sur l'animation.
En plus, même si les vraies équations sont chaudes, on peut faire du précalculé puisqu'un cycle dure 18 ans et des poussières (Saros)!
Les stars de l'astronomie se soucient-elles des vermisseaux?

H@st@ la vista!
Elevé au MSX !
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Ecris à ce gars là!
Thierry Lombry
http://www.astrosurf.com/luxorion/index.htm
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

J'ai écrit à l'IMCCE!

Message par Huitbit »

...Pour tous ce qui concerne la programmation et les théories simplifiées je vous recommande vivement le livre de Jean Meeus :
Astronomical Algorithms, Willmann-Bell, Inc. P.O. Box 35025, Richmond, Virginia 23235. ISBN 0-943396-35-2.
Pour vous inspirer vous pouvez regarder les applets Java à l´adresse suivante : http://www.math.nus.edu.sg/aslaksen/tea ... .html#Java...
Les stars de l'astronomie se soucient-elles des vermisseaux?
:roll: Ben oui!

Vive l'IMCCE!
(Merci également à Frenchy Pilou pour ses recherches :wink: )

J'espère y trouver ce que je cherche!


PS: en attendant, je customise mon générateur de cartes en 16 couleurs
(l'image est réduite mais j'ai "carréfié" puis "borduré" les côtes et les montagnes) (un jour j'en ferai un miniwargame, par Toutatis!)
The World of Huitbit (WoH)
Image

PS2: une adresse avec plinplin de jeu freeware : http://www.caiman.us
Elevé au MSX !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour ton simulateur de planete
tu pourrai essayer de te mettre a Dreamotion3D
c'est tres facile a utiliser :D !!

la tu pourrai faire unr vrais vue 3D :D
Répondre