Page 1 sur 1
probleme repeat/until Keyboardpushed
Publié : mer. 03/déc./2014 11:40
par jmg49
Bonjour,
décidément je vais pas sortir de la section débutant encore !!
j'effectue une rotation sur un sprite, pendant l'opération, je ne récupère pas la main sur le prog , malgré le examinekeyboard() repeat/until Keyboardpushed
j'ai des codes où ça fonctionne parfaitement où j'effectue aussi des opérations sur des sprites, scrolling , affichages .....
Code : Tout sélectionner
Enumeration
#sprite
EndEnumeration
Enumeration
#win
EndEnumeration
InitKeyboard()
InitSprite()
UsePNGImageDecoder()
OpenWindow(#win, 0,0,1024, 768, "test" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
OpenWindowedScreen(WindowID(#win),0,0,1024,768)
LoadSprite(#sprite,"gunther.png")
Repeat
Event= WaitWindowEvent()
For i=0 To 2*360 Step 1
ExamineKeyboard()
RotateSprite(#sprite, i,#PB_Absolute)
DisplaySprite(0, 250, 260)
FlipBuffers()
ClearScreen($0)
Next i
Until KeyboardPushed(#PB_Key_Escape)
End
Merci à vous
Re: probleme repeat/until Keyboardpushed
Publié : mer. 03/déc./2014 11:56
par TazNormand
Et comme ça, ça t'arrange ?
Code : Tout sélectionner
Enumeration
#sprite
EndEnumeration
Enumeration
#win
EndEnumeration
InitKeyboard()
InitSprite()
UsePNGImageDecoder()
OpenWindow(#win, 0,0,1024, 768, "test" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
OpenWindowedScreen(WindowID(#win),0,0,1024,768)
LoadSprite(#sprite,"gunther.png")
i=0
Repeat
Event= WaitWindowEvent()
;For i=0 To 2*360 Step 1
ExamineKeyboard()
RotateSprite(#sprite, i,#PB_Absolute)
DisplaySprite(0, 250, 260)
FlipBuffers()
ClearScreen($0)
i+1
If i>(2*360) ; tes valeurs de For...Next
i=0
EndIf
;Next i
Until KeyboardPushed(#PB_Key_Escape)
End
Re: probleme repeat/until Keyboardpushed
Publié : mer. 03/déc./2014 12:05
par jmg49
ah oui , ça m'arrange bien !! bon j'ai enlevé le waitwindowevent() parcequ'il fallait que je bouge la souris dans la fenêtre pour que ça tourne sinon
merci bien , à retenir pour l'avenir
Re: probleme repeat/until Keyboardpushed
Publié : mer. 03/déc./2014 12:14
par TazNormand
Les boucles "For" sont "gourmandes", donc faut ruser

Re: probleme repeat/until Keyboardpushed
Publié : mer. 03/déc./2014 13:42
par djes
Comme déjà dit et indiqué dans la doc, il FAUT traiter les événements de l'écran avec une petite boucle interne (WindowEvent()), sinon c'est le plantage assuré au bout d'un (parfois long) moment...
Re: probleme repeat/until Keyboardpushed
Publié : mer. 03/déc./2014 14:02
par falsam
djes a écrit :Comme déjà dit et indiqué dans la doc, il FAUT traiter les événements de l'écran avec une petite boucle interne (WindowEvent()), sinon c'est le plantage assuré au bout d'un (parfois long) moment...
Et ne pas oublier d'attendre que la pile des évenement Windows soit vide avant de passer aux événement 3D. Technique
polémique du double repeat.
La structure d'un code 3D devrait être de cette manière.
Code : Tout sélectionner
Enumeration
#Mainform
EndEnumeration
Global WWIdth, WHeight
Global Event
InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
OpenWindow(#Mainform,0,0, 0, 0, "", #PB_Window_SystemMenu | #PB_Window_Maximize)
OpenWindowedScreen(WindowID(#Mainform),0,0,800,600,0, 0, 0)
KeyboardMode(#PB_Keyboard_International)
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)
; Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 2, 5, 15, #PB_Absolute)
CameraLookAt(Camera, 0,0,0)
Repeat ;Evenement Windows
Repeat ;Evenement 3D
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0 ;C'est vide : Passons à la suite
If ExamineKeyboard()
If KeyboardPushed (#PB_Key_Escape)
Break
EndIf
EndIf
; Rendu de la scéne
RenderWorld(30)
FlipBuffers()
ForEver
Re: probleme repeat/until Keyboardpushed
Publié : mer. 03/déc./2014 20:58
par Azur
Hello, j'ai trouvé ça intéressant la remarque sur les boucles FOR NEXT j'ai fais un test et j'arrive à la conclusion inverse, la boucle FOR serait quasiment 20% plus rapide, testé sur un vieux portable sous Linux.
Alors au risque de me faire qualifier une fois de plus de posteur, un peu borderline je pose la question, comment se fesse ?
Code : Tout sélectionner
EnableExplicit
Define t=ElapsedMilliseconds()
Define i
For i=0 To 1000000
Next i
Debug ElapsedMilliseconds()-t
;----------------------------------
Define t=ElapsedMilliseconds()
Define j
j=0
Repeat
j+1
Until j=1000000
Debug ElapsedMilliseconds()-t
Re: probleme repeat/until Keyboardpushed
Publié : mer. 03/déc./2014 22:41
par TazNormand
@ Azur : je pense que les boucles FOR sont plus rapides car leur équivalent Assembleur l'est, pas de "gros" test.
Quand je dis qu'elles sont "lourdes", j'entends par là qu'il faut gérer la sortie d'une boucle par "exception", le processus normal fait qu'on ne sort pas généralement d'une boucle FOR...NEXT, même si on trouve des EXIT FOR/BREAK dans les différents langages de programmation.
Enfin, ce n'est que mon avis, je peux aussi me tromper
