Page 2 sur 2

Publié : lun. 16/janv./2006 16:55
par Huitbit
Au fait le satellite peut aussi partir vers la gauche(angle>90)!

Publié : lun. 16/janv./2006 19:10
par Backup
au dessus du message que tu vien d'ecrire
a droite tu a un bouton Quote (pour citer le message)
et EDIT pour reouvrir le message et pouvoir le modifier !! :lol:

Petit rafraîchissement!

Publié : mar. 17/janv./2006 17:26
par Huitbit
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+

Publié : mar. 17/janv./2006 17:27
par Huitbit
J'ai aussi corrigé quelques petites erreurs de placement des sprites!

Les valeurs possibles de satellisation on légèrement changées!!!

Publié : mar. 17/janv./2006 19:19
par Backup
pour tes 2 derniers messages postés a 1 minute d'interval t'aurai pu utiliser Edit !!!! pour n'en faire q'un seul :? :lol:

Mon cas s'aggrave!!!

Publié : mer. 18/janv./2006 3:59
par Huitbit
:oops:
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!

Publié : mer. 18/janv./2006 11:56
par Backup
tu peux effacer ton message seulement si persone n'ecrit derriere !! :lol:
ta formation est bientot finie :lol:

Petite amélioration!

Publié : ven. 20/janv./2006 1:48
par Huitbit
J'ai rajouté le tracer de la trajectoire, ça manquait! :)
(voir premier message)

Je crois que pour EDIT, c'est bon! :wink:

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")?

Publié : ven. 20/janv./2006 11:55
par Good07
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:

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 
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. :D
J'espère avoir répondu à ta question.

A+

André.

Publié : ven. 20/janv./2006 12:04
par Backup
Le spécialiste de la question c'est sûrement Dobro
Merci :D mais ton exemple est parfait , je n'aurai surement pas mieux fait .. :lol:

Publié : ven. 20/janv./2006 12:44
par Good07
Merci :D
Moi je part au boulot. :(

A+

Publié : ven. 20/janv./2006 18:47
par Flype
sinon pour une boucle correcte, sans ralentissement ni consommation cpu excessive :
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!

Publié : ven. 20/janv./2006 21:30
par Huitbit
@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 :oops: !!!! ):P

Hasta la proxima!