Page 1 sur 1

Dessin trés simple

Publié : ven. 03/août/2007 16:19
par ThoT
Voilà un petit code que je viens de faire pour debuter avec le drawing 2D :

Code : Tout sélectionner

fenetre_principale = OpenWindow(#PB_Any,100,100,500,500,"Fenetre principale")
CreateGadgetList(WindowID(fenetre_principale))

texte_souris_x = TextGadget(#PB_Any, 10, 10, 200, 20, "")
texte_souris_y = TextGadget(#PB_Any, 10, 30, 200, 20, "")

StartDrawing(WindowOutput(fenetre_principale))


Repeat

  evenement = WaitWindowEvent()

  If evenement = #PB_Event_CloseWindow
    End
  EndIf

  old_souris_x = souris_x
  old_souris_y = souris_y
  souris_x = WindowMouseX(fenetre_principale)
  souris_y = WindowMouseY(fenetre_principale)

  SetGadgetText(texte_souris_x, "Position en X : " + Str(souris_x))
  SetGadgetText(texte_souris_y, "Position en Y : " + Str(souris_y))

  If evenement = #WM_LBUTTONDOWN
    tracer = 1
  ElseIf evenement = #WM_LBUTTONUP
    tracer = 0
  EndIf

  If tracer = 1
    LineXY(old_souris_x,old_souris_y,souris_x,souris_y,$ff0000)
  EndIf

ForEver

StopDrawing()
Dites moi si la façon de faire est bonne ou comment l'ameliorer et si vous avez des petits trucs ou des astuces, je suis preneur! :D

Merci d'avance!

Publié : ven. 03/août/2007 17:00
par Backup
...........

Publié : ven. 03/août/2007 17:16
par ThoT
J'aime bien le " select evenement " que tu as utilisé, c'est plutot pratique :P
Juste une petite question, pourquoi tu as mis le startdrawing() et le stopdrawing() là ?? :

Code : Tout sélectionner

If tracer = 1 
        StartDrawing(WindowOutput(fenetre_principale)) 
        LineXY(old_souris_x,old_souris_y,souris_x,souris_y,$FF0000) 
        StopDrawing() 
EndIf
Ca pose probleme de les mettre en dehors de la boucle principale ?

Publié : ven. 03/août/2007 17:50
par Mytic
Voilà j’ai amélioré ton code avec quelque modifs :
- le dessin est sauvegardé en mémoire donc pas de perte lors du rafraîchissement.
- Pas de clignotement de TextGadget lors du rafraîchissement.
- Un mode Screen plus utile pour un développement qui demande du graphique.
- Voilà c’est tout.
:wink:

Code : Tout sélectionner

InitSprite()
fenetre_principale = OpenWindow(#PB_Any,100,100,500,500,"Fenetre principale")
OpenWindowedScreen(WindowID(fenetre_principale),0,0,500,500,0,0,0)
CreateSprite(0,500,500)
CreateGadgetList(WindowID(fenetre_principale))
texte_souris_x = TextGadget(#PB_Any, 10, 10, 200, 20, "")
texte_souris_y = TextGadget(#PB_Any, 10, 30, 200, 20, "")

Repeat
    old_souris_x = souris_x
    old_souris_y = souris_y
    souris_x = WindowMouseX(fenetre_principale)
    souris_y = WindowMouseY(fenetre_principale)
    Select evenement
        Case  #WM_LBUTTONDOWN
            tracer = 1
        Case #WM_LBUTTONUP
            tracer = 0
    EndSelect 
    If tracer = 1
        StartDrawing(SpriteOutput(0))
        LineXY(old_souris_x,old_souris_y,souris_x,souris_y,$FF0000)
        StopDrawing()
    EndIf 
    DisplaySprite(0,0,0)
    FlipBuffers()
    SetGadgetText(texte_souris_x, "Position en X : " + Str(souris_x))
    SetGadgetText(texte_souris_y, "Position en Y : " + Str(souris_y))
evenement = WaitWindowEvent() 
Until evenement = #PB_Event_CloseWindow
End

Publié : ven. 03/août/2007 18:08
par ThoT
En effet, c'est mieux...
Merci Mytic!!! 8)

Publié : ven. 03/août/2007 19:36
par Backup
.....

Publié : ven. 03/août/2007 20:13
par Flype
et puisqu'il n'y a jamais une seule façon de faire, voici comment je ferais.

sans gadgetlist, mais c'est peut etre voulu...
ceci dit çà clignote alors si c'est pas indispensable vaut mieux éviter les gadgets dans les 'screen'. quoiqu'il y a plusieurs codes qui montrent comment faire sur le forum.

sinon j'ai ajouté un test de la souris.
si la souris est en dehors de la fenetre, WindowMouseX/Y renvoi -1 et l'effet de tracé n'ai pas terrible. ca fait des lignes plus ou moins aléatoires quand on déborde sur les cotés.

Code : Tout sélectionner

InitSprite()

fenetre_largeur = 500
fenetre_hauteur = 500
fenetre_principale = OpenWindow(#PB_Any, 0, 0, fenetre_largeur, fenetre_hauteur, "Fenetre principale", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

OpenWindowedScreen(WindowID(fenetre_principale), 0, 0, fenetre_hauteur, fenetre_hauteur, #False, 0, 0)

Repeat
  
  Event = WindowEvent()
  
  Select Event
    
    Case #PB_Event_CloseWindow
      
      Break
      
    Case #WM_LBUTTONDOWN
      
      tracer = #True
      
    Case #WM_LBUTTONUP
      
      tracer = #False
      
    Default
      
      souris_x = WindowMouseX(fenetre_principale)
      souris_y = WindowMouseY(fenetre_principale)
      
      SetWindowTitle(fenetre_principale, Str(souris_x) + ", " + Str(souris_y))
      
      If ( souris_x <> -1 )
        
        If StartDrawing(ScreenOutput())
          
          DrawText(10, 10, "Position en X : " + RSet(Str(souris_x), 4, "0"), $FFFFFF, $000000)
          DrawText(10, 30, "Position en Y : " + RSet(Str(souris_y), 4, "0"), $FFFFFF, $000000)
          
          If tracer 
            LineXY(old_souris_x, old_souris_y, souris_x, souris_y, $FF0000)
          EndIf
          
          StopDrawing()
          
        EndIf
        
        old_souris_x = souris_x
        old_souris_y = souris_y
        
      EndIf
      
      FlipBuffers()
      
      Delay(1) 
      
  EndSelect
  
ForEver

End 

Publié : ven. 03/août/2007 23:31
par Flype
ThoT a écrit :J'aime bien le " select evenement " que tu as utilisé, c'est plutot pratique :P
Juste une petite question, pourquoi tu as mis le startdrawing() et le stopdrawing() là ?? :

Code : Tout sélectionner

If tracer = 1 
        StartDrawing(WindowOutput(fenetre_principale)) 
        LineXY(old_souris_x,old_souris_y,souris_x,souris_y,$FF0000) 
        StopDrawing() 
EndIf
Ca pose probleme de les mettre en dehors de la boucle principale ?
oui çà pose un problème - rien de méchant dans ce cas simple - mais çà ne se fait pas.

il y a une règle avec les fonctions de tracés :
ne placer que des fonctions de tracés entre StartDrawing() et StopDrawing().

on informe qu'on veut dessiner (startdrawing)
on dessine (le plus vite possible)
on informe qu'on a finit (stopdrawing)

Publié : ven. 03/août/2007 23:52
par Ollivier
Comme je commence à les adopter, une petite intro aux structures (et merci Flype de me faire découvrir Break!):

Code : Tout sélectionner

Structure Plan
  X.L
  Y.L
EndStructure
Dim Souris.Plan(2)
;(Une seule ligne pour définir:
; Souris(0)\X, Souris(0)\Y >>> Coordonnées actuelles de la souris
; Souris(1)\X, Souris(1)\Y >>> Coordonnées précédentes de la souris
; Souris(2)\X, Souris(2)\Y >>> Différences entre les coordonnées actuelles et précédentes

Structure ParamFenetre
  Largeur.L
  Hauteur.L
  Numero.L
EndStructure
Dim Fenetre.ParamFenetre(1)

Fenetre(0)\Largeur = 500 
Fenetre(0)\Hauteur = 500 
Fenetre(0)\Numero = OpenWindow(#PB_Any, 0, 0, Fenetre(0)\Largeur, Fenetre(0)\Hauteur, "Fenetre principale", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
InitSprite() 
OpenWindowedScreen(WindowID(Fenetre(0)\Numero), 0, 0, Fenetre(0)\Largeur, Fenetre(0)\Hauteur, #False, 0, 0) 

Repeat 
  Event = WindowEvent()   
  Select Event     
    Case #PB_Event_CloseWindow: Break       
    Case #WM_LBUTTONDOWN: Tracer = #True       
    Case #WM_LBUTTONUP: Tracer = #False       
    Default       
      Souris(0)\X = WindowMouseX(Fenetre(0)\Numero) 
      Souris(0)\Y = WindowMouseY(Fenetre(0)\Numero)       
      SetWindowTitle(Fenetre(0)\Numero, Str(Souris(0)\X) + ", " + Str(Souris(0)\Y) )       
      
      If ( Souris(0)\X <> -1 )         
        If StartDrawing(ScreenOutput())           
          DrawText(10, 10, "Position en X : " + RSet(Str(Souris(0)\X), 4, "0"), $FFFFFF, $000000) 
          DrawText(10, 30, "Position en Y : " + RSet(Str(Souris(0)\Y), 4, "0"), $FFFFFF, $000000)           
          
          If Tracer 
            LineXY(Souris(1)\X, Souris(1)\Y, Souris(0)\X, Souris(0)\Y, $FF0000) 
            Souris(2)\X = Souris(1)\X - Souris(0)\X
            Souris(2)\Y = Souris(1)\Y - Souris(0)\Y
            Souris(2)\X * Souris(2)\X
            Souris(2)\Y * Souris(2)\Y
            Dist.F = Sqr(Souris(2)\X + Souris(2)\Y)
            If Dist > 0.0
              Radius.F = 5.0 / Sqr(Dist)
            Else
              Radius = 5.0
            EndIf
            Circle(Souris(0)\X, Souris(0)\Y, Int(Radius), #Blue)
          EndIf           
          
          StopDrawing()           
        EndIf         
        
        Souris(1)\X = Souris(0)\X
        Souris(1)\Y = Souris(0)\Y      
      EndIf  
           
      FlipBuffers()       
      Delay(1)       
  EndSelect   
ForEver 

End 

Publié : sam. 04/août/2007 0:19
par Backup
juste pour rappel je vois toujours des codes utilisant des structures ayant
une declaration differente

ex :

Code : Tout sélectionner

Structure ParamFenetre
  Largeur.L
  Hauteur.L
  Numero.L
EndStructure
Dim Fenetre.ParamFenetre(1) 
savez vous que Purebasic autorise d'avoir le meme nom dans la declaration

ex :
Structure Fenetre
Largeur.L
Hauteur.L
Numero.L
EndStructure
Dim Fenetre.Fenetre(1)
:D

Publié : dim. 05/août/2007 7:56
par Ollivier
Merci Dobro. Je pensais qu'il pouvait y avoir confusion.