From: Randy McShandy Date: Sat, 10 Jan 2026 06:50:36 +0000 (-0600) Subject: A little extra arrangement and basic player controls X-Git-Url: http://git.mcshandy.xyz/gitweb.cgi?a=commitdiff_plain;h=3b5b7b3c0152bf832a6c4cc438cf828ff5261aa4;p=sumeriangame A little extra arrangement and basic player controls --- diff --git a/main/assets.lua b/main/assets.lua index 8e287d0..84d24a3 100644 --- a/main/assets.lua +++ b/main/assets.lua @@ -1,13 +1,15 @@ -- 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, @@ -17,13 +19,17 @@ AssetClass = 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 @@ -31,11 +37,11 @@ function assets.integrate_object_layers(pmap) -- 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 @@ -43,12 +49,18 @@ function assets.integrate_object_layers(pmap) 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) @@ -91,16 +103,7 @@ function assets.get_map(name) 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 @@ -115,9 +118,9 @@ assets.store_source('transition1', 'assets/transition1.wav', 'static') -- 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 diff --git a/main/conf.lua b/main/conf.lua index 6266e39..701a5fa 100644 --- a/main/conf.lua +++ b/main/conf.lua @@ -10,9 +10,26 @@ config.window = 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 diff --git a/main/main.lua b/main/main.lua index 2d4b3af..135dabd 100644 --- a/main/main.lua +++ b/main/main.lua @@ -3,6 +3,8 @@ 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 @@ -14,22 +16,36 @@ function love.load() 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)) diff --git a/main/utils.lua b/main/utils.lua new file mode 100644 index 0000000..f5b0102 --- /dev/null +++ b/main/utils.lua @@ -0,0 +1,18 @@ +-- 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 diff --git a/main/vector.lua b/main/vector.lua new file mode 100644 index 0000000..ace01a5 --- /dev/null +++ b/main/vector.lua @@ -0,0 +1,39 @@ +-- 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