"Dragging" einer Box -> Bewegung nur in +Richtu

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

"Dragging" einer Box -> Bewegung nur in +Richtu

Beitrag von benji »

Heyho...
Ich will versuchen eine Box zu "draggen", zu bewegen und dann nachdem die Maus losgelassen wurde wieder zu droppen.
Komischerweise will das bewegen der Box nur in positive Richtung passieren...
Ich weiß nicht wo mein Fehler liegt... vllt habt ihr ne Idee - danke schon jetzt :)

Code: Alles auswählen

  If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
  
    If InitMouse() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
  
  If OpenWindow(0, 0, 0, 400, 400, "A screen in a window...",  #PB_Window_ScreenCentered)

    If OpenWindowedScreen(WindowID(0), 0, 0, 400, 400, 0, 0, 0)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf
  
  Repeat
    ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
    ;
    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
        
        Case #PB_Event_CloseWindow
          End           
      EndSelect
      
      If GetAsyncKeyState_(#VK_ESCAPE)
      End
      EndIf
    Until Event = 0
  
    FlipBuffers() 
    ClearScreen(RGB(255, 255, 255))
    ExamineMouse() 
    mousey = MouseY()
    mousex = MouseX()
    StartDrawing(ScreenOutput())
    Box(mousex, mousey , 10, 10, 0)
    DrawText(0, 0, "Mouse pos: "+Str(mousex)+" | "+ Str(mousey) , RGB(0, 0, 0) , RGB(255, 255, 255))
    StopDrawing()
;     If MouseButton(#PB_MouseButton_Left) And mousey = y+20 Or mousex = x+20 
;     If MouseButton(#PB_MouseButton_Left)
     If mousey >= y + 5  And mousey <= y + 20 And mousex >= x+5  And mousex <= x + 20 And drag = 0
      ExamineMouse()
      Debug "inside"
      in = 1
      If MouseButton(#PB_MouseButton_Left)
        y = mousey
        x = mousex

      EndIf

      Else
      Debug "outside"
      in = 0
     EndIf
     
;      If in And MouseButton(#PB_MouseButton_Left)
;       drag = 1
;       y = mousey
;       x = mousex
;       Else 
;       drag = 0 
;       EndIf
      
;     Else
;      pressed = 0
;      EndIf
    
    DisplaySprite(0, x, y)
    Delay(1)
  ForEver
gruß!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

als erstes sehe ich, dass du da 2x ExamineMouse drin hast, das muss auf jeden fall mal weg....

später mehr *code weiterles*
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also....

durch

Code: Alles auswählen

        y = mousey
        x = mousex
setzt du dein icon automatisch an die stelle vom mauspointer.
click mal einfach auf dein sprite, das bewegt sich sofort.
eigentlich musst du die differenzen mousey-y und mousex-x zwischenspeichern,
denn die sollen ja gleich bleiben.

nuja auf jeden fall, bei einem einfachen click schon wird der client-bereich verschoben.
wenn du dann nach links gehst, ist der mauspointer außerhalb des bereichs, das dragging findet nicht mehr statt.

du musst das anders angehen, das drägging sollte nur stattfinden,
wenn der Button seit dem letzten Frame gedrückt geblieben ist,
und dann musst du deine x/y auf die neuen mousex,mousey + alte differenzen setzen...
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

so sollte es gehen:

Code: Alles auswählen

If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
 
    If InitMouse() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
 
  If OpenWindow(0, 0, 0, 400, 400, "A screen in a window...",  #PB_Window_ScreenCentered)

    If OpenWindowedScreen(WindowID(0), 0, 0, 400, 400, 0, 0, 0)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf
 
  Repeat
    ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
    ;
    Repeat
      Event = WindowEvent()
     
      Select Event
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
       
        Case #PB_Event_CloseWindow
          End           
      EndSelect
     
      If GetAsyncKeyState_(#VK_ESCAPE)
      End
      EndIf
    Until Event = 0
 
    FlipBuffers()
    ClearScreen(RGB(255, 255, 255))
    ExamineMouse()
    mousey = MouseY()
    mousex = MouseX()
    StartDrawing(ScreenOutput())
    Box(mousex, mousey , 10, 10, 0)
    DrawText(0, 0, "Mouse pos: "+Str(mousex)+" | "+ Str(mousey) , RGB(0, 0, 0) , RGB(255, 255, 255))
    StopDrawing()
;     If MouseButton(#PB_MouseButton_Left) And mousey = y+20 Or mousex = x+20
;     If MouseButton(#PB_MouseButton_Left)
     If ((mousey >= y + 5  And mousey <= y + 20) Or (mousey <= y - 5  And mousey >= y - 20) And (mousex >= x+5  And mousex <= x + 20) Or (mousex <= x-5  And mousex >= x - 20)) And drag = 0   
      Debug "inside"
      in = 1
      If MouseButton(#PB_MouseButton_Left)
        y = mousey
        x = mousex

      EndIf

      Else
      Debug "outside"
      in = 0
     EndIf
     
;      If in And MouseButton(#PB_MouseButton_Left)
;       drag = 1
;       y = mousey
;       x = mousex
;       Else
;       drag = 0
;       EndIf
     
;     Else
;      pressed = 0
;      EndIf
   
    DisplaySprite(0, x, y)
    Delay(1)
  ForEver
Win11 x64 | PB 6.20
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

Andesdaf hat geschrieben:so sollte es gehen:

Code: Alles auswählen

If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
 
    If InitMouse() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
 
  If OpenWindow(0, 0, 0, 400, 400, "A screen in a window...",  #PB_Window_ScreenCentered)

[...]
  ForEver
leider nein...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ò_ó
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

überarbeitet:

Code: Alles auswählen

If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
 
    If InitMouse() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
 
  If OpenWindow(0, 0, 0, 400, 400, "A screen in a window...",  #PB_Window_ScreenCentered)

    If OpenWindowedScreen(WindowID(0), 0, 0, 400, 400, 0, 0, 0)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf
 
  Repeat
    ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
    ;
    Repeat
      Event = WindowEvent()
     
      Select Event
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
       
        Case #PB_Event_CloseWindow
          End           
      EndSelect
     
      If GetAsyncKeyState_(#VK_ESCAPE)
      End
      EndIf
    Until Event = 0
 
    FlipBuffers()
    ClearScreen(RGB(255, 255, 255))
    ExamineMouse()
    mousey = MouseY()
    mousex = MouseX()
    StartDrawing(ScreenOutput())
    Box(mousex, mousey , 10, 10, 0)
    DrawText(0, 0, "Mouse pos: "+Str(mousex)+" | "+ Str(mousey) , RGB(0, 0, 0) , RGB(255, 255, 255))
    StopDrawing()
;     If MouseButton(#PB_MouseButton_Left) And mousey = y+20 Or mousex = x+20
;     If MouseButton(#PB_MouseButton_Left)
     If ((mousey >= y + 0  And mousey <= y + 10) And (mousex >= x  And mousex <= x + 10)) And Drag=0
      Debug "inside"
      If MouseButton(#PB_MouseButton_Left)
        drag = 1
      EndIf

    Else
      Debug "outside"
   EndIf
     
     If Not MouseButton(#PB_MouseButton_Left)
        drag = 0
      EndIf
     
    If drag = 1
      x = mousex
      y = mousey
    EndIf
   
    DisplaySprite(0, x, y)
    Delay(1)
  ForEver
Win11 x64 | PB 6.20
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

@Kaeru: Was ist das?
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ein böser Blick!

weil meine Analyse komplett ignoriert wurde.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

:oops: :oops: :oops: Heute ignorier ich immer Antworten. :oops: :oops: :oops:

Naja nu ist der Code da und Friede Freude Eierkuchen
Win11 x64 | PB 6.20
Antworten