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 :D

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 :oops: