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!
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

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.
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!!!

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

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)

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