]> git.mcshandy.xyz Git - sumeriangame/commitdiff
Small map changes, some small cleanup in asset management and rendering.
authorRandy McShandy <randy@mcshandy.xyz>
Mon, 23 Feb 2026 03:14:41 +0000 (21:14 -0600)
committerRandy McShandy <randy@mcshandy.xyz>
Mon, 23 Feb 2026 03:14:41 +0000 (21:14 -0600)
main/assets.lua
main/handlers.lua
main/main.lua
main/render.lua
main/tiled/side_scroll.lua
main/tiled/side_scroll.tmx
main/tiled/test_1.lua
main/tiled/test_1.tmx
main/vector.lua

index 1a05094c1948e8d6e230d7825ca75abde88a85c5..91cde40e3df6523fee910a5ba788ee48ae482ff9 100644 (file)
@@ -100,8 +100,9 @@ function assets.get_source(name)
 end
 
 -- Load a map into STI and convert Object layers to custom layers
-function assets.store_map(name, path)
-  local new_map = sti(path)
+function assets.store_map(name, args)
+  local new_map = sti(args.path)
+  new_map.args = args
   assets.integrate_object_layers(new_map)
   AssetTables[AssetClass.TiledMap][name] = new_map
 end
@@ -144,8 +145,7 @@ assets.store_object('Player', {
   path = 'assets/sprites/gilgamesh.png',
   vec = vector.new_xy(),
   viewspace = vector.new_xy(),
-  update = function(self, dt)
-  end
+  update = function(self, dt) end,
 })
 
 function assets.all_objects()
@@ -155,7 +155,15 @@ end
 -- STI only supports images for tilesheet sources in a tilemap, not a tsx file
 -- Mostly just embed the tileset in Tiled so it knows to reference the original
 -- tilesheet png directly.
-assets.store_map('test_map_1', 'tiled/test_1.lua')
-assets.store_map('side_scroll', 'tiled/side_scroll.lua')
+assets.store_map('test_map_1',
+{
+  path = 'tiled/test_1.lua',
+  scale = 2.0,
+})
+assets.store_map('side_scroll',
+{
+  path = 'tiled/side_scroll.lua',
+  scale = 2.0,
+})
 
 return assets
index 899ddd447227f1e4eaae6fc9b3fcfb8a297c374f..643dc3d3d7a7d57c781c3e4094efb149b09dd301 100644 (file)
@@ -13,6 +13,8 @@ function love.handlers.map_changed(new_map_name)
   else
     print('invalid map: '..new_map_name)
   end
+  render.viewport = render.update_viewport()
+end
 
 -- Anything interested in a movement control should register its own handler here.
 function love.handlers.movement_control(key, value)
@@ -27,5 +29,3 @@ end
 
 function love.handlers.collision(collider, tile)
 end
-
-end
index d32100edcb6604dcf33f7f47abcaea1f4eef180e..47b15d2374cf4d096bccea9ad2d57949ad851468 100644 (file)
@@ -37,6 +37,11 @@ function love.keyreleased(key)
 end
 
 function love.draw()
+  local tile = {
+    w = render.map.active_map.tilewidth  * render.map.scale,
+    h = render.map.active_map.tileheight * render.map.scale,
+  }
+
   love.graphics.stencil(
     function()
       love.graphics.rectangle('fill',
@@ -53,7 +58,7 @@ function love.draw()
   last_color = { love.graphics.getColor() }
   love.graphics.setColor(render.color.dark)
   local adjust = render.worldspace_to_viewspace(player.vec)
-  love.graphics.rectangle('line', adjust.x, adjust.y, 32, 32)
+  love.graphics.rectangle('line', adjust.x, adjust.y, tile.w, tile.h)
   --love.graphics.print(IntroMessage, math.floor((conf.window.width/16) * 1), math.floor((conf.window.height/16) * 1))
   love.graphics.setColor(last_color)
 end
index db59089e01a98232fb3c5d847c289bce4e26c9dc..3c79517d2586b30c1f08e5e520705ba21a39a00d 100644 (file)
@@ -46,28 +46,26 @@ render.viewport =
 function render.activate_map(new_map_name)
   local success = false
   local new_map = assets.get_map(new_map_name)
+
   if new_map then
     success = true
     render.map.active_map = new_map
+    render.map.scale = new_map.args.scale
     render.active_viewclass = render.ViewClassData[new_map.properties.viewclass]
-    render.map.active_map.first_loop = true
 
-    -- Find all objects in the map we're switching to, and update their positional
+    -- Find all stored objects in the map we're switching to, and update their positional
     -- info with the unique copy stored in each map.
     for key,object in pairs(assets.all_objects()) do
       local object_in_map = render.map.active_map[key]
       if object_in_map then
         object.vec = object_in_map.vec
-        if key == 'Player' then
-          render.map.topleft = render.map.active_camera(object)
-        elseif key == 'CameraFocus' then
+        if object_in_map.name == 'Player' then
+          render.map.active_map.first_loop = true
           render.map.topleft = render.map.active_camera(object)
         end
       end
     end
 
-    render.viewport = render.update_viewport()
-
     love.event.push('map_changed', new_map_name)
   end
 
@@ -103,7 +101,7 @@ end
 function render.worldspace_to_viewspace(world_position)
   local view_position = utils.shallow_copy(world_position)
   local tile = {
-    w = render.map.active_map.tilewidth,
+    w = render.map.active_map.tilewidth ,
     h = render.map.active_map.tileheight,
   }
 
@@ -112,8 +110,8 @@ function render.worldspace_to_viewspace(world_position)
     x = (render.viewport.ex * math.floor((render.map.scale * world_position.x) / render.viewport.ex)),
     y = (render.viewport.ey * math.floor((render.map.scale * world_position.y) / render.viewport.ey)),
   }
-  view_position.x = (render.map.scale * (world_position.x )) + render.viewport.ox - offsets.x
-  view_position.y = (render.map.scale * (world_position.y )) + render.viewport.oy - offsets.y
+  view_position.x = (render.map.scale * world_position.x) + (render.viewport.ox) - offsets.x
+  view_position.y = (render.map.scale * world_position.y) + (render.viewport.oy) - offsets.y
 
   return view_position
 end
@@ -160,7 +158,7 @@ function(focus)
     render.map.active_map.first_loop = false
     return
     {
-      x = render.map.active_map['CameraFocus'].vec.x + (tile.w/2),
+      x = render.map.active_map['CameraFocus'].vec.x + (tile.w / 2),
       y = render.map.active_map['CameraFocus'].vec.y + (tile.h),
     }
   end
@@ -168,13 +166,13 @@ function(focus)
   local new_topleft = render.map.topleft
   local viewspace_focus = render.worldspace_to_viewspace(focus.vec)
 
-  if ((focus.vec.heading == utils.Headings.East) and viewspace_focus.x == render.viewport.ox) then
+  if ((focus.vec.heading == utils.Headings.East) and viewspace_focus.x <= render.viewport.ox) then
     new_topleft.x = new_topleft.x - (render.viewport.ex / render.map.scale)
-  elseif ((focus.vec.heading == utils.Headings.West) and viewspace_focus.x == render.viewport.ex) then
+  elseif ((focus.vec.heading == utils.Headings.West) and viewspace_focus.x >= render.viewport.ex) then
     new_topleft.x = new_topleft.x + (render.viewport.ex / render.map.scale)
-  elseif ((focus.vec.heading == utils.Headings.South) and viewspace_focus.y == render.viewport.oy) then
+  elseif ((focus.vec.heading == utils.Headings.South) and viewspace_focus.y <= render.viewport.oy) then
     new_topleft.y = new_topleft.y - (render.viewport.ey / render.map.scale)
-  elseif ((focus.vec.heading == utils.Headings.North) and viewspace_focus.y == render.viewport.ey) then
+  elseif ((focus.vec.heading == utils.Headings.North) and viewspace_focus.y >= render.viewport.ey) then
     new_topleft.y = new_topleft.y + (render.viewport.ey / render.map.scale)
   end
   return new_topleft
index 1b2c4c454a89d845f5bae479f814854446960dd2..f8c89a36b94450ff387b78718ed9c857967e0b23 100644 (file)
@@ -10,7 +10,7 @@ return {
   tilewidth = 16,
   tileheight = 16,
   nextlayerid = 5,
-  nextobjectid = 2,
+  nextobjectid = 6,
   properties = {
     ["viewclass"] = "sidescroll"
   },
@@ -93,12 +93,12 @@ return {
       properties = {},
       encoding = "lua",
       data = {
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        869, 870, 871, 872, 873, 874, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        870, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        871, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        872, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        873, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        874, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, 100, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 106, 99, 99, 1, 1, 105, 106, 1, 106, 99, 99, 100, 100, 1, 1, 99, 106, 100, 99, 99, 100, 1, 1, 1, 1, 1, 1, 1,
@@ -182,6 +182,19 @@ return {
           gid = 515,
           visible = true,
           properties = {}
+        },
+        {
+          id = 5,
+          name = "CameraFocus",
+          type = "Meta",
+          shape = "point",
+          x = 32,
+          y = 160,
+          width = 0,
+          height = 0,
+          rotation = 0,
+          visible = true,
+          properties = {}
         }
       }
     },
index ae974c3b4a3378fc69dd92f2c58a4c6f5ef2d278..d1f2c250b3b4334934b235d05ddb9592cd89e417 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<map version="1.10" tiledversion="1.11.2" orientation="orthogonal" renderorder="right-up" width="30" height="20" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="2">
+<map version="1.10" tiledversion="1.11.2" orientation="orthogonal" renderorder="right-up" width="30" height="20" tilewidth="16" tileheight="16" infinite="0" nextlayerid="5" nextobjectid="6">
  <editorsettings>
   <export target="side_scroll.lua" format="lua"/>
  </editorsettings>
  </tileset>
  <layer id="1" name="Background" width="30" height="20">
   <data encoding="csv">
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+869,870,871,872,873,874,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+870,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+871,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+872,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+873,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+874,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,106,100,106,1,1,1,1,1,1,1,1,1,1,1,1,
 1,1,106,99,99,1,1,105,106,1,106,99,99,100,100,1,1,99,106,100,99,99,100,1,1,1,1,1,1,1,
@@ -62,6 +62,9 @@
  </layer>
  <objectgroup id="4" name="Object Layer 1">
   <object id="1" name="Player" gid="515" x="112" y="256" width="16" height="16"/>
+  <object id="5" name="CameraFocus" type="Meta" x="32" y="160">
+   <point/>
+  </object>
  </objectgroup>
  <layer id="2" name="CityWalls_fg" width="30" height="20">
   <data encoding="csv">
index ff8c73f89a368e44316f4e83137256bf726370e0..39600e8a1b1aeb9d0ec503dabe9a3e2b47f0a9e4 100644 (file)
@@ -196,7 +196,7 @@ return {
       encoding = "lua",
       data = {
         51, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
-        918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,
+        918, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,
         919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,
         920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
         921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
index 28c2e299c455cb7fcaefe6b6ab09ecd27a0f4f3c..31cc2aeb26054b5b85015c02a020aa306f349ea1 100644 (file)
  <layer id="1" name="Decoration" width="30" height="20">
   <data encoding="csv">
 51,869,870,871,872,873,874,875,876,877,878,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,
-918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,
+918,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,
 919,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,
 920,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 921,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
index ace01a5eab0eec449b8c84e85a763fa891a81c42..3a0eb801b3a020b88293f2d6f30c77665909be85 100644 (file)
@@ -36,4 +36,11 @@ vector.snap_xy = function(vec)
   vec.speed = 0
 end
 
+vector.add_xy = function(left, right)
+  local new_vec = vector.new_xy()
+  new_vec.x = left.x + right.x
+  new_vec.y = left.y + right.y
+  return new_vec
+end
+
 return vector