ebiten: Introduce type GamepadID

Updates #604
This commit is contained in:
Hajime Hoshi 2020-10-08 01:08:30 +09:00
parent bb20e62435
commit 809b7a3afa
13 changed files with 104 additions and 95 deletions

View File

@ -47,7 +47,7 @@ type axis struct {
} }
type gamepadConfig struct { type gamepadConfig struct {
gamepadID int gamepadID ebiten.GamepadID
gamepadIDInitialized bool gamepadIDInitialized bool
current virtualGamepadButton current virtualGamepadButton
@ -59,7 +59,7 @@ type gamepadConfig struct {
defaultAxesValues map[int]float64 defaultAxesValues map[int]float64
} }
func (c *gamepadConfig) SetGamepadID(id int) { func (c *gamepadConfig) SetGamepadID(id ebiten.GamepadID) {
c.gamepadID = id c.gamepadID = id
c.gamepadIDInitialized = true c.gamepadIDInitialized = true
} }

View File

@ -24,7 +24,7 @@ import (
) )
type GamepadScene struct { type GamepadScene struct {
gamepadID int gamepadID ebiten.GamepadID
currentIndex int currentIndex int
countAfterSetting int countAfterSetting int
buttonStates []string buttonStates []string

View File

@ -27,7 +27,7 @@ type Input struct {
// GamepadIDButtonPressed returns a gamepad ID where at least one button is pressed. // GamepadIDButtonPressed returns a gamepad ID where at least one button is pressed.
// If no button is pressed, GamepadIDButtonPressed returns -1. // If no button is pressed, GamepadIDButtonPressed returns -1.
func (i *Input) GamepadIDButtonPressed() int { func (i *Input) GamepadIDButtonPressed() ebiten.GamepadID {
for _, id := range ebiten.GamepadIDs() { for _, id := range ebiten.GamepadIDs() {
for b := ebiten.GamepadButton(0); b <= ebiten.GamepadButtonMax; b++ { for b := ebiten.GamepadButton(0); b <= ebiten.GamepadButtonMax; b++ {
if ebiten.IsGamepadButtonPressed(id, b) { if ebiten.IsGamepadButtonPressed(id, b) {

View File

@ -34,14 +34,14 @@ const (
) )
type Game struct { type Game struct {
gamepadIDs map[int]struct{} gamepadIDs map[ebiten.GamepadID]struct{}
axes map[int][]string axes map[ebiten.GamepadID][]string
pressedButtons map[int][]string pressedButtons map[ebiten.GamepadID][]string
} }
func (g *Game) Update() error { func (g *Game) Update() error {
if g.gamepadIDs == nil { if g.gamepadIDs == nil {
g.gamepadIDs = map[int]struct{}{} g.gamepadIDs = map[ebiten.GamepadID]struct{}{}
} }
// Log the gamepad connection events. // Log the gamepad connection events.
@ -56,8 +56,8 @@ func (g *Game) Update() error {
} }
} }
g.axes = map[int][]string{} g.axes = map[ebiten.GamepadID][]string{}
g.pressedButtons = map[int][]string{} g.pressedButtons = map[ebiten.GamepadID][]string{}
for id := range g.gamepadIDs { for id := range g.gamepadIDs {
maxAxis := ebiten.GamepadAxisNum(id) maxAxis := ebiten.GamepadAxisNum(id)
for a := 0; a < maxAxis; a++ { for a := 0; a < maxAxis; a++ {
@ -86,11 +86,13 @@ func (g *Game) Draw(screen *ebiten.Image) {
// Draw the current gamepad status. // Draw the current gamepad status.
str := "" str := ""
if len(g.gamepadIDs) > 0 { if len(g.gamepadIDs) > 0 {
ids := make([]int, 0, len(g.gamepadIDs)) ids := make([]ebiten.GamepadID, 0, len(g.gamepadIDs))
for id := range g.gamepadIDs { for id := range g.gamepadIDs {
ids = append(ids, id) ids = append(ids, id)
} }
sort.Ints(ids) sort.Slice(ids, func(a, b int) bool {
return ids[a] < ids[b]
})
for _, id := range ids { for _, id := range ids {
str += fmt.Sprintf("Gamepad (ID: %d, SDL ID: %s):\n", id, ebiten.GamepadSDLID(id)) str += fmt.Sprintf("Gamepad (ID: %d, SDL ID: %s):\n", id, ebiten.GamepadSDLID(id))
str += fmt.Sprintf(" Axes: %s\n", strings.Join(g.axes[id], ", ")) str += fmt.Sprintf(" Axes: %s\n", strings.Join(g.axes[id], ", "))

View File

@ -103,18 +103,21 @@ func IsMouseButtonPressed(mouseButton MouseButton) bool {
return uiDriver().Input().IsMouseButtonPressed(driver.MouseButton(mouseButton)) return uiDriver().Input().IsMouseButtonPressed(driver.MouseButton(mouseButton))
} }
// GamepadID represents a gamepad's identifier.
type GamepadID = driver.GamepadID
// GamepadSDLID returns a string with the GUID generated in the same way as SDL. // GamepadSDLID returns a string with the GUID generated in the same way as SDL.
// To detect devices, see also the community project of gamepad devices database: https://github.com/gabomdq/SDL_GameControllerDB // To detect devices, see also the community project of gamepad devices database: https://github.com/gabomdq/SDL_GameControllerDB
// //
// GamepadSDLID always returns an empty string on browsers and mobiles. // GamepadSDLID always returns an empty string on browsers and mobiles.
// //
// GamepadSDLID is concurrent-safe. // GamepadSDLID is concurrent-safe.
func GamepadSDLID(id int) string { func GamepadSDLID(id GamepadID) string {
return uiDriver().Input().GamepadSDLID(id) return uiDriver().Input().GamepadSDLID(id)
} }
// GamepadName returns a string with the name. // GamepadName returns a string with the name.
// This function may vary in how it returns descriptions for the same device across platforms // This function may vary in how it returns descriptions for the same device across platforms.
// for example the following drivers/platforms see a Xbox One controller as the following: // for example the following drivers/platforms see a Xbox One controller as the following:
// //
// - Windows: "Xbox Controller" // - Windows: "Xbox Controller"
@ -124,7 +127,7 @@ func GamepadSDLID(id int) string {
// GamepadName always returns an empty string on mobiles. // GamepadName always returns an empty string on mobiles.
// //
// GamepadName is concurrent-safe. // GamepadName is concurrent-safe.
func GamepadName(id int) string { func GamepadName(id GamepadID) string {
return uiDriver().Input().GamepadName(id) return uiDriver().Input().GamepadName(id)
} }
@ -133,7 +136,7 @@ func GamepadName(id int) string {
// GamepadIDs is concurrent-safe. // GamepadIDs is concurrent-safe.
// //
// GamepadIDs always returns an empty slice on mobiles. // GamepadIDs always returns an empty slice on mobiles.
func GamepadIDs() []int { func GamepadIDs() []GamepadID {
return uiDriver().Input().GamepadIDs() return uiDriver().Input().GamepadIDs()
} }
@ -142,7 +145,7 @@ func GamepadIDs() []int {
// GamepadAxisNum is concurrent-safe. // GamepadAxisNum is concurrent-safe.
// //
// GamepadAxisNum always returns 0 on mobiles. // GamepadAxisNum always returns 0 on mobiles.
func GamepadAxisNum(id int) int { func GamepadAxisNum(id GamepadID) int {
return uiDriver().Input().GamepadAxisNum(id) return uiDriver().Input().GamepadAxisNum(id)
} }
@ -151,7 +154,7 @@ func GamepadAxisNum(id int) int {
// GamepadAxis is concurrent-safe. // GamepadAxis is concurrent-safe.
// //
// GamepadAxis always returns 0 on mobiles. // GamepadAxis always returns 0 on mobiles.
func GamepadAxis(id int, axis int) float64 { func GamepadAxis(id GamepadID, axis int) float64 {
return uiDriver().Input().GamepadAxis(id, axis) return uiDriver().Input().GamepadAxis(id, axis)
} }
@ -160,7 +163,7 @@ func GamepadAxis(id int, axis int) float64 {
// GamepadButtonNum is concurrent-safe. // GamepadButtonNum is concurrent-safe.
// //
// GamepadButtonNum always returns 0 on mobiles. // GamepadButtonNum always returns 0 on mobiles.
func GamepadButtonNum(id int) int { func GamepadButtonNum(id GamepadID) int {
return uiDriver().Input().GamepadButtonNum(id) return uiDriver().Input().GamepadButtonNum(id)
} }
@ -175,7 +178,7 @@ func GamepadButtonNum(id int) int {
// There can be differences even between Chrome and Firefox. // There can be differences even between Chrome and Firefox.
// //
// IsGamepadButtonPressed always returns false on mobiles. // IsGamepadButtonPressed always returns false on mobiles.
func IsGamepadButtonPressed(id int, button GamepadButton) bool { func IsGamepadButtonPressed(id GamepadID, button GamepadButton) bool {
return uiDriver().Input().IsGamepadButtonPressed(id, driver.GamepadButton(button)) return uiDriver().Input().IsGamepadButtonPressed(id, driver.GamepadButton(button))
} }

View File

@ -30,11 +30,11 @@ type inputState struct {
mouseButtonDurations map[ebiten.MouseButton]int mouseButtonDurations map[ebiten.MouseButton]int
prevMouseButtonDurations map[ebiten.MouseButton]int prevMouseButtonDurations map[ebiten.MouseButton]int
gamepadIDs map[int]struct{} gamepadIDs map[ebiten.GamepadID]struct{}
prevGamepadIDs map[int]struct{} prevGamepadIDs map[ebiten.GamepadID]struct{}
gamepadButtonDurations map[int][]int gamepadButtonDurations map[ebiten.GamepadID][]int
prevGamepadButtonDurations map[int][]int prevGamepadButtonDurations map[ebiten.GamepadID][]int
touchDurations map[int]int touchDurations map[int]int
prevTouchDurations map[int]int prevTouchDurations map[int]int
@ -49,11 +49,11 @@ var theInputState = &inputState{
mouseButtonDurations: map[ebiten.MouseButton]int{}, mouseButtonDurations: map[ebiten.MouseButton]int{},
prevMouseButtonDurations: map[ebiten.MouseButton]int{}, prevMouseButtonDurations: map[ebiten.MouseButton]int{},
gamepadIDs: map[int]struct{}{}, gamepadIDs: map[ebiten.GamepadID]struct{}{},
prevGamepadIDs: map[int]struct{}{}, prevGamepadIDs: map[ebiten.GamepadID]struct{}{},
gamepadButtonDurations: map[int][]int{}, gamepadButtonDurations: map[ebiten.GamepadID][]int{},
prevGamepadButtonDurations: map[int][]int{}, prevGamepadButtonDurations: map[ebiten.GamepadID][]int{},
touchDurations: map[int]int{}, touchDurations: map[int]int{},
prevTouchDurations: map[int]int{}, prevTouchDurations: map[int]int{},
@ -97,18 +97,18 @@ func (i *inputState) update() {
// Gamepads // Gamepads
// Copy the gamepad IDs. // Copy the gamepad IDs.
i.prevGamepadIDs = map[int]struct{}{} i.prevGamepadIDs = map[ebiten.GamepadID]struct{}{}
for id := range i.gamepadIDs { for id := range i.gamepadIDs {
i.prevGamepadIDs[id] = struct{}{} i.prevGamepadIDs[id] = struct{}{}
} }
// Copy the gamepad button durations. // Copy the gamepad button durations.
i.prevGamepadButtonDurations = map[int][]int{} i.prevGamepadButtonDurations = map[ebiten.GamepadID][]int{}
for id, ds := range i.gamepadButtonDurations { for id, ds := range i.gamepadButtonDurations {
i.prevGamepadButtonDurations[id] = append([]int{}, ds...) i.prevGamepadButtonDurations[id] = append([]int{}, ds...)
} }
i.gamepadIDs = map[int]struct{}{} i.gamepadIDs = map[ebiten.GamepadID]struct{}{}
for _, id := range ebiten.GamepadIDs() { for _, id := range ebiten.GamepadIDs() {
i.gamepadIDs[id] = struct{}{} i.gamepadIDs[id] = struct{}{}
if _, ok := i.gamepadButtonDurations[id]; !ok { if _, ok := i.gamepadButtonDurations[id]; !ok {
@ -123,13 +123,13 @@ func (i *inputState) update() {
} }
} }
} }
idsToDelete := []int{} gamepadIDsToDelete := []ebiten.GamepadID{}
for id := range i.gamepadButtonDurations { for id := range i.gamepadButtonDurations {
if _, ok := i.gamepadIDs[id]; !ok { if _, ok := i.gamepadIDs[id]; !ok {
idsToDelete = append(idsToDelete, id) gamepadIDsToDelete = append(gamepadIDsToDelete, id)
} }
} }
for _, id := range idsToDelete { for _, id := range gamepadIDsToDelete {
delete(i.gamepadButtonDurations, id) delete(i.gamepadButtonDurations, id)
} }
@ -146,13 +146,13 @@ func (i *inputState) update() {
ids[id] = struct{}{} ids[id] = struct{}{}
i.touchDurations[id]++ i.touchDurations[id]++
} }
idsToDelete = []int{} touchIDsToDelete := []int{}
for id := range i.touchDurations { for id := range i.touchDurations {
if _, ok := ids[id]; !ok { if _, ok := ids[id]; !ok {
idsToDelete = append(idsToDelete, id) touchIDsToDelete = append(touchIDsToDelete, id)
} }
} }
for _, id := range idsToDelete { for _, id := range touchIDsToDelete {
delete(i.touchDurations, id) delete(i.touchDurations, id)
} }
} }
@ -221,8 +221,8 @@ func MouseButtonPressDuration(button ebiten.MouseButton) int {
// JustConnectedGamepadIDs might return nil when there is no connected gamepad. // JustConnectedGamepadIDs might return nil when there is no connected gamepad.
// //
// JustConnectedGamepadIDs is concurrent safe. // JustConnectedGamepadIDs is concurrent safe.
func JustConnectedGamepadIDs() []int { func JustConnectedGamepadIDs() []ebiten.GamepadID {
var ids []int var ids []ebiten.GamepadID
theInputState.m.RLock() theInputState.m.RLock()
for id := range theInputState.gamepadIDs { for id := range theInputState.gamepadIDs {
if _, ok := theInputState.prevGamepadIDs[id]; !ok { if _, ok := theInputState.prevGamepadIDs[id]; !ok {
@ -230,7 +230,9 @@ func JustConnectedGamepadIDs() []int {
} }
} }
theInputState.m.RUnlock() theInputState.m.RUnlock()
sort.Ints(ids) sort.Slice(ids, func(a, b int) bool {
return ids[a] < ids[b]
})
return ids return ids
} }
@ -238,7 +240,7 @@ func JustConnectedGamepadIDs() []int {
// whether the gamepad of the given id is released just in the current frame. // whether the gamepad of the given id is released just in the current frame.
// //
// IsGamepadJustDisconnected is concurrent safe. // IsGamepadJustDisconnected is concurrent safe.
func IsGamepadJustDisconnected(id int) bool { func IsGamepadJustDisconnected(id ebiten.GamepadID) bool {
theInputState.m.RLock() theInputState.m.RLock()
_, prev := theInputState.prevGamepadIDs[id] _, prev := theInputState.prevGamepadIDs[id]
_, current := theInputState.gamepadIDs[id] _, current := theInputState.gamepadIDs[id]
@ -250,7 +252,7 @@ func IsGamepadJustDisconnected(id int) bool {
// whether the given gamepad button of the gamepad id is pressed just in the current frame. // whether the given gamepad button of the gamepad id is pressed just in the current frame.
// //
// IsGamepadButtonJustPressed is concurrent safe. // IsGamepadButtonJustPressed is concurrent safe.
func IsGamepadButtonJustPressed(id int, button ebiten.GamepadButton) bool { func IsGamepadButtonJustPressed(id ebiten.GamepadID, button ebiten.GamepadButton) bool {
return GamepadButtonPressDuration(id, button) == 1 return GamepadButtonPressDuration(id, button) == 1
} }
@ -258,7 +260,7 @@ func IsGamepadButtonJustPressed(id int, button ebiten.GamepadButton) bool {
// whether the given gamepad button of the gamepad id is released just in the current frame. // whether the given gamepad button of the gamepad id is released just in the current frame.
// //
// IsGamepadButtonJustReleased is concurrent safe. // IsGamepadButtonJustReleased is concurrent safe.
func IsGamepadButtonJustReleased(id int, button ebiten.GamepadButton) bool { func IsGamepadButtonJustReleased(id ebiten.GamepadID, button ebiten.GamepadButton) bool {
theInputState.m.RLock() theInputState.m.RLock()
prev := 0 prev := 0
if _, ok := theInputState.prevGamepadButtonDurations[id]; ok { if _, ok := theInputState.prevGamepadButtonDurations[id]; ok {
@ -275,7 +277,7 @@ func IsGamepadButtonJustReleased(id int, button ebiten.GamepadButton) bool {
// GamepadButtonPressDuration returns how long the gamepad button of the gamepad id is pressed in frames. // GamepadButtonPressDuration returns how long the gamepad button of the gamepad id is pressed in frames.
// //
// GamepadButtonPressDuration is concurrent safe. // GamepadButtonPressDuration is concurrent safe.
func GamepadButtonPressDuration(id int, button ebiten.GamepadButton) int { func GamepadButtonPressDuration(id ebiten.GamepadID, button ebiten.GamepadButton) int {
theInputState.m.RLock() theInputState.m.RLock()
s := 0 s := 0
if _, ok := theInputState.gamepadButtonDurations[id]; ok { if _, ok := theInputState.gamepadButtonDurations[id]; ok {

View File

@ -14,15 +14,17 @@
package driver package driver
type GamepadID int
type Input interface { type Input interface {
CursorPosition() (x, y int) CursorPosition() (x, y int)
GamepadSDLID(id int) string GamepadSDLID(id GamepadID) string
GamepadName(id int) string GamepadName(id GamepadID) string
GamepadAxis(id int, axis int) float64 GamepadAxis(id GamepadID, axis int) float64
GamepadAxisNum(id int) int GamepadAxisNum(id GamepadID) int
GamepadButtonNum(id int) int GamepadButtonNum(id GamepadID) int
GamepadIDs() []int GamepadIDs() []GamepadID
IsGamepadButtonPressed(id int, button GamepadButton) bool IsGamepadButtonPressed(id GamepadID, button GamepadButton) bool
IsKeyPressed(key Key) bool IsKeyPressed(key Key) bool
IsMouseButtonPressed(button MouseButton) bool IsMouseButtonPressed(button MouseButton) bool
RuneBuffer() []rune RuneBuffer() []rune

View File

@ -67,15 +67,15 @@ func (i *Input) CursorPosition() (x, y int) {
return cx, cy return cx, cy
} }
func (i *Input) GamepadIDs() []int { func (i *Input) GamepadIDs() []driver.GamepadID {
if !i.ui.isRunning() { if !i.ui.isRunning() {
return nil return nil
} }
var r []int var r []driver.GamepadID
_ = i.ui.t.Call(func() error { _ = i.ui.t.Call(func() error {
for id, g := range i.gamepads { for id, g := range i.gamepads {
if g.valid { if g.valid {
r = append(r, id) r = append(r, driver.GamepadID(id))
} }
} }
return nil return nil
@ -83,13 +83,13 @@ func (i *Input) GamepadIDs() []int {
return r return r
} }
func (i *Input) GamepadSDLID(id int) string { func (i *Input) GamepadSDLID(id driver.GamepadID) string {
if !i.ui.isRunning() { if !i.ui.isRunning() {
return "" return ""
} }
var r string var r string
_ = i.ui.t.Call(func() error { _ = i.ui.t.Call(func() error {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return nil return nil
} }
r = i.gamepads[id].guid r = i.gamepads[id].guid
@ -98,13 +98,13 @@ func (i *Input) GamepadSDLID(id int) string {
return r return r
} }
func (i *Input) GamepadName(id int) string { func (i *Input) GamepadName(id driver.GamepadID) string {
if !i.ui.isRunning() { if !i.ui.isRunning() {
return "" return ""
} }
var r string var r string
_ = i.ui.t.Call(func() error { _ = i.ui.t.Call(func() error {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return nil return nil
} }
r = i.gamepads[id].name r = i.gamepads[id].name
@ -113,13 +113,13 @@ func (i *Input) GamepadName(id int) string {
return r return r
} }
func (i *Input) GamepadAxisNum(id int) int { func (i *Input) GamepadAxisNum(id driver.GamepadID) int {
if !i.ui.isRunning() { if !i.ui.isRunning() {
return 0 return 0
} }
var r int var r int
_ = i.ui.t.Call(func() error { _ = i.ui.t.Call(func() error {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return nil return nil
} }
r = i.gamepads[id].axisNum r = i.gamepads[id].axisNum
@ -128,13 +128,13 @@ func (i *Input) GamepadAxisNum(id int) int {
return r return r
} }
func (i *Input) GamepadAxis(id int, axis int) float64 { func (i *Input) GamepadAxis(id driver.GamepadID, axis int) float64 {
if !i.ui.isRunning() { if !i.ui.isRunning() {
return 0 return 0
} }
var r float64 var r float64
_ = i.ui.t.Call(func() error { _ = i.ui.t.Call(func() error {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return nil return nil
} }
r = i.gamepads[id].axes[axis] r = i.gamepads[id].axes[axis]
@ -143,13 +143,13 @@ func (i *Input) GamepadAxis(id int, axis int) float64 {
return r return r
} }
func (i *Input) GamepadButtonNum(id int) int { func (i *Input) GamepadButtonNum(id driver.GamepadID) int {
if !i.ui.isRunning() { if !i.ui.isRunning() {
return 0 return 0
} }
var r int var r int
_ = i.ui.t.Call(func() error { _ = i.ui.t.Call(func() error {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return nil return nil
} }
r = i.gamepads[id].buttonNum r = i.gamepads[id].buttonNum
@ -158,13 +158,13 @@ func (i *Input) GamepadButtonNum(id int) int {
return r return r
} }
func (i *Input) IsGamepadButtonPressed(id int, button driver.GamepadButton) bool { func (i *Input) IsGamepadButtonPressed(id driver.GamepadID, button driver.GamepadButton) bool {
if !i.ui.isRunning() { if !i.ui.isRunning() {
return false return false
} }
var r bool var r bool
_ = i.ui.t.Call(func() error { _ = i.ui.t.Call(func() error {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return nil return nil
} }
r = i.gamepads[id].buttonPressed[button] r = i.gamepads[id].buttonPressed[button]

View File

@ -56,10 +56,10 @@ func (i *Input) CursorPosition() (x, y int) {
return int(xf), int(yf) return int(xf), int(yf)
} }
func (i *Input) GamepadSDLID(id int) string { func (i *Input) GamepadSDLID(id driver.GamepadID) string {
// This emulates the implementation of EMSCRIPTEN_JoystickGetDeviceGUID. // This emulates the implementation of EMSCRIPTEN_JoystickGetDeviceGUID.
// https://hg.libsdl.org/SDL/file/bc90ce38f1e2/src/joystick/emscripten/SDL_sysjoystick.c#l385 // https://hg.libsdl.org/SDL/file/bc90ce38f1e2/src/joystick/emscripten/SDL_sysjoystick.c#l385
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return "" return ""
} }
var sdlid [16]byte var sdlid [16]byte
@ -70,49 +70,49 @@ func (i *Input) GamepadSDLID(id int) string {
// GamepadName returns a string containing some information about the controller. // GamepadName returns a string containing some information about the controller.
// A PS2 controller returned "810-3-USB Gamepad" on Firefox // A PS2 controller returned "810-3-USB Gamepad" on Firefox
// A Xbox 360 controller returned "xinput" on Firefox and "Xbox 360 Controller (XInput STANDARD GAMEPAD)" on Chrome // A Xbox 360 controller returned "xinput" on Firefox and "Xbox 360 Controller (XInput STANDARD GAMEPAD)" on Chrome
func (i *Input) GamepadName(id int) string { func (i *Input) GamepadName(id driver.GamepadID) string {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return "" return ""
} }
return i.gamepads[id].name return i.gamepads[id].name
} }
func (i *Input) GamepadIDs() []int { func (i *Input) GamepadIDs() []driver.GamepadID {
if len(i.gamepads) == 0 { if len(i.gamepads) == 0 {
return nil return nil
} }
r := []int{} var r []driver.GamepadID
for id, g := range i.gamepads { for id, g := range i.gamepads {
if g.valid { if g.valid {
r = append(r, id) r = append(r, driver.GamepadID(id))
} }
} }
return r return r
} }
func (i *Input) GamepadAxisNum(id int) int { func (i *Input) GamepadAxisNum(id driver.GamepadID) int {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return 0 return 0
} }
return i.gamepads[id].axisNum return i.gamepads[id].axisNum
} }
func (i *Input) GamepadAxis(id int, axis int) float64 { func (i *Input) GamepadAxis(id driver.GamepadID, axis int) float64 {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return 0 return 0
} }
return i.gamepads[id].axes[axis] return i.gamepads[id].axes[axis]
} }
func (i *Input) GamepadButtonNum(id int) int { func (i *Input) GamepadButtonNum(id driver.GamepadID) int {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return 0 return 0
} }
return i.gamepads[id].buttonNum return i.gamepads[id].buttonNum
} }
func (i *Input) IsGamepadButtonPressed(id int, button driver.GamepadButton) bool { func (i *Input) IsGamepadButtonPressed(id driver.GamepadID, button driver.GamepadButton) bool {
if len(i.gamepads) <= id { if len(i.gamepads) <= int(id) {
return false return false
} }
return i.gamepads[id].buttonPressed[button] return i.gamepads[id].buttonPressed[button]

View File

@ -41,18 +41,18 @@ func (i *Input) CursorPosition() (x, y int) {
return i.ui.adjustPosition(i.cursorX, i.cursorY) return i.ui.adjustPosition(i.cursorX, i.cursorY)
} }
func (i *Input) GamepadIDs() []int { func (i *Input) GamepadIDs() []driver.GamepadID {
i.ui.m.RLock() i.ui.m.RLock()
defer i.ui.m.RUnlock() defer i.ui.m.RUnlock()
ids := make([]int, 0, len(i.gamepads)) ids := make([]driver.GamepadID, 0, len(i.gamepads))
for _, g := range i.gamepads { for _, g := range i.gamepads {
ids = append(ids, g.ID) ids = append(ids, g.ID)
} }
return ids return ids
} }
func (i *Input) GamepadSDLID(id int) string { func (i *Input) GamepadSDLID(id driver.GamepadID) string {
i.ui.m.RLock() i.ui.m.RLock()
defer i.ui.m.RUnlock() defer i.ui.m.RUnlock()
@ -65,7 +65,7 @@ func (i *Input) GamepadSDLID(id int) string {
return "" return ""
} }
func (i *Input) GamepadName(id int) string { func (i *Input) GamepadName(id driver.GamepadID) string {
i.ui.m.RLock() i.ui.m.RLock()
defer i.ui.m.RUnlock() defer i.ui.m.RUnlock()
@ -78,7 +78,7 @@ func (i *Input) GamepadName(id int) string {
return "" return ""
} }
func (i *Input) GamepadAxisNum(id int) int { func (i *Input) GamepadAxisNum(id driver.GamepadID) int {
i.ui.m.RLock() i.ui.m.RLock()
defer i.ui.m.RUnlock() defer i.ui.m.RUnlock()
@ -91,7 +91,7 @@ func (i *Input) GamepadAxisNum(id int) int {
return 0 return 0
} }
func (i *Input) GamepadAxis(id int, axis int) float64 { func (i *Input) GamepadAxis(id driver.GamepadID, axis int) float64 {
i.ui.m.RLock() i.ui.m.RLock()
defer i.ui.m.RUnlock() defer i.ui.m.RUnlock()
@ -107,7 +107,7 @@ func (i *Input) GamepadAxis(id int, axis int) float64 {
return 0 return 0
} }
func (i *Input) GamepadButtonNum(id int) int { func (i *Input) GamepadButtonNum(id driver.GamepadID) int {
i.ui.m.RLock() i.ui.m.RLock()
defer i.ui.m.RUnlock() defer i.ui.m.RUnlock()
@ -120,7 +120,7 @@ func (i *Input) GamepadButtonNum(id int) int {
return 0 return 0
} }
func (i *Input) IsGamepadButtonPressed(id int, button driver.GamepadButton) bool { func (i *Input) IsGamepadButtonPressed(id driver.GamepadID, button driver.GamepadButton) bool {
i.ui.m.RLock() i.ui.m.RLock()
defer i.ui.m.RUnlock() defer i.ui.m.RUnlock()

View File

@ -480,7 +480,7 @@ type Touch struct {
} }
type Gamepad struct { type Gamepad struct {
ID int ID driver.GamepadID
SDLID string SDLID string
Name string Name string
Buttons [driver.GamepadButtonNum]bool Buttons [driver.GamepadButtonNum]bool

View File

@ -30,7 +30,7 @@ var (
keys = map[driver.Key]struct{}{} keys = map[driver.Key]struct{}{}
runes []rune runes []rune
touches = map[int]position{} touches = map[int]position{}
gamepads = map[int]*mobile.Gamepad{} gamepads = map[driver.GamepadID]*mobile.Gamepad{}
) )
func updateInput() { func updateInput() {

View File

@ -177,18 +177,18 @@ var androidAxisIDToAxisID = map[int]int{
var ( var (
// deviceIDToGamepadID is a map from Android device IDs to Ebiten gamepad IDs. // deviceIDToGamepadID is a map from Android device IDs to Ebiten gamepad IDs.
// As convention, Ebiten gamepad IDs start with 0, and many applications depend on this fact. // As convention, Ebiten gamepad IDs start with 0, and many applications depend on this fact.
deviceIDToGamepadID = map[int]int{} deviceIDToGamepadID = map[int]driver.GamepadID{}
) )
func gamepadIDFromDeviceID(deviceID int) int { func gamepadIDFromDeviceID(deviceID int) driver.GamepadID {
if id, ok := deviceIDToGamepadID[deviceID]; ok { if id, ok := deviceIDToGamepadID[deviceID]; ok {
return id return id
} }
ids := map[int]struct{}{} ids := map[driver.GamepadID]struct{}{}
for _, id := range deviceIDToGamepadID { for _, id := range deviceIDToGamepadID {
ids[id] = struct{}{} ids[id] = struct{}{}
} }
for i := 0; ; i++ { for i := driver.GamepadID(0); ; i++ {
if _, ok := ids[i]; ok { if _, ok := ids[i]; ok {
continue continue
} }