1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PlaydateAdvent Calendar 2022

Day 12

【Playdate】コライダーを埋め込む

Posted at

アクションゲームやシューティングゲームに欠かせない衝突処理を実装してみます。
今回もこちらのプロジェクトをベースに進めていきます。

プレイヤーと壁を用意して壁にぶつかったときに跳ね返るような動きをつけようと思います。

main.lua
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で設定した処理を行います。
この場合はコライダーにぶつかったとき、跳ね返るような動きになります。
タイトルなし2.gif

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?