input: Implement Touches function (WIP) (#101)

This commit is contained in:
Hajime Hoshi 2016-05-27 01:31:30 +09:00
parent 4c2bbd47a1
commit bdaff72af9
4 changed files with 78 additions and 20 deletions

View File

@ -35,6 +35,9 @@ func CursorPosition() (x, y int) {
// IsMouseButtonPressed returns a boolean indicating whether mouseButton is pressed. // IsMouseButtonPressed returns a boolean indicating whether mouseButton is pressed.
// //
// This function is concurrent-safe. // This function is concurrent-safe.
//
// Note that touch events not longer affect this function's result as of 1.4.0-alpha.
// Use Touches instead.
func IsMouseButtonPressed(mouseButton MouseButton) bool { func IsMouseButtonPressed(mouseButton MouseButton) bool {
return ui.CurrentInput().IsMouseButtonPressed(ui.MouseButton(mouseButton)) return ui.CurrentInput().IsMouseButtonPressed(ui.MouseButton(mouseButton))
} }
@ -78,3 +81,17 @@ func GamepadButtonNum(id int) int {
func IsGamepadButtonPressed(id int, button GamepadButton) bool { func IsGamepadButtonPressed(id int, button GamepadButton) bool {
return ui.CurrentInput().IsGamepadButtonPressed(id, ui.GamepadButton(button)) return ui.CurrentInput().IsGamepadButtonPressed(id, ui.GamepadButton(button))
} }
type Touch interface {
ID() int
Position() (x, y int)
}
func Touches() []Touch {
t := ui.CurrentInput().Touches()
tt := make([]Touch, len(t))
for i := 0; i < len(tt); i++ {
tt[i] = t[i]
}
return tt
}

View File

@ -28,6 +28,12 @@ type Input interface {
GamepadAxisNum(id int) int GamepadAxisNum(id int) int
GamepadButtonNum(id int) int GamepadButtonNum(id int) int
IsGamepadButtonPressed(id int, button GamepadButton) bool IsGamepadButtonPressed(id int, button GamepadButton) bool
Touches() []Touch
}
type Touch interface {
ID() int
Position() (x, y int)
} }
type input struct { type input struct {
@ -36,16 +42,10 @@ type input struct {
cursorX int cursorX int
cursorY int cursorY int
gamepads [16]gamePad gamepads [16]gamePad
touches []touch
m sync.RWMutex m sync.RWMutex
} }
type gamePad struct {
axisNum int
axes [16]float64
buttonNum int
buttonPressed [256]bool
}
func CurrentInput() Input { func CurrentInput() Input {
return currentInput return currentInput
} }
@ -103,3 +103,32 @@ func (i *input) IsGamepadButtonPressed(id int, button GamepadButton) bool {
} }
return i.gamepads[id].buttonPressed[button] return i.gamepads[id].buttonPressed[button]
} }
func (in *input) Touches() []Touch {
t := make([]Touch, len(in.touches))
for i := 0; i < len(t); i++ {
t[i] = &in.touches[i]
}
return t
}
type gamePad struct {
axisNum int
axes [16]float64
buttonNum int
buttonPressed [256]bool
}
type touch struct {
id int
x int
y int
}
func (t *touch) ID() int {
return t.id
}
func (t *touch) Position() (x, y int) {
return t.x, t.y
}

View File

@ -112,3 +112,10 @@ func (i *input) updateGamepads() {
} }
} }
} }
func (i *input) updateTouches(t []touch) {
i.m.Lock()
defer i.m.Unlock()
i.touches = make([]touch, len(t))
copy(i.touches, t)
}

View File

@ -112,6 +112,20 @@ func (u *userInterface) FinishRendering() error {
return nil return nil
} }
func touchEventToTouches(e *js.Object) []touch {
scale := currentUI.scale
j := e.Get("targetTouches")
t := make([]touch, j.Get("length").Int())
for i := 0; i < len(t); i++ {
jj := j.Call("item", i)
target := jj.Get("target")
t[i].id = jj.Get("identifier").Int()
t[i].x = (jj.Get("clientX").Int() - target.Get("left").Int()) / scale
t[i].y = (jj.Get("clientY").Int() - target.Get("top").Int()) / scale
}
return t
}
func initialize() (*opengl.Context, error) { func initialize() (*opengl.Context, error) {
// Do nothing in node.js. // Do nothing in node.js.
if js.Global.Get("require") != js.Undefined { if js.Global.Get("require") != js.Undefined {
@ -194,27 +208,18 @@ func initialize() (*opengl.Context, error) {
e.Call("preventDefault") e.Call("preventDefault")
}) })
// Touch (emulating mouse events) // Touch
// TODO: Create indimendent touch functions
canvas.Call("addEventListener", "touchstart", func(e *js.Object) { canvas.Call("addEventListener", "touchstart", func(e *js.Object) {
e.Call("preventDefault") e.Call("preventDefault")
currentInput.mouseDown(0) currentInput.updateTouches(touchEventToTouches(e))
touches := e.Get("changedTouches")
touch := touches.Index(0)
setMouseCursorFromEvent(touch)
}) })
canvas.Call("addEventListener", "touchend", func(e *js.Object) { canvas.Call("addEventListener", "touchend", func(e *js.Object) {
e.Call("preventDefault") e.Call("preventDefault")
currentInput.mouseUp(0) currentInput.updateTouches(touchEventToTouches(e))
touches := e.Get("changedTouches")
touch := touches.Index(0)
setMouseCursorFromEvent(touch)
}) })
canvas.Call("addEventListener", "touchmove", func(e *js.Object) { canvas.Call("addEventListener", "touchmove", func(e *js.Object) {
e.Call("preventDefault") e.Call("preventDefault")
touches := e.Get("changedTouches") currentInput.updateTouches(touchEventToTouches(e))
touch := touches.Index(0)
setMouseCursorFromEvent(touch)
}) })
// Gamepad // Gamepad