[résolu] déplacement souris en suivant une grille

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

[résolu] déplacement souris en suivant une grille

Message par Patrick88 »

salut

bon ça fait plusieurs soirée que je sèche sur le sujet, alors de dépit je vous soumet le problème :

l'appli : il s'agit de l'ébauche d'un "visual designer" :wink:

l'action recherchée : je veux que le curseur de la souris se déplace en suivant une grille:

après compilation:
aller dans option / grille / utiliser la grille / pas de 20 (ou 10)
le curseur se balade avec le "pas" sélectionné , mais avec difficulté ou alors ça gigote beaucoup ( utilisation de windowmouseX() à la place de getcursor.... )
de plus il y a un gros écart entre le pointeur et le gadget "flottant"

le code malicieux : ligne 217 à 243 ( extrait )

Code : Tout sélectionner

Case #WM_MOUSEMOVE ;{
          If begin_drag 
            GetCursorPos_(CursorPos.POINT)
            ;Debug Taille_Fenetre\left
            ; position du curseur par rapport au haut gauche du bureau
            info_gadget\gdt_coord_x = CursorPos\x
            info_gadget\gdt_coord_y = CursorPos\y
            
            ; info_gadget\gdt_coord_x = WindowMouseX()
            ; info_gadget\gdt_coord_y = WindowMouseY()
            SetWindowTitle(#WIN_MAIN,Str(info_gadget\gdt_coord_x)+","+Str(info_gadget\gdt_coord_y))
            ;{- gérer la grille ici
            If grid_use = #True
              If grid_size=0:grid_size=10:EndIf
               info_gadget\gdt_coord_x = info_gadget\gdt_coord_x - (info_gadget\gdt_coord_x % grid_size)
               info_gadget\gdt_coord_y = info_gadget\gdt_coord_y - (info_gadget\gdt_coord_y % grid_size)
              ;info_gadget\gdt_coord_x & grid_size
              ;info_gadget\gdt_coord_y & grid_size
              ;DebugPT(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
            
              ;UpdateWindow_(WindowID())
              
               
            EndIf
            ;Delay(50)
             SetCursorPos_(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
            ;}
le prog complet

Code : Tout sélectionner

#largeur_fenetre = 640
#hauteur_fenetre = 480

Structure STRU_INFO_GADGET
  gdt_Id.l
  gdt_name.s
  gdt_coord_x.w
  gdt_coord_y.w 
  gdt_width.w
  gdt_height.w
  gdt_Title.s
  gdt_option.l
EndStructure

Structure STRU_COMPTEUR_GADGET
  nb_ButtonGadget.l
  nb_TextGadget.l
  nb_StringGadget.l
  nb_ListIconGadget.l
EndStructure

NewList liste_gadget.STRU_INFO_GADGET()

Global info_gadget.STRU_INFO_GADGET
Global compteur_gadget.STRU_COMPTEUR_GADGET 

Procedure DebugPT(X1,y1)
  Debug "X: "+Str(X1)+" , Y: "+Str(y1)
EndProcedure

Procedure AddToListe_Gadget()
  AddElement(liste_gadget())
  liste_gadget()\gdt_Id       = info_gadget\gdt_Id
  liste_gadget()\gdt_name     = info_gadget\gdt_name
  liste_gadget()\gdt_coord_x  = info_gadget\gdt_coord_x
  liste_gadget()\gdt_coord_y  = info_gadget\gdt_coord_y
  liste_gadget()\gdt_width    = info_gadget\gdt_width 
  liste_gadget()\gdt_height   = info_gadget\gdt_height 
  liste_gadget()\gdt_Title    = info_gadget\gdt_Title 
  liste_gadget()\gdt_option   = info_gadget\gdt_option 
EndProcedure

Procedure FEN_PRINCIPALE()
  Enumeration 
    #WIN_MAIN
    
    #MENU_WIN_MAIN
      #Mnu_New_Project
      #Mnu_New_Window
      
      #Mnu_Terminer
      ; ----------------
      #Mnu_Add_ButtonGadget
      #Mnu_Add_TextGadget
      #Mnu_Add_StringGadget
      #Mnu_Add_ListIconGadget
      
      #Mnu_Add_StringGadget_extended
      #Mnu_Add_ListIconGadget_extended
      
      ; -----------------
      #Mnu_Grid_Use
      #Mnu_Grid_View
      #Mnu_Grid_5
      #Mnu_Grid_10
      #Mnu_Grid_20
      
  EndEnumeration

;{ variables locales  
  quit.b = 0 
  EventID.l = 0
  type_gadget.b = 0
  begin_drag.b = #False
  grid_use.b = #False
  grid_view.b = #False
  grid_size.b=0 

  compteur_gadget\nb_ButtonGadget = 1
  compteur_gadget\nb_TextGadget = 1
  compteur_gadget\nb_StringGadget = 1
  compteur_gadget\nb_ListIconGadget = 1
  ;}
  
  If OpenWindow(#WIN_MAIN,0,0,#largeur_fenetre,#hauteur_fenetre,#PB_Window_SystemMenu,"RAD")
    If CreateMenu(#MENU_WIN_MAIN,WindowID(#WIN_MAIN)) ;{
      MenuTitle("Fichier")
        OpenSubMenu("Nouveau")
          MenuItem(#Mnu_New_Project,"Projet...")
          MenuItem(#Mnu_New_Window,"Fenetre...")
        CloseSubMenu()
        MenuBar()
        MenuItem(#Mnu_Terminer,"Terminer")
      MenuTitle("Gadgets")    
        MenuItem(#Mnu_Add_ButtonGadget,"ButtonGadget")
        MenuItem(#Mnu_Add_TextGadget,"TextGadget")
        MenuItem(#Mnu_Add_StringGadget,"StringGadget")
        MenuItem(#Mnu_Add_ListIconGadget,"ListIconGadget")
        MenuBar()
        OpenSubMenu("Gadgets étendu")
          ;MenuItem(#Mnu_Add_ButtonGadget,"ButtonGadget")
          ;MenuItem(#Mnu_Add_TextGadget,"TextGadget")
          MenuItem(#Mnu_Add_StringGadget_extended,"StringGadget")
          MenuItem(#Mnu_Add_ListIconGadget_extended,"ListIconGadget")
          CloseSubMenu()
          
      MenuTitle("Options")
        OpenSubMenu("Grille")
          MenuItem(#Mnu_Grid_Use,"Utiliser la Grille")
          MenuItem(#Mnu_Grid_View,"Voir la Grille")
          MenuBar()
          MenuItem(#Mnu_Grid_5,"pas de 5")
          MenuItem(#Mnu_Grid_10,"pas de 10")
          MenuItem(#Mnu_Grid_20,"pas de 20")
        CloseSubMenu()
    EndIf ;}
    
    If CreateGadgetList(WindowID(#WIN_MAIN))
    EndIf
    
    ; GetWindowRect_(WindowID(), @Taille_Fenetre.RECT)
    ; largeur_Bordure_Fenetre.b = (WindowWidth() - (Taille_Fenetre\Right - Taille_Fenetre\left))/2
    
    Repeat
      EventID = WaitWindowEvent()
      
      Select EventID
        Case #PB_Event_Menu
          Select EventMenuID() ;{
            Case #Mnu_Terminer
              quit = 1
              
            Case #Mnu_Add_ButtonGadget
              type_gadget = #Mnu_Add_ButtonGadget
              begin_drag = #True
              info_gadget\gdt_width   = 80
              info_gadget\gdt_height  = 20
              
            Case #Mnu_Add_TextGadget
              type_gadget = #Mnu_Add_TextGadget
              begin_drag = #True
              info_gadget\gdt_width   = 80
              info_gadget\gdt_height  = 20
              
            Case #Mnu_Add_StringGadget
              type_gadget = #Mnu_Add_StringGadget
              begin_drag = #True
              info_gadget\gdt_width   = 80
              info_gadget\gdt_height  = 20
              
            Case #Mnu_Add_ListIconGadget
              type_gadget = #Mnu_Add_ListIconGadget
              begin_drag = #True
              info_gadget\gdt_width   = 100
              info_gadget\gdt_height  = 100
              
            Case #Mnu_Add_StringGadget_extended
              type_gadget = #Mnu_Add_StringGadget_extended
              begin_drag = #True
              info_gadget\gdt_width   = 160
              info_gadget\gdt_height  = 20
              
            Case #Mnu_Add_ListIconGadget_extended
              type_gadget = #Mnu_Add_ListIconGadget_extended
              begin_drag = #True
              info_gadget\gdt_width   = 100
              info_gadget\gdt_height  = 120
            ;{ Gestion de la grille  
            Case #Mnu_Grid_Use
              If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_Use)=1
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_Use,0)
                grid_use = #False
              Else
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_Use,1)
                grid_use = #True
              EndIf
            Case #Mnu_Grid_View
              If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_View)=1
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_View,0)
                grid_view = #False
              Else
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_View,1)
                grid_view = #True
              EndIf
            Case #Mnu_Grid_5
              If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5)=1
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5,0)
                grid_size = 0
              Else
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5,1)
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10,0)
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20,0)
                grid_size = 5
              EndIf
            Case #Mnu_Grid_10
              If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10)=1
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10,0)
                grid_size = 0
              Else
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5,0)
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10,1)
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20,0)
                grid_size = 10
              EndIf
            Case #Mnu_Grid_20  
              If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20)=1
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20,0)
                grid_size = 0
              Else
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5,0)
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10,0)
                SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20,1)
                grid_size = 20
              EndIf ;}
          EndSelect ;}
          
        Case #WM_MOUSEMOVE ;{
          If begin_drag 
            GetCursorPos_(CursorPos.POINT)
            ;Debug Taille_Fenetre\left
            ; position du curseur par rapport au haut gauche du bureau
            info_gadget\gdt_coord_x = CursorPos\x
            info_gadget\gdt_coord_y = CursorPos\y
            
            ; info_gadget\gdt_coord_x = WindowMouseX()
            ; info_gadget\gdt_coord_y = WindowMouseY()
            SetWindowTitle(#WIN_MAIN,Str(info_gadget\gdt_coord_x)+","+Str(info_gadget\gdt_coord_y))
            ;{- gérer la grille ici
            If grid_use = #True
              If grid_size=0:grid_size=10:EndIf
               info_gadget\gdt_coord_x = info_gadget\gdt_coord_x - (info_gadget\gdt_coord_x % grid_size)
               info_gadget\gdt_coord_y = info_gadget\gdt_coord_y - (info_gadget\gdt_coord_y % grid_size)
              ;info_gadget\gdt_coord_x & grid_size
              ;info_gadget\gdt_coord_y & grid_size
              ;DebugPT(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
            
              ;UpdateWindow_(WindowID())
              
               
            EndIf
            ;Delay(50)
             SetCursorPos_(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
            ;}
            If StartDrawing(WindowOutput())
              DrawingMode(2|4)
              Box(info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height,RGB(255,0,0))
              Delay(10)
              Box(info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height,RGB(255,0,0))
              StopDrawing()
            EndIf
          EndIf ;}
          
        Case #WM_LBUTTONUP ;{
          Select type_gadget
            Case #Mnu_Add_ButtonGadget
              info_gadget\gdt_option = 0
              info_gadget\gdt_Title = "Button"+Str(compteur_gadget\nb_ButtonGadget)
              Id_Gadget = ButtonGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title)
              info_gadget\gdt_Id = Id_Gadget
              info_gadget\gdt_name = "ButtonGadget("
              AddToListe_Gadget() 
              compteur_gadget\nb_ButtonGadget+1
              type_gadget=0
              begin_drag = #False
            Case #Mnu_Add_TextGadget
              info_gadget\gdt_option = #PB_Text_Border
              info_gadget\gdt_Title = "Text"+Str(compteur_gadget\nb_TextGadget)
              Id_Gadget = TextGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title, info_gadget\gdt_option)
              info_gadget\gdt_Id = Id_Gadget
              info_gadget\gdt_name = "TextGadget("
              AddToListe_Gadget()
              compteur_gadget\nb_TextGadget+1
              type_gadget=0
              begin_drag = #False
            Case #Mnu_Add_StringGadget
              info_gadget\gdt_option = 0
              info_gadget\gdt_Title = "String"+Str(compteur_gadget\nb_StringGadget)
              Id_Gadget = StringGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title, info_gadget\gdt_option)
              info_gadget\gdt_Id = Id_Gadget
              info_gadget\gdt_name = "StringGadget("
              AddToListe_Gadget()
              compteur_gadget\nb_StringGadget+1
              type_gadget=0
              begin_drag = #False
            Case #Mnu_Add_ListIconGadget
              info_gadget\gdt_option = 0
              info_gadget\gdt_Title = "ListIcon"+Str(compteur_gadget\nb_ListIconGadget)
              Id_Gadget = ListIconGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title,100,info_gadget\gdt_option)
              info_gadget\gdt_Id = Id_Gadget
              info_gadget\gdt_name = "ListIconGadget("
              AddToListe_Gadget()
              compteur_gadget\nb_ListIconGadget+1
              type_gadget=0
              begin_drag = #False
              
              ;{- gadgets étendu
            Case #Mnu_Add_StringGadget_extended
              info_gadget\gdt_option = #PB_Text_Border
              info_gadget\gdt_Title = "Text"+Str(compteur_gadget\nb_TextGadget)
              Id_Gadget = TextGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width/2, info_gadget\gdt_height, info_gadget\gdt_Title, info_gadget\gdt_option)
              info_gadget\gdt_Id = Id_Gadget
              info_gadget\gdt_name = "TextGadget("
              AddToListe_Gadget()
              compteur_gadget\nb_TextGadget+1
              
              info_gadget\gdt_option = 0
              info_gadget\gdt_Title = "Button"+Str(compteur_gadget\nb_ButtonGadget)
              Id_Gadget = StringGadget(#PB_Any,info_gadget\gdt_coord_x+(info_gadget\gdt_width/2), info_gadget\gdt_coord_y, info_gadget\gdt_width/2, info_gadget\gdt_height, info_gadget\gdt_Title, info_gadget\gdt_option)
              info_gadget\gdt_Id = Id_Gadget
              info_gadget\gdt_name = "StringGadget("
              AddToListe_Gadget()
              compteur_gadget\nb_StringGadget+1
              type_gadget=0
              begin_drag = #False
            Case #Mnu_Add_ListIconGadget_extended
              info_gadget\gdt_option = #PB_Text_Border
              info_gadget\gdt_Title = "Text"+Str(compteur_gadget\nb_TextGadget)
              Id_Gadget = TextGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, 20, info_gadget\gdt_Title, info_gadget\gdt_option)
              info_gadget\gdt_Id = Id_Gadget
              info_gadget\gdt_name = "TextGadget("
              AddToListe_Gadget()
              compteur_gadget\nb_TextGadget+1
              
              info_gadget\gdt_option = 0
              info_gadget\gdt_Title = "ListIcon"+Str(compteur_gadget\nb_ListIconGadget)
              Id_Gadget = ListIconGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y+20, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title,100,info_gadget\gdt_option)
              info_gadget\gdt_Id = Id_Gadget
              info_gadget\gdt_name = "ListIconGadget("
              AddToListe_Gadget()
              compteur_gadget\nb_ListIconGadget+1
              type_gadget=0
              begin_drag = #False  
            ;}
          EndSelect ;}
          
        Case #PB_Event_CloseWindow
          quit = 2
      EndSelect
    Until quit>0
  
  EndIf
  If CreateFile(0,"LISTE_GADGET.TXT")
    ForEach liste_gadget()
      ;WriteStringN(Str(liste_gadget()\gdt_Id))
      chaine$ = liste_gadget()\gdt_name+","+Str(liste_gadget()\gdt_coord_x)+","+Str(liste_gadget()\gdt_coord_y)+","
      chaine$ = chaine$ + Str(liste_gadget()\gdt_width)+","+Str(liste_gadget()\gdt_height)+","+liste_gadget()\gdt_Title+","+Str(liste_gadget()\gdt_option)+")"
      WriteStringN(chaine$)
      
    Next
    CloseFile(0)
  EndIf
