Ebiten example - gamepad

package main

import (
    "fmt"
    "log"
    "strconv"
    "strings"

    "github.com/hajimehoshi/ebiten"
    "github.com/hajimehoshi/ebiten/ebitenutil"
)

const (
    screenWidth  = 320
    screenHeight = 240
)

func update(screen *ebiten.Image) error {
    // TODO: API to get the available, lowest ID
    const gamepadID = 0
    axes := []string{}
    pressedButtons := []string{}

    maxAxis := ebiten.GamepadAxisNum(gamepadID)
    for a := 0; a < maxAxis; a++ {
        v := ebiten.GamepadAxis(gamepadID, a)
        axes = append(axes, fmt.Sprintf("%d: %0.6f", a, v))
    }

    maxButton := ebiten.GamepadButton(ebiten.GamepadButtonNum(gamepadID))
    for b := ebiten.GamepadButton(gamepadID); b < maxButton; b++ {
        if ebiten.IsGamepadButtonPressed(gamepadID, b) {
            pressedButtons = append(pressedButtons, strconv.Itoa(int(b)))
        }
    }

    str := `Gamepad
  Axes:
    {{.Axes}}
  Pressed Buttons: {{.Buttons}}`
    str = strings.Replace(str, "{{.Axes}}", strings.Join(axes, "\n    "), -1)
    str = strings.Replace(str, "{{.Buttons}}", strings.Join(pressedButtons, ", "), -1)
    ebitenutil.DebugPrint(screen, str)
    return nil
}

func main() {
    if err := ebiten.Run(update, screenWidth, screenHeight, 2, "Gamepad (Ebiten Demo)"); err != nil {
        log.Fatal(err)
    }
}