コントローラー
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 / B | X / Z |
"x" "y" | X / Y | S / A |
"l" "r" "zl" "zr" | 肩のボタン | Q / W / E / R |
"start" "select" | START(+) / SELECT(−) | Enter / BackSpace(右Shift) |
"home" | HOME | H / 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版では使えません(シリアルも標準入力もありません)。