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 8)

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..
:mrgreen:

ç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 :twisted:
Mais oui ça va un peu mieux :wink:

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 :mrgreen: