]> git.mcshandy.xyz Git - sumeriangame/commitdiff
A little extra arrangement and basic player controls tiled-integration
authorRandy McShandy <randy@mcshandy.xyz>
Sat, 10 Jan 2026 06:50:36 +0000 (00:50 -0600)
committerRandy McShandy <randy@mcshandy.xyz>
Sat, 10 Jan 2026 06:50:36 +0000 (00:50 -0600)
main/assets.lua
main/conf.lua
main/main.lua
main/utils.lua [new file with mode: 0644]
main/vector.lua [new file with mode: 0644]

index 8e287d029a823769d6b9852ce0b6414d00c6d7f1..84d24a353db6b9f8830bb266513b406b7ccd92fe 100644 (file)
@@ -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
index 6266e39112a1192447494f492ceb91927b27194b..701a5fa7fa41c06ae559921576dcb888a232ba2c 100644 (file)
@@ -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
index 2d4b3af8294a56daac1f2757b652e8ab8125a20f..135dabd08f5c2e69c180ba4523647d20df99fc2f 100644 (file)
@@ -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 (file)
index 0000000..f5b0102
--- /dev/null
@@ -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 (file)
index 0000000..ace01a5
--- /dev/null
@@ -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