EndProcedure

FEN_PRINCIPALE()

End
vala , à vos clavier...

mercix

pat
Dernière modification par Patrick88 le dim. 06/nov./2005 18:28, modifié 1 fois.
Anonyme

Message par Anonyme »

Si j'ai bien compris tu veut que ton curseur se déplace suivant le pas.

Tu as la commande MousedeltaX() , mais je crois qu'il faut un openscreen() ou openwindowedscreen() avant.

Sinon un truc tout simple:

Si mouseX() > 0 and mouseX()<20 alors CurseurX est en position 1
Si mouseX()>20 and mouseX()<40 alors CurseurX est en position 2
etc...

J'ai pas tester ton code. à toi de l'adapter.

@++
Anonyme

Message par Anonyme »

Je viens de tester ton code.


Code : Tout sélectionner

        Case #WM_MOUSEMOVE ;{ 
          If begin_drag 
            ;GetCursorPos_(CursorPos.POINT)   <----------------------------
            ;Debug Taille_Fenetre\left 
            ; position du curseur par rapport au haut gauche du bureau 
            info_gadget\gdt_coord_x = WindowMouseX()
            info_gadget\gdt_coord_y = WindowMouseY()

            
       
             SetWindowTitle(#WIN_MAIN,Str(info_gadget\gdt_coord_x)+","+Str(info_gadget\gdt_coord_y)) 
            ;{- gérer la grille ici 
            If grid_use = #True 
              If grid_size=0:grid_size=10:EndIf 
               info_gadget\gdt_coord_x = info_gadget\gdt_coord_x - (info_gadget\gdt_coord_x % grid_size) 
               info_gadget\gdt_coord_y = info_gadget\gdt_coord_y - (info_gadget\gdt_coord_y % grid_size) 
              ;info_gadget\gdt_coord_x & grid_size 
              ;info_gadget\gdt_coord_y & grid_size 
              ;DebugPT(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y) 
            
              ;UpdateWindow_(WindowID()) 
              
                
            EndIf 
            ;Delay(50) 
             ;SetCursorPos_(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y) <----------------------------
            ;} 
            If StartDrawing(WindowOutput()) 
              DrawingMode(2|4) 
              Box(info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height,RGB(255,0,0)) 
              Delay(10) 
              Box(info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height,RGB(255,0,0)) 
              StopDrawing() 
            EndIf 
          EndIf ;} 
  


