Mes if(s) qui ne se font pas.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Kangax
Messages : 8
Inscription : jeu. 29/juin/2017 16:23

Mes if(s) qui ne se font pas.

Message 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.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

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

Message 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.

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Kangax
Messages : 8
Inscription : jeu. 29/juin/2017 16:23

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

Message 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
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message par microdevweb »

Bonjour,

Sans le fichier record_touche.txt, impossible de testé et donc de pouvoir t'aider
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

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

Message 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 :)
Dernière modification par case le mer. 19/juil./2017 19:15, modifié 1 fois.
ImageImage
Kangax
Messages : 8
Inscription : jeu. 29/juin/2017 16:23

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

Message 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.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

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

Message 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...
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Kangax
Messages : 8
Inscription : jeu. 29/juin/2017 16:23

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

Message 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.
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

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

Message 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...
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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.
Répondre