Ebiten example - keyboard

package main

import (
    "github.com/hajimehoshi/ebiten"
    "github.com/hajimehoshi/ebiten/ebitenutil"
    "log"
    "sort"
    "strconv"
    "strings"
)

const (
    screenWidth  = 320
    screenHeight = 240
)

var keyNames = map[ebiten.Key]string{
    ebiten.KeyBackspace: "Backspace",
    ebiten.KeyComma:     "','",
    ebiten.KeyDelete:    "Delete",
    ebiten.KeyEnter:     "Enter",
    ebiten.KeyEscape:    "Esc",
    ebiten.KeyPeriod:    "'.'",
    ebiten.KeySpace:     "Space",
    ebiten.KeyTab:       "Tab",

    // Arrows
    ebiten.KeyDown:  "Down",
    ebiten.KeyLeft:  "Left",
    ebiten.KeyRight: "Right",
    ebiten.KeyUp:    "Up",

    // Mods
    ebiten.KeyShift:   "Shift",
    ebiten.KeyControl: "Ctrl",
    ebiten.KeyAlt:     "Alt",
}

func update(screen *ebiten.Image) error {
    pressed := []string{}
    for i := 0; i <= 9; i++ {
        if ebiten.IsKeyPressed(ebiten.Key(i) + ebiten.Key0) {
            pressed = append(pressed, string(i+'0'))
        }
    }
    for c := 'A'; c <= 'Z'; c++ {
        if ebiten.IsKeyPressed(ebiten.Key(c) - 'A' + ebiten.KeyA) {
            pressed = append(pressed, string(c))
        }
    }
    for i := 1; i <= 12; i++ {
        if ebiten.IsKeyPressed(ebiten.Key(i) + ebiten.KeyF1 - 1) {
            pressed = append(pressed, "F"+strconv.Itoa(i))
        }
    }
    for key, name := range keyNames {
        if ebiten.IsKeyPressed(key) {
            pressed = append(pressed, name)
        }
    }
    sort.Strings(pressed)
    str := "Pressed Keys: " + strings.Join(pressed, ", ")
    ebitenutil.DebugPrint(screen, str)
    return nil
}

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