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行目

衝突検知用の空間に登録されている情報を削除します。