bumpの動作確認
Love2Dで衝突の検知を行いたい場合、bumpを利用すると便利です。
まずは、衝突を検知しないプログラムを作成します。
local speed = 100
local player = {x = 40, y = 40, w = 48, h = 48}
local block = {x = 120, y = 40, w = 48, h = 48}
function love.load()
imgPlayer = love.graphics.newImage("img/player.png")
imgBlock = love.graphics.newImage("img/block.png")
end
function love.draw()
love.graphics.draw(imgPlayer, player.x, player.y)
love.graphics.draw(imgBlock, block.x, block.y)
end
function love.update(dt)
if love.keyboard.isDown('up') then
player.y = player.y - speed * dt
elseif love.keyboard.isDown('down') then
player.y = player.y + speed * dt
elseif love.keyboard.isDown('left') then
player.x = player.x - speed * dt
elseif love.keyboard.isDown('right') then
player.x = player.x + speed * dt
end
end
上下左右のキーでプレイヤー画像を動かすことができます。プレイヤーをブロックの方向に進め続けてみるとブロックを通り抜けていきます。衝突を検知を行なっていないため、このような動きになります。
今度はbumpを使用して衝突を検知できるようにしてみます。
local bump = require 'bump'
local speed = 100
local player = {x = 40, y = 40, w = 48, h = 48, name = "Player"}
local block = {x = 120, y = 40, w = 48, h = 48, name = "Block"}
function love.load()
imgPlayer = love.graphics.newImage("img/player.png")
imgBlock = love.graphics.newImage("img/block.png")
world = bump.newWorld()
world:add(player, player.x, player.y, player.w, player.h)
world:add(block, block.x, block.y, block.w, block.h)
end
function love.draw()
love.graphics.draw(imgPlayer, player.x, player.y)
love.graphics.draw(imgBlock, block.x, block.y)
end
function love.update(dt)
local goalX = player.x
local goalY = player.y
if love.keyboard.isDown('up') then
goalY = player.y - speed * dt
elseif love.keyboard.isDown('down') then
goalY = player.y + speed * dt
elseif love.keyboard.isDown('left') then
goalX = player.x - speed * dt
elseif love.keyboard.isDown('right') then
goalX = player.x + speed * dt
end
local actualX, actualY, cols, len = world:move(player, goalX, goalY)
player.x, player.y = actualX, actualY
end
function love.quit()
world:remove(player)
world:remove(block)
end
今度はプレイヤーがブロックに衝突するとそれ以上動かなくなります。衝突の検知が行われています。
説明
1行目
bump.luaを読込みます。
11行目
衝突検知用の空間worldを作成します。
12 ~ 13行目
worldに衝突検知を行う対象の情報を登録します。
35行目
衝突検知用の空間のプレイヤー情報を移動させます。このときに衝突検知が行われ、衝突が発生した場合は移動が行われません。
41 ~ 42行目
衝突検知用の空間に登録されている情報を削除します。