1
0
dodge-bolt/src/states/main.lua

124 lines
2.9 KiB
Lua

local MainState = {}
local pprint = require("lib.pprint")
local nata = require("lib.nata")
local data = require("data")
function MainState:enter(_, host_socket)
local groups = {
physical = {filter = {"pos", "vel"}},
player = {filter = {
"pos", "acc", "speed", "bolts"
-- "bolt_count",
-- "bolt_cooldown", "bolt_speed", "bolt_friction"
}},
controllable_player = {filter = {"controllable"}},
sprite = {filter = {"pos", "sprite"}},
bolt = {filter={"pos", "vel", "bolt"}},
collider = {filter={"pos", "collider"}}
}
local systems = {
require("systems.physics"),
require("systems.map"),
require("systems.sprite"),
require("systems.player"),
require("systems.bolt"),
require("systems.screen-scaler")
}
if not love.filesystem.isFused() then
table.insert(systems, require("systems.debug"))
end
if host_socket then
table.insert(systems, require("systems.multiplayer"))
end
self.ecs = nata.new{
groups = groups,
systems = systems,
data = {
host_socket = host_socket
}
}
self.downscaled_canvas = nil
self:refreshDownscaledCanvas()
self.ecs:on("onMapSwitch", function(map)
self:refreshDownscaledCanvas(map)
end)
love.graphics.setNewFont(48)
end
function MainState:refreshDownscaledCanvas(map)
if not map then
local Map = self.ecs:getSystem(require("systems.map"))
map = Map.map
if not map then
self.downscaled_canvas = nil
return
end
end
self.downscaled_canvas = love.graphics.newCanvas(
map.width * map.tilewidth,
map.height * map.tileheight
)
self.downscaled_canvas:setFilter("nearest", "nearest")
end
function MainState:update(dt)
self.ecs:flush()
self.ecs:emit("update", dt)
if love.keyboard.isDown("escape") then
love.event.quit()
end
end
function MainState:cleanup()
local multiplayer = self.ecs:getSystem(require("systems.multiplayer"))
if multiplayer then
multiplayer:disconnectPeers()
end
end
function MainState:quit()
self:cleanup()
end
function MainState:mousemoved(x, y, dx, dy, istouch)
local ScreenScaler = self.ecs:getSystem(require("systems.screen-scaler"))
if not ScreenScaler:isInBounds(x, y) then return end
x, y = ScreenScaler:getPosition(x, y)
dx = (ScreenScaler.scale or 1) * dx
dy = (ScreenScaler.scale or 1) * dy
self.ecs:emit("mousemoved", x, y, dx, dy, istouch)
end
function MainState:keypressed(...)
self.ecs:emit("keypressed", ...)
end
function MainState:draw()
local ScreenScaler = self.ecs:getSystem(require("systems.screen-scaler"))
-- Draw the game
ScreenScaler:start(self.downscaled_canvas)
self.ecs:emit("draw")
ScreenScaler:finish()
-- Draw UI on top
local w, h = self.downscaled_canvas:getDimensions()
ScreenScaler:start(1000, h/w * 1000)
love.graphics.setColor(1, 1, 1)
love.graphics.print("Hello World!")
ScreenScaler:finish()
-- Override scaling factors from UI, with scalers for the game
ScreenScaler:overrideScaling(self.downscaled_canvas:getDimensions())
end
return MainState