--:-- LUA API

コントローラー

pad_connected / pad_down / pad_pressed / pad_released

外部コントローラー(ゲームパッド)のボタンを読みます。タッチは同時に1点しか取れませんが、コントローラーなら「十字キーを押しながらA」のような同時押しができます。

Wiiクラシックコントローラー(I2C)と、USBシリアル経由のPCのキーボード(下記)から読みます。Web版ではページに出るボタンとキーボードから読みます。どこから押しても、スクリプトからは同じに見えます。

  • 状態はフレームの頭で1回だけ更新されます。loop(dt) の中で何度読んでも同じ答えです。
  • コントローラーがつながっていなければ、どのボタンも押していない扱いです(エラーにはなりません)。
  • ボタン名を間違えるとエラーになります(綴りの間違いで「押しても反応しない」と悩まないように)。

ボタン名

名前ボタンPCのキー(pad_serial.py)
"up" "down" "left" "right"十字キー矢印キー
"a" "b"A / BX / Z
"x" "y"X / YS / A
"l" "r" "zl" "zr"肩のボタンQ / W / E / R
"start" "select"START(+) / SELECT(−)Enter / BackSpace(右Shift)
"home"HOMEH / Esc

並びはWiiクラシックコントローラーに合わせています(右がA、下がB、左がY、上がX)。

pico.pad_connected

pico.pad_connected() -> boolean

コントローラーがつながっているか(USBシリアルの場合は、PC側のスクリプトから0.5秒以内に状態が届いていれば true)。

pico.pad_down

pico.pad_down(name: string) -> boolean

そのボタンを今押しているか。移動のように「押している間ずっと」効かせたいものに使います。

pico.pad_pressed / pico.pad_released

pico.pad_pressed(name: string) -> boolean
pico.pad_released(name: string) -> boolean

そのボタンをこのフレームで押した / 離したか。次のフレームでは false に戻ります。ジャンプや決定のように「1回押したら1回だけ」効かせたいものに使います。

使用例

local px, py = 100, 100

function loop(dt)
    local step = 80 * dt / 1000   -- 80px/秒
    if pico.pad_down("left")  then px = px - step end
    if pico.pad_down("right") then px = px + step end
    if pico.pad_down("up")    then py = py - step end
    if pico.pad_down("down")  then py = py + step end

    if pico.pad_pressed("a") then pico.beep(880, 50) end
    if pico.pad_pressed("home") then pico.pop() end
end

「動作確認」アプリの「コントローラー」のページ(/lua/apps/動作確認/pad.lua)が、押しているボタンを図で出す実例です。

PCのキーボードをコントローラーにする

pip install pyserial                        # Windowsでは必須。Linux/macOSは無くても動く
python3 script/pad_serial.py --list         # ポートの一覧
python3 script/pad_serial.py COM3           # 小さなウィンドウが開く。そこでキーを押す
  • ポートは同時に1つのプログラムしか開けないので、シリアルモニタとは同時に使えません。代わりに、pico-osのログがこのスクリプトのターミナルへそのまま出ます。
  • PCビルドでは標準入力がシリアルの代わりです: python3 script/pad_serial.py --stdout | ./pc/build/picoos_pc
  • Web版では使えません(シリアルも標準入力もありません)。