Love2D | Шаблон игры

В предыдущей статье мы рассмотрели из чего должен состоять шаблон игры и описали некоторые его части. В данной статье речь пойдёт о ядре приложения.

Ядро приложения играет очень важную роль, так как от того, как оно спроектировано будет зависеть насколько просто и удобно мы будем использовать его для создания своих игр. Необходимо чётко и понятно определить как различные подсистемы, входящие в приложение, будут взаимодействовать между собой. Необходимо ядро отделить от “игровых данных”, иначе получится путаница в коде и разрабатывать новый проект станет весьма проблематично.

Разумеется, мы будем использовать дополнительные библиотеки для разработки, чтобы не писать свой велосипед. В итоге должно получиться что-то типа сборника библиотек, взаимодействие между которыми мы будем настраивать под собственные нужды. Список дополнительных библиотек для игрового движка Love2D можно посмотреть здесь.

Для начала нужно создать папку для будущего проекта примерно со следующей структурой:

Love2D | Шаблон игры

Также нам понадобятся библиотеки anim8 для работы с анимацией и HUMP для работы с классами, таймером и другими необходимыми вещами.

Для начала откроем файл conf.lua и вставим туда следующий код:

function love.conf(c)
  c.version               = "0.9.1"
  c.title                 = "App"
  c.window.width          = 800
  c.window.height         = 600
  c.window.resizable      = false
  c.window.fullscreen     = false
  c.window.fullscreentype = "normal"
  c.window.vsync          = true
  c.window.fsaa           = 4
  c.modules.audio         = true
  c.modules.event         = true
  c.modules.graphics      = true
  c.modules.image         = true
  c.modules.joystick      = true
  c.modules.keyboard      = true
  c.modules.math          = true
  c.modules.mouse         = true
  c.modules.physics       = true
  c.modules.sound         = true
  c.modules.system        = true
  c.modules.timer         = true
  c.modules.window        = true
end

О всех настройках данного файла можно прочитать здесь.

Файл init.lua служит для подключения всех необходимых библиотек. Ниже приводится его содержание.

Class  = require "app.core.hump.class"
Vector = require "app.core.hump.vector"
Signal = require "app.core.hump.signal"
Timer  = require "app.core.hump.timer"
Camera = require "app.core.hump.camera"
Anim   = require "app.core.anim8.anim8"
App    = require "app.core.App"

Заготовка файла App.lua будет выглядеть следующим образом:

App = {}

App.OS      = love.system.getOS()
App.WIDTH   = love.graphics.getWidth()
App.HEIGHT  = love.graphics.getHeight()
App.RUNNING = true

function App.run()
  if love.event then
    love.event.pump()

    for e, a, b, c, d in love.event.poll() do
      if e == "quit" then
        App.RUNNING = false
      elseif e == "keypressed" then
        --
      elseif e == "keyreleased" then
        --
      elseif e == "mousepressed" then
        --

        if c == "wu" then
          --
        elseif c == "wd" then
          --
        end
      elseif e == "mousereleased" then
        --
      end

      love.handlers[e]( a, b, c, d )
    end
  end

  return App.RUNNING
end

function App.close()
  App.RUNNING = false
end

return App

В файле App.lua мы создали объект нашего приложения App и добавили к нему несколько глобальных переменных (OS, WIDTH и HEIGHT), доступ к которым можно будет получить из любого модуля.

Осталось дополнить файл main.lua следующим кодом, чтобы приложение уже могло запуститься:

require "app"

function love.load()
end

function love.run()
  if love.math then
    love.math.setRandomSeed( os.time() )
  end

  if love.event then
    love.event.pump()
  end

  if love.load then
    love.load( arg )
  end

  if not (love.window and love.graphics and love.window.isCreated() and love.timer) then
    return
  end

  while App.run() do
    love.timer.step()
    local dt = love.timer.getDelta()

    -- update

    love.graphics.clear()
    love.graphics.origin()
    love.graphics.present()

    -- draw

    love.timer.sleep( 0.001 )
  end
end

Вот в принципе и всё. Уже можно пробовать запускать нашу заготовку. Разумеется наше приложение ещё ничего не может делать и вы увидите только чёрный экран.

В следующей статье мы “научим” наше приложение реагировать на ввод с клавиатуры и мыши.

Исходный код статьи:

Сохранить на Яндекс.Диск