gameraの動作確認

gameraはLove2Dのカメラモジュールです。まずはどのような動作をするのかを確認してみましょう。

local gamera = require 'gamera'

local player = {x = 0, y = 0, w = 40, h = 40, s = 80}
local map = {w = 800, h = 800}

function love.load()
  camera = gamera.new(0, 0, map.w, map.h)

  imgPlayer = love.graphics.newImage("img/player.png")
  cvsMap = createTestBackground()
end

function love.draw()
  camera:draw(function(l, t, w, h)
    love.graphics.draw(cvsMap, 0, 0)
    love.graphics.draw(imgPlayer, player.x, player.y)
  end)
end

function love.update(dt)
  if love.keyboard.isDown('up') then
      player.y = player.y - player.s * dt
  elseif love.keyboard.isDown('down') then
      player.y = player.y + player.s * dt
  elseif love.keyboard.isDown('left') then
      player.x = player.x - player.s * dt
  elseif love.keyboard.isDown('right') then
      player.x = player.x + player.s * dt
  end

  camera:setPosition(player.x + player.w / 2, player.y + player.h / 2)
end

-- ===========================================
-- テスト用背景の作成
-- ===========================================
function createTestBackground()
  cvs = love.graphics.newCanvas(map.w, map.h)

  love.graphics.setCanvas(cvs)
  local lenW = map.w / 20 - 1
  local lenH = map.h / 20 - 1
  local grey = false

  for i = 0, lenW do
    if i % 2 == 0 then
      grey = false
    else
      grey = true
    end

    for j = 0, lenH do
      if grey then
        love.graphics.setColor(0.7, 0.7, 0.7)
      else
        love.graphics.setColor(0.3, 0.3, 0.3)
      end

      love.graphics.rectangle("fill", i * 20, j * 20, 20, 20)
      grey = not grey
    end
  end
  love.graphics.setColor(1, 1, 1)
  love.graphics.setCanvas()

  return cvs
end
gameraの動作確認

キーボードの上下左右を押すとプレイヤーの画像が動くようになっています。プレイヤーを右下に動かしてみてください。すると、ある地点からプレイヤーは固定されて背景のみが動くようになります。RPGのマップ移動で見たことがある動きですね。これがカメラの機能です。

上記のサンプルコードは動作確認用なので、細かい説明は他のページで行います。