Playdate には playdate.InputHandlers オブジェクトを使うことでキー入力の制御をまとめて管理することができます。
例えばフィールド画面では十字キー操作でプレイヤーを移動するように、メニュー画面ではメニューUIの操作をするように InputHandler オブジェクトを切り替えるといった感じです。
こちらの記事のmain.lua
のplaydate.update内のキー入力をInputHandlerに変更してみます。
main.lua
import "CoreLibs/object"
import "CoreLibs/graphics"
import "CoreLibs/sprites"
import "CoreLibs/timer"
local gfx <const> = playdate.graphics
local playerSprite = nil
local playerMoveX = 0 -- playerのX移動距離
local playerMoveY = 0 -- playerのY移動距離
-- 入力ハンドラオブジェクト
local myInputHandlers = {
upButtonDown = function()
playerMoveY = -2
end,
upButtonUp = function()
playerMoveY = 0
end,
rightButtonDown = function()
playerMoveX = 2
end,
rightButtonUp = function()
playerMoveX = 0
end,
downButtonDown = function ()
playerMoveY = 2
end,
downButtonUp = function ()
playerMoveY = 0
end,
leftButtonDown = function ()
playerMoveX = -2
end,
leftButtonUp = function ()
playerMoveX = 0
end,
}
function myGameSetUp()
local playerImage = gfx.image.new("Images/playerImage")
assert( playerImage )
playerSprite = gfx.sprite.new( playerImage )
playerSprite:moveTo( 200, 120 )
playerSprite:add()
local backgroundImage = gfx.image.new( "Images/background" )
assert( backgroundImage )
playdate.inputHandlers.push(myInputHandlers) -- 入力ハンドラを追加
gfx.sprite.setBackgroundDrawingCallback(
function( x, y, width, height )
backgroundImage:draw( 0, 0 )
end
)
end
myGameSetUp()
function playdate.update()
playerSprite:moveBy( playerMoveX, playerMoveY ) -- playerを移動
gfx.sprite.update()
playdate.timer.updateTimers()
end
InputHandlersオブジェクト内で使える関数は以下が扱えます。
- AButtonDown()
- AButtonHeld() ※Aボタンを一秒間押したあとに実行される
- AButtonUp()
- BButtonDown()
- BButtonHeld() ※Bボタンを一秒間押したあとに実行される
- BButtonUp()
- downButtonDown()
- downButtonUp()
- leftButtonDown()
- leftButtonUp()
- rightButtonDown()
- rightButtonUp()
- upButtonDown()
- upButtonUp()
- cranked(change, acceleratedChange)