
В предыдущей статье мы рассмотрели из чего должен состоять шаблон игры и описали некоторые его части. В данной статье речь пойдёт о ядре приложения.
Ядро приложения играет очень важную роль, так как от того, как оно спроектировано будет зависеть насколько просто и удобно мы будем использовать его для создания своих игр. Необходимо чётко и понятно определить как различные подсистемы, входящие в приложение, будут взаимодействовать между собой. Необходимо ядро отделить от “игровых данных”, иначе получится путаница в коде и разрабатывать новый проект станет весьма проблематично.
Разумеется, мы будем использовать дополнительные библиотеки для разработки, чтобы не писать свой велосипед. В итоге должно получиться что-то типа сборника библиотек, взаимодействие между которыми мы будем настраивать под собственные нужды. Список дополнительных библиотек для игрового движка 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
Вот в принципе и всё. Уже можно пробовать запускать нашу заготовку. Разумеется наше приложение ещё ничего не может делать и вы увидите только чёрный экран.
В следующей статье мы “научим” наше приложение реагировать на ввод с клавиатуры и мыши.
Исходный код статьи: