Dessin trés simple

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Dessin trés simple

Message 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!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

...........
Dernière modification par Backup le mar. 19/août/2014 13:30, modifié 1 fois.
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message 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 ?
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message par ThoT »

En effet, c'est mieux...
Merci Mytic!!! 8)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

.....
Dernière modification par Backup le mar. 19/août/2014 13:30, modifié 1 fois.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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 
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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)
Image
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Merci Dobro. Je pensais qu'il pouvait y avoir confusion.
Répondre