@@ -734,17 +734,20 @@ type clicker interface {
734734 Visible () bool
735735}
736736
737- func (p * Game ) doWhenLeftButtonDown (ev * eventLeftButtonDown ) {
738- // add a global click cooldown
739- if ! p .inputs .canTriggerClickEvent (inputGlobalClickTimerId ) {
740- return
741- }
737+ func (p * Game ) doWhenLeftButtonUp (ev * eventLeftButtonUp ) {
738+ point := ev .Pos
739+ p .inputs .checkTracking (point )
740+ }
742741
742+ func (p * Game ) doWhenLeftButtonDown (ev * eventLeftButtonDown ) {
743743 point := ev .Pos
744+
745+ // Detect target sprite for both swipe and click events
744746 tempItems := p .getTempShapes ()
745747 count := len (tempItems )
746748
747749 var target clicker = nil
750+ var targetSprite * SpriteImpl = nil
748751 for i := 0 ; i < count ; i ++ {
749752 item := tempItems [count - i - 1 ]
750753 if o , ok := item .(clicker ); ok {
@@ -753,12 +756,24 @@ func (p *Game) doWhenLeftButtonDown(ev *eventLeftButtonDown) {
753756 isClicked := spriteMgr .CheckCollisionWithPoint (syncSprite .GetId (), point , true )
754757 if isClicked {
755758 target = o
759+ // Try to get the SpriteImpl from the clicker
760+ if sprite , ok := o .(* SpriteImpl ); ok {
761+ targetSprite = sprite
762+ }
756763 break
757764 }
758765 }
759766 }
760767 }
761768
769+ // Start swipe tracking with detected target sprite (can be nil for stage swipes)
770+ p .inputs .startTracking (point , targetSprite )
771+
772+ // add a global click cooldown
773+ if ! p .inputs .canTriggerClickEvent (inputGlobalClickTimerId ) {
774+ return
775+ }
776+
762777 if target != nil {
763778 syncSprite := target .getProxy ()
764779 if p .inputs .canTriggerClickEvent (syncSprite .GetId ()) {
@@ -771,11 +786,21 @@ func (p *Game) doWhenLeftButtonDown(ev *eventLeftButtonDown) {
771786 }
772787}
773788
789+ func (p * Game ) doWhenMouseMove (ev * eventMouseMove ) {
790+ // Update current mouse position
791+ p .mousePos = ev .Pos
792+ // If swipe tracking is active, record the movement
793+ p .inputs .onMouseMove (ev .Pos )
794+ }
795+
774796func (p * Game ) handleEvent (event event ) {
775797 switch ev := event .(type ) {
776-
798+ case * eventLeftButtonUp :
799+ p .doWhenLeftButtonUp (ev )
777800 case * eventLeftButtonDown :
778801 p .doWhenLeftButtonDown (ev )
802+ case * eventMouseMove :
803+ p .doWhenMouseMove (ev )
779804 case * eventKeyDown :
780805 p .sinkMgr .doWhenKeyPressed (ev .Key )
781806 case * eventStart :
@@ -821,8 +846,12 @@ func (p *Game) logicLoop(me coroutine.Thread) int {
821846
822847func (p * Game ) inputEventLoop (me coroutine.Thread ) int {
823848 lastLbtnPressed := false
849+ lastMousePos := mathf.Vec2 {} // Track last mouse position
850+ const mouseMovementThreshold = 1.0 // Minimum movement to trigger event (pixels)
824851 keyEvents := make ([]engine.KeyEvent , 0 )
852+
825853 for {
854+ // Check mouse button state
826855 curLbtnPressed := inputMgr .GetMouseState (MOUSE_BUTTON_LEFT )
827856 if curLbtnPressed != lastLbtnPressed {
828857 if lastLbtnPressed {
@@ -833,6 +862,22 @@ func (p *Game) inputEventLoop(me coroutine.Thread) int {
833862 }
834863 lastLbtnPressed = curLbtnPressed
835864
865+ // Check mouse movement
866+ // Note: We need to get the actual current mouse position from the engine
867+ // For now, we'll use the stored mousePos which should be updated elsewhere
868+ curMousePos := inputMgr .GetMousePos ()
869+ mathfMousePos := mathf.Vec2 {X : float64 (curMousePos .X ), Y : float64 (curMousePos .Y )}
870+
871+ // Check if mouse moved significantly
872+ dx := mathfMousePos .X - lastMousePos .X
873+ dy := mathfMousePos .Y - lastMousePos .Y
874+ if math .Abs (dx ) > mouseMovementThreshold || math .Abs (dy ) > mouseMovementThreshold {
875+ p .mousePos = mathfMousePos // Update stored position
876+ p .inputs .onMouseMove (mathfMousePos )
877+ lastMousePos = mathfMousePos
878+ }
879+
880+ // Handle keyboard events
836881 keyEvents = engine .GetKeyEvents (keyEvents )
837882 for _ , ev := range keyEvents {
838883 if ev .IsPressed {
0 commit comments