Seite 1 von 2

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

Verfasst: 22.02.2009 17:41
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ß!

Verfasst: 22.02.2009 17:47
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*

Verfasst: 22.02.2009 18:06
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...

Verfasst: 22.02.2009 18:11
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

Verfasst: 22.02.2009 18:20
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...

Verfasst: 22.02.2009 18:37
von Kaeru Gaman
ò_ó

Verfasst: 22.02.2009 18:38
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

Verfasst: 22.02.2009 18:38
von Andesdaf
@Kaeru: Was ist das?

Verfasst: 22.02.2009 18:42
von Kaeru Gaman
ein böser Blick!

weil meine Analyse komplett ignoriert wurde.

Verfasst: 22.02.2009 18:46
von Andesdaf
:oops: :oops: :oops: Heute ignorier ich immer Antworten. :oops: :oops: :oops:

Naja nu ist der Code da und Friede Freude Eierkuchen