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.