Cela me donne des mouvements de souris un peu plus correcte. il se déplace suivant le pas
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

Cpl.Bator a écrit :Si j'ai bien compris tu veut que ton curseur se déplace suivant le pas.

Sinon un truc tout simple:

Si mouseX() > 0 and mouseX()<20 alors CurseurX est en position 1
Si mouseX()>20 and mouseX()<40 alors CurseurX est en position 2
etc...
si tu as un écran de 1024 pixels tu va avoir 100 test "if " à la queue leu leu
bon, ça marche, ok, mais c'est pas jojo ...

le code

Code : Tout sélectionner

               info_gadget\gdt_coord_x = info_gadget\gdt_coord_x - (info_gadget\gdt_coord_x % grid_size)
               info_gadget\gdt_coord_y = info_gadget\gdt_coord_y - (info_gadget\gdt_coord_y % grid_size) 
fait la même chose en moins de ligne...

mais bon, ça marche pas quand même ...

merci

pat
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Apparemment tu cherches à repositionner la souris , c'est bien ça ?

Je pense que c'est le gadget qui doit suivre la grille , pas la souris .
Il faut calculer la position du gadget en fonction de la position de la souris , et en tenant compte de la grille.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

comtois a écrit :Apparemment tu cherches à repositionner la souris , c'est bien ça ?

