Skip to content

Commit f1c1887

Browse files
committed
Add input gesture: swipe
1 parent 914ab18 commit f1c1887

3 files changed

Lines changed: 305 additions & 6 deletions

File tree

event.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ func (p *eventSink) call(wait bool, data any, doSth func(*eventSink)) {
9494
type eventSinkMgr struct {
9595
allWhenStart *eventSink
9696
allWhenKeyPressed *eventSink
97+
allWhenSwipe *eventSink
9798
allWhenIReceive *eventSink
9899
allWhenBackdropChanged *eventSink
99100
allWhenCloned *eventSink
@@ -110,6 +111,7 @@ type eventSinkMgr struct {
110111
func (p *eventSinkMgr) reset() {
111112
p.allWhenStart = nil
112113
p.allWhenKeyPressed = nil
114+
p.allWhenSwipe = nil
113115
p.allWhenIReceive = nil
114116
p.allWhenBackdropChanged = nil
115117
p.allWhenCloned = nil
@@ -126,6 +128,7 @@ func (p *eventSinkMgr) reset() {
126128
func (p *eventSinkMgr) doDeleteClone(this any) {
127129
p.allWhenStart = p.allWhenStart.doDeleteClone(this)
128130
p.allWhenKeyPressed = p.allWhenKeyPressed.doDeleteClone(this)
131+
p.allWhenSwipe = p.allWhenSwipe.doDeleteClone(this)
129132
p.allWhenIReceive = p.allWhenIReceive.doDeleteClone(this)
130133
p.allWhenBackdropChanged = p.allWhenBackdropChanged.doDeleteClone(this)
131134
p.allWhenCloned = p.allWhenCloned.doDeleteClone(this)
@@ -162,6 +165,14 @@ func (p *eventSinkMgr) doWhenKeyPressed(key Key) {
162165
})
163166
}
164167

168+
func (p *eventSinkMgr) doWhenSwipe(direction Direction, this threadObj) {
169+
p.allWhenSwipe.asyncCall(false, direction, func(ev *eventSink) {
170+
if ev.pthis == this {
171+
ev.sink.(func(Direction))(direction)
172+
}
173+
})
174+
}
175+
165176
func (p *eventSinkMgr) doWhenClick(this threadObj) {
166177
p.allWhenClick.asyncCall(false, this, func(ev *eventSink) {
167178
if debugEvent {
@@ -243,6 +254,7 @@ type IEventSinks interface {
243254
OnMsg__0(onMsg func(msg string, data any))
244255
OnMsg__1(msg string, onMsg func())
245256
OnStart(onStart func())
257+
OnSwipe__0(direction Direction, onSwipe func())
246258
OnTimer(time float64, onTimer func())
247259
Stop(kind StopKind)
248260
}
@@ -276,6 +288,11 @@ func (p *eventSinks) doDeleteClone() {
276288
p.eventSinkMgr.doDeleteClone(p.pthis)
277289
}
278290

291+
// doWhenSwipe triggers swipe events for this specific object
292+
func (p *eventSinks) doWhenSwipe(direction Direction, target threadObj) {
293+
p.eventSinkMgr.doWhenSwipe(direction, target)
294+
}
295+
279296
// -------------------------------------------------------------------------------------
280297

281298
func (p *eventSinks) OnStart(onStart func()) {
@@ -339,6 +356,22 @@ func (p *eventSinks) OnKey__0(key Key, onKey func()) {
339356
}
340357
}
341358

359+
func (p *eventSinks) OnSwipe__0(direction Direction, onSwipe func()) {
360+
p.allWhenSwipe = &eventSink{
361+
prev: p.allWhenSwipe,
362+
pthis: p.pthis,
363+
sink: func(Direction) {
364+
if debugEvent {
365+
log.Println("==> onSwipe", direction, nameOf(p.pthis))
366+
}
367+
onSwipe()
368+
},
369+
cond: func(data any) bool {
370+
return data.(Direction) == direction
371+
},
372+
}
373+
}
374+
342375
func (p *eventSinks) OnKey__1(keys []Key, onKey func(Key)) {
343376
p.allWhenKeyPressed = &eventSink{
344377
prev: p.allWhenKeyPressed,

game.go

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
774796
func (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

822847
func (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,21 @@ 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.inputs.onMouseMove(mathfMousePos)
876+
lastMousePos = mathfMousePos
877+
}
878+
879+
// Handle keyboard events
836880
keyEvents = engine.GetKeyEvents(keyEvents)
837881
for _, ev := range keyEvents {
838882
if ev.IsPressed {

0 commit comments

Comments
 (0)