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