Page 1 sur 1

Problème avec FlipBuffers() et la bibliothèque 2DDrawing

Publié : ven. 07/déc./2007 20:35
par Lost_in_PB
Bonsoir à tous,

En mode fenêtré, je voudrais faire des animations d'objets en fils de fer, qui seraient dessinés avec la bibliothèque 2DDrawing. Toutefois il semble que les objets dessinés ainsi sont directement affichés sur le frontbuffer, ce qui produit un affreux clignotement... Quelqu'un aurait-il une solution pour que j'obtienne un affichage digne de ce nom ? Merci d'avance...

Code : Tout sélectionner

; programme d'animation d'un sprite et d'objets faits avec la bibliothèque 2DDrawing
; PureBasic version 4.02

; initialisation de la fenêtre
If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf

If OpenWindow(0,0,0,640,480,"Test dessin en fil de fer",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
  If OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf
EndIf

SetFrameRate(50)

; création du sprite
CreateSprite(0,40,40)
If StartDrawing(SpriteOutput(0))
  Box(0,0,40,40, RGB(0,255,0))
  StopDrawing()
EndIf

; initialisation des variables
playerX = 1
playerY = 1

; >>> début de la boucle principale 
Repeat
  ; du fait du mode fenêtré, on est dans une boucle événementielle Windows 
  Event.l = WindowEvent()    
  
  If Event = #PB_Event_Gadget
    ; gestion de l'événement Windows concernant les gadgets genre bouton - mais il n'y en a pas ici
    ; s'il y avait d'autres événements Windows à gérer, on les mettrait ici
    
  Else
        
    FlipBuffers()
    
    ; gestion des déplacements du sprite et des objets en fil de fer
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up)    And playerY > 0   : playerY -2 : EndIf  
    If KeyboardPushed(#PB_Key_Down)  And playerY < 600 : playerY +2 : EndIf  
    If KeyboardPushed(#PB_Key_Left)  And playerX > 0   : playerX -2 : EndIf  
    If KeyboardPushed(#PB_Key_Right) And playerX < 440 : playerX +2 : EndIf  
   
    ClearScreen(0)
    
    ; affichage des objets en fil de fer
    If StartDrawing(WindowOutput(0))
      Box(playerX+150,playerY+50,40,40, RGB(0,255,0)) ; affichage boîte verte version 2DDrawing
      FrontColor(RGB(255,0,0)) 
      For k=0 To 20
        LineXY(playerX+10,playerY+10+k*8,200, 0) ; affichage 20 lignes rouges
      Next
      StopDrawing()
    EndIf
         
    ; affichage boîte verte version sprite     
    DisplaySprite(0,playerX+250,playerY+50) 

  EndIf

Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

; >>> fin de la boucle principale

FreeSprite(0)

End

Publié : ven. 07/déc./2007 21:06
par RV
Salut,

Tu as créé un écran mais tu ne dessines pas dessus, tu dessines directement sur la fenêtre! :?

Remplace

Code : Tout sélectionner

StartDrawing(WindowOutput(0))
par

Code : Tout sélectionner

StartDrawing(ScreenOutput())
:wink:

Publié : ven. 07/déc./2007 21:29
par Lost_in_PB
Super ça marche nickel maintenant ! Doublement merci à toi, RV, pour la bonne réponse et aussi pour ta rapidité à me la fournir! Et tu as d'autant plus de mérite que mon code avait perdu son indentation au collage...

Publié : ven. 07/déc./2007 21:46
par RV
Super ça marche nickel maintenant ! Doublement merci à toi, RV, pour la bonne réponse et aussi pour ta rapidité à me la fournir!
Bah pour une fois que je vais plus vite que les caïds du forum... :D
Et tu as d'autant plus de mérite que mon code avait perdu son indentation au collage...
C'est vrai! 8)
Heureusement que ton code ne fait que 70 lignes! :D