Page 1 sur 1

Mes if(s) qui ne se font pas.

Publié : mer. 19/juil./2017 15:21
par Kangax

Code : Tout sélectionner

Repeat  
   ;    Debug Etape_tableau
           ;ClearScreen(RGB(0,0,0))
           ; DisplaySprite(0, 100, 100) ; logo pure basic
           ; DisplaySprite(1,533,500) ;barre verte
          ; DisplaySprite(2,533,500-score*2) ; barre noire
           ; DisplayTransparentSprite(3,500,500) ; habillage
            ; FlipBuffers()
   
          If (ElapsedMilliseconds()-Ref_temporelle)=Montableau(Etape_tableau) And Chuisallume=0  ; Condition pour afficher
            Etape_tableau=Etape_tableau+1
            Chuisallume=1 
          EndIf  
          
          If (ElapsedMilliseconds()-Ref_temporelle)=Montableau(Etape_tableau) And Chuisallume=1 ; Condition pour éteindre
            Etape_tableau=Etape_tableau+1
           Chuisallume=0
          EndIf
   Until Etape_tableau=50

Dans le code ci-dessus, tant que j'ai des ; devant la partie affichage, mes If se font bien et je peux avancer dans les étapes de mon tableau jusqu'à 50. Dés que j'enlève les ; Etape_tableau reste à 0 et je ne comprends pas pourquoi.

Au passage (et ça n'a rien à voir je pense), il me semble avoir constaté que ElapsedMilliseconds() contient le nombre de millisecondes écoulées depuis le lancement du programme et non de Windows comme indiqué dans la doc.

Merci d'avance pour vos éclairages.

Re: Mes if(s) qui ne se font pas.

Publié : mer. 19/juil./2017 16:36
par SPH
Tu n'as pas donné l'integralité du code.
En l'etat, que tu mettes des ; ou pas, ca fera la meme chose.
Petite remarque : met plutot "Until Etape_tableau>=50" plutot que "Until Etape_tableau=50" car la valeur peux depasser.

Re: Mes if(s) qui ne se font pas.

Publié : mer. 19/juil./2017 17:05
par Kangax
Voici l'intégralité du code.
J'essaye de faire un jeu de rythme, vous risquez de trouver ça naïf comme façon de faire mais je débute ;-).
Dans le fichier .txt il y a des millisecondes qui correspondent à l'enregistrement de l'apuie/relachage des touches que j'ai fait une fois au préalable avec un autre programme en écoutant la musique .... , jusqu'à présent je voulais afficher le BMP du logo PB quand lors de la lecture de mon fichier, la touche était enfoncée et le faire disparaitre quand l'enregistrement ne montrait qu'aucune touche n'était enfoncée.
Sous mes if(s) il y avait des clearscreens flipbuffer dans le cas éteins et des clearscreen+affichage logo+flipbuffer dans le cas allumé.
Ca marchait mais je trouvais que le logo clignotant ne servait à rien car trop rapide je compte maintenant faire changer un sprite de couleur pour décrire le cycle (par exemple plus il est vert plus on est proche du bon moment et quand il est rouge c'est qu'on est loin).
Mais bon je pense pouvoir me débrouiller si je comprends ce qui fait que l'affichage joue sur mes "if(s)".


Code : Tout sélectionner

If ReadFile(0, "record_touche.txt")  And InitSprite() And OpenScreen(1920, 1080, 32, "Sprite")  And InitKeyboard () And InitSound()
  
  LoadSprite(0,"PureBasic.bmp")
  LoadSprite(1, "Barre_verte.bmp")
  LoadSprite(2, "Barre_noire.bmp") 
  LoadSprite(3, "Habillage_100_300.bmp")
  LoadSprite(4, "Wait.bmp")
  LoadMusic(0, "another_one_bites.mod")
  a=0 ; Variable qui contiendra les moments des transistions
  test=0
  Chuisallume=0           ; inverseur d'affichage
  score=0                 ; donne le score 
  tolerance=50            ; C'est la tolérance aux impulsions
  long=Lof(0)
  Armement_betise=0
  Compteur_periode=0
  Dim Montableau(long)
  j=0
  Etape_tableau=0
  While Eof(0) = 0          ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
       Montableau(j) = Val(ReadString(0))
    j=j+1
  Wend
  PlayMusic(0)
  Ref_temporelle.q=ElapsedMilliseconds() ; prise de référence du temps
    If Etape_tableau=0 And test=0
   ClearScreen(RGB(0,0,0))
   DisplaySprite(4,750,500)
   FlipBuffers()
   test=1
   EndIf  
  Repeat  
   ;    Debug Etape_tableau
           ;ClearScreen(RGB(0,0,0))
           ; DisplaySprite(0, 100, 100) ; logo pure basic
           ; DisplaySprite(1,533,500) ;barre verte
          ; DisplaySprite(2,533,500-score*2) ; barre noire
           ; DisplayTransparentSprite(3,500,500) ; habillage
            ; FlipBuffers()
   
          If (ElapsedMilliseconds()-Ref_temporelle)=Montableau(Etape_tableau) And Chuisallume=0  ; Condition pour afficher
            Etape_tableau=Etape_tableau+1
            Chuisallume=1 
          EndIf  
          
          If (ElapsedMilliseconds()-Ref_temporelle)=Montableau(Etape_tableau) And Chuisallume=1 ; Condition pour éteindre
            Etape_tableau=Etape_tableau+1
           Chuisallume=0
          EndIf
       
    ; Détermination de la zone de score front montant
    If ((ElapsedMilliseconds()-Ref_temporelle)>(Montableau(Etape_tableau)-tolerance) Or (ElapsedMilliseconds()-Ref_temporelle)<(Montableau(Etape_tableau)+tolerance)) And Chuisallume=0
      zoneup=1
    Else
      zoneup=0
    EndIf
      
    ; Détermination de la zone de score front descendant.....devenu inutile car je ne score plus que sur les montants
    ;If ((ElapsedMilliseconds()-Ref_temporelle)<(Montableau(n)-tolerance) Or (ElapsedMilliseconds()-Ref_temporelle)>(Montableau(n)+tolerance)) And Chuisallume=1
     ; zonedown=1
    ;Else
     ; zonedown=0
   ;EndIf 
      
      ; Calcul du score  sur impulsion clavier
    ExamineKeyboard()
      If KeyboardPushed(#PB_Key_L)
      Debug Etape_tableau
      j=0
      While j<50
        Debug Montableau(j)
        j=j+1
      Wend
      Debug ElapsedMilliseconds()
       Debug "Temps écoulé : "+Str(Ref_temporelle)+" millisecondes" 
       Debug score
       End
     EndIf
     
      If KeyboardPushed(#PB_Key_All) And zoneup=1 And front_up=0 ; Front montant dans la zone ou c'est bien
        score=score+2
        front_up=1
       ; front_down=0
      EndIf
      If KeyboardReleased(#PB_Key_All); And zonedown=1 And front_down=0 ; Front descendant dans la zone ou c'est bien
     ;   score=score+2
     ;   front_down=1
        front_up=0
      EndIf
      If KeyboardPushed(#PB_Key_All) And zoneup=0 And front_up=0 ; Front montant hors zone
        score=score-1
        front_up=1
      ;  front_down=0
      EndIf
     ; If KeyboardReleased(#PB_Key_All) And zonedown=0 And front_down=0 ; Front descendant hors zone 
     ;   score=score-2
     ;   front_down=1
     ;   front_up=0
     ; EndIf
      
      ; Retrait de point si pas d'impulsion clavier
      If Etape_tableau=Compteur_periode+2
        If Armement_betise=1 And score>0
          score=score-1
        EndIf 
        Compteur_periode=Etape_tableau
        Armement_betise=1
      EndIf 
      
      
      If KeyboardPushed(#PB_Key_All)
        Armement_betise=0
      EndIf 
     
    Until Etape_tableau=50
    CloseFile(0)
   ; CloseScreen()
  Debug score
  Debug Etape_tableau
Else
  MessageRequester("PureBasic", "Error", 0)
EndIf

Re: Mes if(s) qui ne se font pas.

Publié : mer. 19/juil./2017 17:27
par microdevweb
Bonjour,

Sans le fichier record_touche.txt, impossible de testé et donc de pouvoir t'aider

Re: Mes if(s) qui ne se font pas.

Publié : mer. 19/juil./2017 17:45
par case
salut, tu devrais mettre >= au lieu de = avec tes if
en effet les instructions lancées avant tes ifs prennent du temps a être exécutes et peuvent dépasser la milliseconde que tu attends ce qui peux expliquer ton problème

si la somme des instructions prennent plus d'une milliseconde tu ne peux pas être précis a la milliseconde prés ou alors peut être avec les threads mais je ne pourrais pas t'aider dans cette voie :)

Re: Mes if(s) qui ne se font pas.

Publié : mer. 19/juil./2017 18:14
par Kangax
Après quelques tests rapides, ça a l'air ça en effet, les commandes d'affichage ralentissent tout et font que le ElapsedMilliseconds ne doit pas s'incrémenter de 1 et vu la manière dont c'est écrit, il suffit de louper le premier pour que ce soit fichu. avec >= ça va.
Merci pour vos tuyaux. C'est top.
Si j'avais voulu vous faire passer un .txt, c'était quoi le plus pratique ?
Et pour mon constat de ElapsedMilliseconds qui ne se comporte pas comme dans la doc, c'est moi qui me trompe ou vous aviez déjà remarqué ?
Merci encore.

Re: Mes if(s) qui ne se font pas.

Publié : mer. 19/juil./2017 20:51
par Fig
Pourquoi trouves tu que Ellapsedmillesecond() ne se comporte pas correctement ?
Attention, elle n'est pas sensée s'incrémenter d'un à chaque appel...

Re: Mes if(s) qui ne se font pas.

Publié : mer. 19/juil./2017 22:51
par Kangax
Lors de mes tests j'ai remarqué que ma variable Ref_temporelle était tout le temps à 0.

Dans le programme elle est juste écrite par cela.

Ref_temporelle.q=ElapsedMilliseconds() ; prise de référence du temps

J'en déduis qu'ElapsedMilliseconds() ne contient pas le nombre de millisecondes depuis le démarrage de l'ordinateur comme indiqué dans la doc mais depuis le début de l'exécution du programme.
Mais je peux me tromper d'interprétation.

Re: Mes if(s) qui ne se font pas.

Publié : jeu. 20/juil./2017 8:07
par Mindphazer
En effet, il semble qu'en version 5.60, ElapsedMilliseconds() renvoie le nombre de millisecondes écoulées depuis le lancement du programme qui l'appelle (0 si on fait juste un debug de cette ligne)
En 5.42, ElapsedMilliseconds() renvoie une valeur qui semble correspondre à ce que dit la doc...

Re: Mes if(s) qui ne se font pas.

Publié : jeu. 20/juil./2017 10:42
par microdevweb
Un micro Processeur n'est pas précis à la milliseconde, contrairement par exemple à un microcontrôleur
Exemple de chrono

Code : Tout sélectionner

; Exemple chrono
Global gStart=ElapsedMilliseconds() ; Le départ pour le calcul
Global ElapsetTime,s
Repeat
  ElapsetTime=ElapsedMilliseconds()-gStart
  If ElapsetTime>=1000 ; une seconde
    s+1
    gStart=ElapsedMilliseconds()
    Debug Str(s)+" secondes"
  EndIf
Until s>=10 ; Stop après 10 secondes

Re: Mes if(s) qui ne se font pas.

Publié : jeu. 20/juil./2017 19:42
par djes
microdevweb a écrit :Un micro Processeur n'est pas précis à la milliseconde, contrairement par exemple à un microcontrôleur
Exemple de chrono

Code : Tout sélectionner

; Exemple chrono
Global gStart=ElapsedMilliseconds() ; Le départ pour le calcul
Global ElapsetTime,s
Repeat
  ElapsetTime=ElapsedMilliseconds()-gStart
  If ElapsetTime>=1000 ; une seconde
    s+1
    gStart=ElapsedMilliseconds()
    Debug Str(s)+" secondes"
  EndIf
Until s>=10 ; Stop après 10 secondes
Euh, ça dépend, c'est surtout Windows qui empêche d'avoir quelque chose de très précis pour les compteurs. Il y a quand même mieux que le ElapsedMilliseconds(), mais faut passer par les API, et il y aussi les timers.