アクションゲームやシューティングゲームに欠かせない衝突処理を実装してみます。
今回もこちらのプロジェクトをベースに進めていきます。
プレイヤーと壁を用意して壁にぶつかったときに跳ね返るような動きをつけようと思います。
import "CoreLibs/object"
import "CoreLibs/graphics"
import "CoreLibs/sprites"
import "CoreLibs/timer"
local gfx <const> = playdate.graphics
local playerSprite = nil
local wallSprite = nil
function myGameSetUp()
local playerImage = gfx.image.new("Images/playerImage")
assert( playerImage )
playerSprite = gfx.sprite.new( playerImage )
playerSprite:moveTo( 200, 120 )
playerSprite:setCollideRect(0, 0, playerSprite:getSize()) -- playerSpriteにコライダーセット
playerSprite.collisionResponse = playdate.graphics.sprite.kCollisionTypeBounce -- コライダーとぶつかったときのふるまい
playerSprite:add()
local wallImage = gfx.image.new(20, 80)
gfx.pushContext(wallImage)
gfx.setColor(gfx.kColorWhite)
gfx.fillRect(0,0,20,80)
gfx.popContext()
wallSprite = gfx.sprite.new(wallImage)
wallSprite:moveTo( 300, 120 )
wallSprite:setCollideRect(0, 0, wallSprite:getSize()) -- コライダーセット
wallSprite:add()
local backgroundImage = gfx.image.new( "Images/background" )
assert( backgroundImage )
gfx.sprite.setBackgroundDrawingCallback(
function( x, y, width, height )
backgroundImage:draw( 0, 0 )
end
)
end
myGameSetUp()
function playdate.update()
local offsetX = 0
local offsetY = 0
if playdate.buttonIsPressed( playdate.kButtonUp ) then
offsetY = -2
end
if playdate.buttonIsPressed( playdate.kButtonRight ) then
offsetX = 2
end
if playdate.buttonIsPressed( playdate.kButtonDown ) then
offsetY = 2
end
if playdate.buttonIsPressed( playdate.kButtonLeft ) then
offsetX = -2
end
playerSprite:moveWithCollisions(playerSprite.x + offsetX, playerSprite.y + offsetY)
gfx.sprite.update()
playdate.timer.updateTimers()
end
まずplayerSprite
にコライダーを設定します。
コライダーのセットはplayerSprite:setCollideRect
で行います。それぞれ引数は以下の通りです。
第1引数:[スプライトの左上を始点にしたスプライトのx座標]
第2引数:[スプライトの左上を始点にしたスプライトのy座標]
第3引数:[コライダーのwidth,height](第3引数をwidth、第4引数をheightにしてもよい)
次に他のコライダーにぶつかったときの振る舞いを設定します。
ここではplayerSprite.collisionResponse
に直接代入しています。
代入できる値は以下の通りです。
- playdate.graphics.sprite.kCollisionTypeSlide : 他のオブジェクトの上をスライドする
- playdate.graphics.sprite.kCollisionTypeFreeze :他のオブジェクトと衝突するとすぐにスプライトの動きを停止する
- playdate.graphics.sprite.kCollisionTypeOverlap : スプライトの動きに影響を与えない(アイテムなどに使う)
- playdate.graphics.sprite.kCollisionTypeBounce : スプライトが他のオブジェクトから跳ね返る
wallSprite
という壁スプライトを作成します。
width20、height80の白い壁を用意しました。
このスプライトにもsetCollideRect
でコライダーをセットします。
次にupdateでplayerSpriteをコライダーと一緒に動かします。
sprite:moveWithCollisions(goalX, goalY)
でコライダーと一緒に目的地まで動かします。
この際、目的地にコライダーがあった場合、sprite.collisionResponse
で設定した処理を行います。
この場合はコライダーにぶつかったとき、跳ね返るような動きになります。