-- assets.lua
-- Asset storage
-local sti = require('plugin/sti')
+local utils = require('utils')
+local vector = require('vector')
+local sti = require('plugin/sti')
+
+local assets = {}
-- You need a cuneiform font for this one
IntroMessage = "\nπ©ππΌπ―ππΆπ¨π\nππ§π π²\nπ£π΅"
-local assets = {}
-
AssetClass =
{
Image = 1,
Object = 5,
}
-ObjectClass =
+PropertyFlag =
{
- Drawn = 1,
+ Active = 1, -- Will be moving around or need other periodic updates
+ -- and should provide its own update function
+ Controllable = 2, -- Can be controlled in some way
}
function assets.integrate_object_layers(pmap)
for k,layer in pairs(pmap.layers) do
+ layer.keyreleased = function(self, key) end
+
if layer.type == 'objectgroup' then
local new_layer = pmap:addCustomLayer('imported-' .. layer.name)
new_layer.offsetx, new_layer.offsetx = layer.offsetx, layer.offsety
-- Match objects in each layer to a pre-loaded asset-object
for ok,ov in pairs(new_layer.objects) do
- object = assets.get_object(ov.name)
+ local object = assets.get_object(ov.name)
if object then
object.image = love.graphics.newImage(object.path)
- object.x = ov.x
- object.y = ov.y
+ object.vec.x = ov.x
+ object.vec.y = ov.y
end
end
for ok, ov in pairs(self.objects) do
local object = assets.get_object(ov.name)
if object and object.image then
- love.graphics.draw(object.image, object.x, object.y, 0, 1, 1, 0, 0)
+ love.graphics.draw(object.image, math.floor(object.vec.x), math.floor(object.vec.y), 0, 1, 1, 0, 0)
end
end
end
new_layer.update = function(self, dt)
+ for ok, ov in pairs(self.objects) do
+ local object = assets.get_object(ov.name)
+ if object and utils.flag_set(object.properties, PropertyFlag.Active) then
+ vector.snap_xy(object.vec)
+ end
+ end
end
pmap:setObjectData(new_layer)
end
function assets.store_object(name, opts)
- local new_object = {}
-
- if opts.class == ObjectClass.Drawn then
- new_object.path = opts.path
- new_object.x = 0
- new_object.y = 0
- else
- return
- end
-
+ local new_object = opts
AssetTables[AssetClass.Object][name] = new_object
end
-- If relevant, an Object asset's name should match an object as placed
-- in an Object layer of a Tiled map
assets.store_object('Player', {
- -- This is a drawn sprite that's going to be jammed into a Sprite layer
- class = ObjectClass.Drawn,
+ properties = (PropertyFlag.Active),
path = 'assets/sprites/gilgamesh.png',
+ vec = vector.new_xy(),
})
-- STI only supports images for tilesheet sources in a tilemap, not a tsx file
width = 800,
height = 600,
title = "title",
- fullscreen = false
+ fullscreen = false,
}
+config.ControlType =
+{
+ System = 0,
+ Movement = 1,
+}
+
+config.player_keymap = {}
+config.player_keymap['l'] = { heading = (math.pi / 2) * -0, control = config.ControlType.Movement, }
+config.player_keymap['k'] = { heading = (math.pi / 2) * -1, control = config.ControlType.Movement, }
+config.player_keymap['h'] = { heading = (math.pi / 2) * -2, control = config.ControlType.Movement, }
+config.player_keymap['j'] = { heading = (math.pi / 2) * -3, control = config.ControlType.Movement, }
+
+config.player_keymap['d'] = { heading = (math.pi / 2) * -0, control = config.ControlType.Movement, }
+config.player_keymap['w'] = { heading = (math.pi / 2) * -1, control = config.ControlType.Movement, }
+config.player_keymap['a'] = { heading = (math.pi / 2) * -2, control = config.ControlType.Movement, }
+config.player_keymap['s'] = { heading = (math.pi / 2) * -3, control = config.ControlType.Movement, }
+
function love.conf(t)
for k,v in pairs(config.window) do
t.window[k] = v
local sti = require('plugin/sti')
local conf = require('conf')
local assets = require('assets')
+local utils = require('utils')
+local vector = require('vector')
local active_map = nil
local world = nil
love.audio.play(assets.get_source('intro'))
active_map = assets.get_map('test_map_1')
+ for k,v in pairs(conf.player_keymap) do
+ v.speed = active_map.tilewidth
+ end
+
player = assets.get_object('Player')
+ player.keyreleased = function(self, key)
+ if key == 'q' then love.event.quit(0) end
+ for k,v in pairs(conf.player_keymap) do
+ if key == k and (v.control == conf.ControlType.Movement) then
+ self.vec.heading = v.heading
+ self.vec.speed = v.speed
+ end
+ end
+ end
tx = 0
ty = 0
end
-function love.update(delta_time)
- active_map:update(delta_time)
- if player then
- player.x = player.x + 0.2
- end
+function love.update(dt)
+ active_map:update(dt)
end
function love.keypressed(key)
end
+function love.keyreleased(key)
+ player:keyreleased(key)
+end
+
function love.draw()
active_map:draw(tx, ty, 2.0)
love.graphics.print(IntroMessage, math.floor((conf.window.width/16) * 1), math.floor((conf.window.height/16) * 1))
--- /dev/null
+-- utils.lua
+local bit = require('bit')
+
+local utils = {}
+
+function utils.flag_set(value, flag)
+ return (bit.band(value, flag) ~= 0)
+end
+
+function utils.shallow_copy(t)
+ local t2 = {}
+ for k,v in pairs(t) do
+ t2[k] = v
+ end
+ return t2
+end
+
+return utils
--- /dev/null
+-- vector.lua
+local utils = require('utils')
+
+local vector = {}
+
+vector.xy_default =
+{
+ x = 0.0,
+ y = 0.0,
+ heading = 0,
+ speed = 0,
+}
+
+vector.new_xy = function(x, y, heading, speed)
+ local new_vec = utils.shallow_copy(vector.xy_default)
+ if x then new_vec.x = x end
+ if y then new_vec.y = y end
+ if heading then new_vec.heading = heading end
+ if speed then new_vec.speed = speed end
+ return new_vec
+end
+
+vector.update_xy = function(vec, dt)
+ local dx = math.cos(vec.heading) * vec.speed * dt
+ vec.x = vec.x + dx
+ local dy = math.sin(vec.heading) * vec.speed * dt
+ vec.y = vec.y + dy
+end
+
+vector.snap_xy = function(vec)
+ local dx = math.cos(vec.heading) * vec.speed
+ vec.x = vec.x + dx
+ local dy = math.sin(vec.heading) * vec.speed
+ vec.y = vec.y + dy
+
+ vec.speed = 0
+end
+
+return vector