Je pense que c'est le gadget qui doit suivre la grille , pas la souris .
Il faut calculer la position du gadget en fonction de la position de la souris , et en tenant compte de la grille.
tu as raison, dans mon code je suis trop gourmant :

je replace le gadget et je replace le curseur souris
voila pourquoi le curseur gigote

merci maitre :wink:

pat
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'étais en train de préparer un exemple

alors je ne vais pas le jeter , je le mets quand même , même si tu n'en as pas besoin :)
Bon c'est pas une fenêtre ,je suis reparti du code pathfinding qui utilise le mode plein écran , et j'ai supprimé tout ce qui ne servait pas.

Code : Tout sélectionner

; --- Initialisation ---
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
    MessageRequester("Erreur", "Impossible d'initialiser DirectX 7 Ou plus", 0)
    End
EndIf

; --- Plein écran ---
#ScreenWidth = 800
#ScreenHeight = 600
#ScreenDepth = 16
If OpenScreen(#ScreenWidth,#ScreenHeight,#ScreenDepth,"Essai Pathfinding") = 0
    MessageRequester("Erreur", "Impossible d'ouvrir l'écran ", 0)
    End
EndIf

#max_x=48
#max_y=48
#max_x1=#max_x+1

#taille=12

Enumeration
    #depart
    #Souris
EndEnumeration

;/Box
CreateSprite(#depart, #taille*3, #taille*2)
StartDrawing(SpriteOutput(#depart))
DrawingMode(4)
Box(0,0,#taille*3, #taille*2,RGB(200,200,55))
StopDrawing()
;/ Souris
CreateSprite(#Souris, #taille, #taille)
StartDrawing(SpriteOutput(#Souris))
DrawingMode(4)
Box(1,1,#taille-1,#taille-1,RGB(100,200,255))
StopDrawing()

Procedure AffGrille()
    Couleur=RGB(100,100,100)
    Couleur1=RGB(255,255,255)
    StartDrawing(ScreenOutput())
    For x=0 To #max_x
        Line(x*#taille,0,0,(#max_y+1)*#taille,Couleur)
    Next x 
    For y=0 To #max_y
        Line(0,y*#taille,(#max_x+1)* #taille,0,Couleur)
    Next y    
    
    DrawingMode(4)
    Box(0,0,#taille*(#max_x+1),#taille*(#max_y+1),Couleur1)
    StopDrawing()
EndProcedure

Repeat
FlipBuffers()
    ClearScreen(0,0,0)
    
    ExamineKeyboard()
	ExamineMouse()
    AffGrille()
   
    ;Affiche la souris
    DisplayTransparentSprite(#Souris,MouseX() - #taille / 2,MouseY() - #taille / 2)
    
    ;Affiche le gadget ici 
    DepX=MouseX()/#taille
    DepY=MouseY()/#taille
    DisplayTransparentSprite(#depart,DepX*#Taille,DepY*#taille)

Until KeyboardPushed(#PB_Key_Escape)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

oui, mais non ...

ton exemple utilise "openscreen" alors que moi je reste en "openwindow"

bon, surcelaprésentementdodo

pat
Anonyme

Message par Anonyme »

Patrick88 a écrit : si tu as un écran de 1024 pixels tu va avoir 100 test "if " à la queue leu leu
bon, ça marche, ok, mais c'est pas jojo ...
Et les boucles For/Next ? une seule suffit.


Code : Tout sélectionner

For y = 0 to 768 step pas
For x = 0 to 1024 step pas

if mousex()>X and mousex()<X+pas and mousey()>y and mousey()<y+pas
endif


next x
next y
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

step pas
en basic traditionel c'est comme ça que l'on fait !
mais en PureBasic , on peut pas utiliser les variables apres un "Step" !! :(
ça fait un moment qu'on le demande ..... :mad:
Anonyme

Message par Anonyme »

je le sais ^^
cela m'embête aussi :twisted: :twisted: :twisted:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

L'avantage d'une variable, c'est que tu peut modifier ton pas comme tu veut, mais ce qui serait encore mieux, c'est de pouvoir la modifier en cours de boucle.
Je ne me rappelle pas si c'était possible, ça, dans les anciens basics.

Un pas progressif ou dégressif, en fait.

Code : Tout sélectionner

A = 1
For I = 0 to 10 Step A
 ......
 If A < 4
   A +1
 Endif
Next
Pour simuler l'acceleration/décélération d'un sprite, par exemple, ou pour faire sauter un personnage. :)
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

le pas de la grille est correcte en utilisant ce bout de code !!!

Code : Tout sélectionner

              info_gadget\gdt_coord_x = (info_gadget\gdt_coord_x / grid_size)*grid_size
              info_gadget\gdt_coord_y = (info_gadget\gdt_coord_y / grid_size)*grid_size

Code : Tout sélectionner

If begin_drag

            info_gadget\gdt_coord_x = WindowMouseX()
            info_gadget\gdt_coord_y = WindowMouseY()
            Debug "-------------------------Avant--------------------------"
            DebugPT(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
            
            ;{- gérer la grille ici
            If grid_use = #True
              If grid_size=0:grid_size=10:EndIf
              info_gadget\gdt_coord_x = (info_gadget\gdt_coord_x / grid_size)*grid_size
              info_gadget\gdt_coord_y = (info_gadget\gdt_coord_y / grid_size)*grid_size
              
              ;info_gadget\gdt_coord_x & grid_size
              ;info_gadget\gdt_coord_y & grid_size
              Debug "-------------------------Après--------------------------"
              DebugPT(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
              
              ;UpdateWindow_(WindowID())
              
              
            EndIf
merci comtois de m'avoir mis sur la piste...

je vais pouvoir avancer...

patrick
Répondre