Page 1 sur 1
[Résolu] Obtenir un seul clic
Publié : sam. 02/janv./2016 14:51
par Micoute
Bonjour à tous,
voulant aider mon ami Shadow, j'ai voulu faire un éditeur de checkpoints, mais j'ai un problème quand je veux ajouter un élément dans la liste en cliquant sur le bouton gauche ou en en supprimant un en cliquant sur le bouton droit.
Ce que je souhaite : en cliquant sur le bouton gauche, ajouter un seul élément dans la liste, mais il me manque un filtre pour éviter d'en ajouter plusieurs non souhaités.
Le principe est le même avec le bouton droit, sauf qu'il supprime le dernier élément.
Je viens donc encore solliciter votre aide bienveillante et bien venue et je vous en remercie par anticapation.
Code : Tout sélectionner
; constantes, enumeration, variables, structures
Enumeration Fenetres
#Fenetre_principale
EndEnumeration
Enumeration Images
#Melbourne
EndEnumeration
#LargeurEcr = 1920 ;On peut choisir la résolution qu'on veut
#HauteurEcr = 1080
Structure Position
X.i
Y.i
EndStructure
Global FichierParDefaut$, Filtre$, Filtre, Fichier$, FichierImage, BtnGauche, BtnDroit, evenement, Mx, My, Quitter
Global.position NewList Checkpoint()
; Décodeurs, encodeurs
UsePNGImageDecoder()
; Initialisations
InitSprite() : InitKeyboard() : InitMouse()
Procedure Ouvrir_Fenetre_principale()
OpenWindow(#Fenetre_principale, 0, 0, #LargeurEcr, #HauteurEcr, "Editeur de Check-Points", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, #LargeurEcr, #HauteurEcr)
FichierParDefaut$ = ""
Filtre$ = "Image PNG (*.png)|*.png"
Filtre = 0 ; utiliser par défaut le premier des trois filtres possibles
Fichier$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
BtnGauche = 1
BtnDroit = 2
If Fichier$
; Charge une image
FichierImage = LoadImage(#PB_Any, Fichier$)
EndIf
SetClassLongPtr_(ScreenID(), #GCL_HCURSOR, LoadCursor_(0, #IDC_ARROW))
ShowCursor_(#True) ; montrer le curseur
EndProcedure
Procedure GestionSouris()
If MouseButton(BtnGauche)
AddElement(Checkpoint())
Checkpoint()\X = Mx
Checkpoint()\Y = My
ElseIf MouseButton(BtnDroit)
If ListSize(Checkpoint())
LastElement(Checkpoint())
DeleteElement(Checkpoint())
EndIf
EndIf
EndProcedure
Procedure Afficher()
StartDrawing(ScreenOutput())
If FichierImage
DrawImage(ImageID(FichierImage), 0, 0, #LargeurEcr, #HauteurEcr)
DrawText((#LargeurEcr-TextWidth(GetFilePart(Fichier$, #PB_FileSystem_NoExtension)))/2, 10, GetFilePart(Fichier$, #PB_FileSystem_NoExtension), 0, Point(0,0))
DrawText(10,10, Str(mx) + "/" + Str(my), 0, Point(0,0))
DrawText(10, #HauteurEcr - 20, "Appuyez sur Echap pour sortir", $FF, Point(0,0))
EndIf
StopDrawing()
EndProcedure
Procedure Quitter()
If KeyboardPushed(#PB_Key_Escape)<>#Null
Quitter = 1
EndIf
EndProcedure
Ouvrir_Fenetre_principale()
Repeat
evenement = WaitWindowEvent(1)
ExamineKeyboard()
ExamineMouse()
Mx = MouseX()
My = MouseY()
Afficher()
GestionSouris()
Quitter()
FlipBuffers()
Until Quitter = 1
End
Re: Obtenir un seul clic
Publié : sam. 02/janv./2016 15:23
par Ar-S
Ton code va trés bien, il suffit de lui ajouter un sprite pour les checkpoint :
J'ai mis une double boucle repeat et le curseur DOT à la place de l'API
Code : Tout sélectionner
; Décodeurs, encodeurs
UsePNGImageDecoder()
; Initialisations
InitSprite() : InitKeyboard() : InitMouse()
; constantes, enumeration, variables, structures
Enumeration Fenetres
#Fenetre_principale
EndEnumeration
Enumeration Images
#Melbourne
#SPRITE_DOT
EndEnumeration
#LargeurEcr = 1920 ;On peut choisir la résolution qu'on veut
#HauteurEcr = 1080
Structure Position
X.i
Y.i
EndStructure
Global FichierParDefaut$, Filtre$, Filtre, Fichier$, FichierImage, BtnGauche, BtnDroit, evenement, Mx, My, Quitter
Global.position NewList Checkpoint()
Procedure Ouvrir_Fenetre_principale()
OpenWindow(#Fenetre_principale, 0, 0, #LargeurEcr, #HauteurEcr, "Editeur de Check-Points", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, #LargeurEcr, #HauteurEcr)
; CREATION DU SPRITE DES CHECKPOINTS //////////////////////
CreateSprite(#SPRITE_DOT ,10,10)
StartDrawing(SpriteOutput(#SPRITE_DOT))
Circle(5,5,5,$FFFFFF)
StopDrawing()
; //////////////////////////////////////////
FichierParDefaut$ = ""
Filtre$ = "Image PNG (*.png)|*.png"
Filtre = 0 ; utiliser par défaut le premier des trois filtres possibles
Fichier$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
BtnGauche = 1
BtnDroit = 2
If Fichier$
; Charge une image
FichierImage = LoadImage(#PB_Any, Fichier$)
EndIf
; Si on veut rester cross plateform pas besoin de ça
; SetClassLongPtr_(ScreenID(), #GCL_HCURSOR, LoadCursor_(0, #IDC_ARROW))
; ShowCursor_(#True) ; montrer le curseur
EndProcedure
Procedure GestionSouris()
If MouseButton(BtnGauche)
AddElement(Checkpoint())
Checkpoint()\X = Mx
Checkpoint()\Y = My
ElseIf MouseButton(BtnDroit)
If ListSize(Checkpoint())
LastElement(Checkpoint())
DeleteElement(Checkpoint())
EndIf
EndIf
EndProcedure
Procedure Afficher()
If FichierImage
StartDrawing(ScreenOutput())
DrawImage(ImageID(FichierImage), 0, 0, #LargeurEcr, #HauteurEcr)
DrawText((#LargeurEcr-TextWidth(GetFilePart(Fichier$, #PB_FileSystem_NoExtension)))/2, 10, GetFilePart(Fichier$, #PB_FileSystem_NoExtension), 0, Point(0,0))
DrawText(10,10, Str(mx) + "/" + Str(my), 0, Point(0,0))
DrawText(10, #HauteurEcr - 20, "Appuyez sur Echap pour sortir", $FF, Point(0,0))
StopDrawing()
EndIf
EndProcedure
Procedure Quitter()
If KeyboardPushed(#PB_Key_Escape)<>#Null
Quitter = 1
EndIf
EndProcedure
Ouvrir_Fenetre_principale()
Repeat
Repeat
evenement = WaitWindowEvent(1)
Until evenement = 0
ExamineKeyboard()
ExamineMouse()
Mx = MouseX()
My = MouseY()
Afficher()
GestionSouris()
; AFFICHAGE DES CHECKPOINTS //////////////////////
ForEach Checkpoint()
DisplaySprite(#SPRITE_DOT, Checkpoint()\X, Checkpoint()\Y )
Next
; ///////////////////////////////////////////
; AFFICHAGE DU CURSEUR / CHECKPOINT, ça evite l'API pour rester CROSSPLATEFORM
; Rien ne t'empeche de le remplacer par un sprite curseur dédié
DisplaySprite(#SPRITE_DOT, Mx, My )
Quitter()
FlipBuffers()
Until Quitter = 1
End
Re: Obtenir un seul clic
Publié : sam. 02/janv./2016 18:42
par Micoute
Merci Ar-s, mais ça ajouter le même checkpoint de multiples fois, bien que j'adore le principe.
Re: Obtenir un seul clic
Publié : sam. 02/janv./2016 20:02
par Ar-S
je ne comprends pas ta demande.
un clic gauche = 1 element ds la liste = 1 point
un clic droit = suppression du dernier element de la liste et du dernier point
en cliquant sur le bouton gauche, ajouter un seul élément dans la liste, mais il me manque un filtre pour éviter d'en ajouter plusieurs non souhaités.
c'est pourtant bien ce qu'il se passe
Re: Obtenir un seul clic
Publié : sam. 02/janv./2016 21:11
par Micoute
En théorie, oui, mais si tu regardes de plus près, tu vois qu'il il y de multiples éléments qui ont les mêmes valeurs, ce qui ne compromet pas le fonctionnement du programme étant donné que je dimensionne le tableau en rapport avec la taille de la liste.
Re: Obtenir un seul clic
Publié : sam. 02/janv./2016 23:13
par Ar-S
désolé mais je ne pige vraiment pas ce que tu essayes de me dire, c'est peut être du à ma crève..
Re: Obtenir un seul clic
Publié : dim. 03/janv./2016 1:28
par case
Code : Tout sélectionner
; Décodeurs, encodeurs
UsePNGImageDecoder()
; Initialisations
InitSprite() : InitKeyboard() : InitMouse()
; constantes, enumeration, variables, structures
Enumeration Fenetres
#Fenetre_principale
EndEnumeration
Enumeration Images
#Melbourne
#SPRITE_DOT
EndEnumeration
#LargeurEcr = 1920 ;On peut choisir la résolution qu'on veut
#HauteurEcr = 1080
Structure Position
X.i
Y.i
EndStructure
Global FichierParDefaut$, Filtre$, Filtre, Fichier$, FichierImage, BtnGauche, BtnDroit, evenement, Mx, My, Quitter
Global.position NewList Checkpoint()
Procedure Ouvrir_Fenetre_principale()
OpenWindow(#Fenetre_principale, 0, 0, #LargeurEcr, #HauteurEcr, "Editeur de Check-Points", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, #LargeurEcr, #HauteurEcr)
; CREATION DU SPRITE DES CHECKPOINTS //////////////////////
CreateSprite(#SPRITE_DOT ,10,10)
StartDrawing(SpriteOutput(#SPRITE_DOT))
Circle(5,5,5,$FFFFFF)
StopDrawing()
; //////////////////////////////////////////
FichierParDefaut$ = ""
Filtre$ = "Image PNG (*.png)|*.png"
Filtre = 0 ; utiliser par défaut le premier des trois filtres possibles
Fichier$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
BtnGauche = 1
BtnDroit = 2
If Fichier$
; Charge une image
FichierImage = LoadImage(#PB_Any, Fichier$)
EndIf
; Si on veut rester cross plateform pas besoin de ça
; SetClassLongPtr_(ScreenID(), #GCL_HCURSOR, LoadCursor_(0, #IDC_ARROW))
; ShowCursor_(#True) ; montrer le curseur
EndProcedure
Procedure GestionSouris()
If MouseButton(BtnGauche)
AddElement(Checkpoint())
Checkpoint()\X = Mx
Checkpoint()\Y = My
While MouseButton(BtnGauche) ; ###################################################
WaitWindowEvent() ; # pour ne pas avoir plusieur checkpoints ayant la meme valeur si on clic trop #
ExamineMouse() ; # longtemps on attend que le bouton de la souris soit relache #
Wend ; ###################################################
ElseIf MouseButton(BtnDroit)
If ListSize(Checkpoint())
LastElement(Checkpoint())
DeleteElement(Checkpoint())
EndIf
While MouseButton(BtnDroit) ; ###################################################
WaitWindowEvent() ; # pour ne pas avoir plusieur checkpoints ayant la meme valeur si on clic trop #
ExamineMouse() ; # longtemps on attend que le bouton de la souris soit relache #
Wend ; ###################################################
EndIf
EndProcedure
Procedure Afficher()
If FichierImage
StartDrawing(ScreenOutput())
DrawImage(ImageID(FichierImage), 0, 0, #LargeurEcr, #HauteurEcr)
DrawText((#LargeurEcr-TextWidth(GetFilePart(Fichier$, #PB_FileSystem_NoExtension)))/2, 10, GetFilePart(Fichier$, #PB_FileSystem_NoExtension), 0, Point(0,0))
DrawText(10,10, Str(mx) + "/" + Str(my), 0, Point(0,0))
DrawText(10, #HauteurEcr - 20, "Appuyez sur Echap pour sortir", $FF, Point(0,0))
StopDrawing()
EndIf
EndProcedure
Procedure Quitter()
If KeyboardPushed(#PB_Key_Escape)<>#Null
Quitter = 1
EndIf
EndProcedure
Ouvrir_Fenetre_principale()
Repeat
Repeat
evenement = WaitWindowEvent(1)
Until evenement = 0
ExamineKeyboard()
ExamineMouse()
Mx = MouseX()
My = MouseY()
Afficher()
GestionSouris()
; AFFICHAGE DES CHECKPOINTS //////////////////////
ForEach Checkpoint()
DisplaySprite(#SPRITE_DOT, Checkpoint()\X, Checkpoint()\Y )
Next
; ///////////////////////////////////////////
; AFFICHAGE DU CURSEUR / CHECKPOINT, ça evite l'API pour rester CROSSPLATEFORM
; Rien ne t'empeche de le remplacer par un sprite curseur dédié
DisplaySprite(#SPRITE_DOT, Mx, My )
Quitter()
FlipBuffers()
Until Quitter = 1
End
Re: Obtenir un seul clic
Publié : dim. 03/janv./2016 8:45
par Micoute
Immense merci à vous deux pour votre aide très précieuse pour moi, la bouche While/Wend est une riche trouvaille et fait parfaitement l'office de filtre que j'en attendais.
Re: [Résolu] Obtenir un seul clic
Publié : dim. 03/janv./2016 11:21
par Ar-S
OK je viens de piger, lorsque je cliquais j'avais une incrémentation de 1,
pas plus, un clic est un clic, la prochaine fois précise
SI on laisse le clic gauche pressé on voit qu'il il y de multiples éléments qui ont les mêmes valeurs ! (d'ailleurs ça aussi c'est pas très juste)
Case à pigé et tant mieux pour toi mais la "justesse" des mots à son importance

Re: Obtenir un seul clic
Publié : dim. 03/janv./2016 11:51
par case
Ar-S a écrit :désolé mais je ne pige vraiment pas ce que tu essayes de me dire, c'est peut être du à ma crève..
ça a l'air d'aller mieux
Re: [Résolu] Obtenir un seul clic
Publié : dim. 03/janv./2016 12:58
par Ar-S
c'est parce que j'ai maté ton code
Mais oui ça va un peu mieux

Re: [Résolu] Obtenir un seul clic
Publié : dim. 03/janv./2016 13:35
par Micoute
Désolé de n'avoir pas été très clair dans l'explication des symptômes de mon problème, mais quand on se noie, on ne pense pas forcément à sortir la tête de l'eau pour voir qu'on est à seulement 1 centimètre du bord et qu'on panique pour rien !
Re: [Résolu] Obtenir un seul clic
Publié : dim. 03/janv./2016 13:38
par Ar-S
Ouai mais si tu sorts pas au moins la main, les sauveteurs ils peuvent pas faire grand chose
