aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoriamcheeseman <[email protected]>2026-04-03 09:44:29 -0400
committeriamcheeseman <[email protected]>2026-04-03 09:44:29 -0400
commit623c351bab9e63c421939dc94d6930f9d94ba8d8 (patch)
tree961d11d9c84113a6c42c1b558fde59d60287e348 /src
parent94cc023a056ebc49ed883739e9f42f51598e57a0 (diff)
parentf26ba2147c7325595780bdc5dae56f1315e5495e (diff)
Merge branch 'main' of ssh://codeberg.org/the-gutter/gutshot
Diffstat (limited to 'src')
-rw-r--r--src/camera.lua41
-rw-r--r--src/init.lua1
-rw-r--r--src/input.lua17
-rw-r--r--src/objs/camera_comp.lua10
-rw-r--r--src/objs/player.lua3
-rw-r--r--src/scenes/game.lua1
6 files changed, 71 insertions, 2 deletions
diff --git a/src/camera.lua b/src/camera.lua
new file mode 100644
index 0000000..3283c0c
--- /dev/null
+++ b/src/camera.lua
@@ -0,0 +1,41 @@
+local DEFAULT_CAMERA_SMOOTHING = 30
+
+Cam = {}
+Cam.__index = Cam
+
+function Cam.new(x, y)
+ local self = setmetatable({}, Cam)
+
+ self.x = x or 0
+ self.y = y or 0
+ self.realx = self.x
+ self.realy = self.y
+ self.zoom = 1
+
+ self.smoothing = DEFAULT_CAMERA_SMOOTHING
+
+ return self
+end
+
+function Cam:update(dt)
+ self.realx = dlerp(self.realx, self.x, self.smoothing * dt)
+ self.realy = dlerp(self.realy, self.y, self.smoothing * dt)
+end
+
+local active_cam = Cam.new()
+
+function get_active_camera()
+ return active_cam
+end
+
+function set_active_camera(new_cam)
+ active_cam = new_cam
+end
+
+function use_camera_transform()
+ local w, h = SCR_WIDTH / 2, SCR_HEIGHT / 2
+ lg.scale(active_cam.zoom)
+ lg.translate(
+ -active_cam.realx + w / active_cam.zoom,
+ -active_cam.realy + h / active_cam.zoom)
+end
diff --git a/src/init.lua b/src/init.lua
index 50d542f..66f1b9e 100644
--- a/src/init.lua
+++ b/src/init.lua
@@ -11,6 +11,7 @@ require "src.room_editor"
require "src.export"
require "src.sound"
require "src.specks"
+require "src.camera"
SCR_WIDTH = 320
SCR_HEIGHT = 180
diff --git a/src/input.lua b/src/input.lua
index 5dacd81..7c625ed 100644
--- a/src/input.lua
+++ b/src/input.lua
@@ -101,12 +101,25 @@ function love.wheelmoved(...)
end
function get_mouse_pos()
+ local cam = get_active_camera()
local scrw, scrh = love.graphics.getDimensions()
+
local offset_x = (scrw - SCR_WIDTH * WindowScale) / 2
local offset_y = (scrh - SCR_HEIGHT * WindowScale) / 2
- return (lm.getX() - offset_x) / WindowScale,
- (lm.getY() - offset_y) / WindowScale
+ local mx = (lm.getX() - offset_x) / WindowScale
+ local my = (lm.getY() - offset_y) / WindowScale
+
+ mx = mx - SCR_WIDTH / 2
+ my = my - SCR_HEIGHT / 2
+
+ mx = mx / cam.zoom
+ my = my / cam.zoom
+
+ mx = mx + cam.realx
+ my = my + cam.realy
+
+ return mx, my
end
function input_step()
diff --git a/src/objs/camera_comp.lua b/src/objs/camera_comp.lua
new file mode 100644
index 0000000..3b8edf4
--- /dev/null
+++ b/src/objs/camera_comp.lua
@@ -0,0 +1,10 @@
+
+register_comp("Camera", function (ent)
+ assert(has_comp(ent, "Position"), "Why camera when no position bruh? Are you dumb??")
+ ent.camera = Cam.new(ent.x, ent.y)
+end)
+
+function camera_move_system(ent)
+ ent.camera.x = ent.x
+ ent.camera.y = ent.y
+end
diff --git a/src/objs/player.lua b/src/objs/player.lua
index 55a8ebe..dee4df5 100644
--- a/src/objs/player.lua
+++ b/src/objs/player.lua
@@ -119,6 +119,9 @@ function new_player(x, y)
layers = {},
mask = { "Hard" },
})
+ add_comp(ent, "Camera")
+ set_active_camera(ent.camera)
+ ent.camera.zoom = 0.5
add_comp(ent, "Sprite", "res/img/player.ase", {
offsetx = 0.5,
diff --git a/src/scenes/game.lua b/src/scenes/game.lua
index 4a31a99..45083ca 100644
--- a/src/scenes/game.lua
+++ b/src/scenes/game.lua
@@ -8,6 +8,7 @@ function start_game_scene()
event_bind(scn.on_update, "Sprite", sprite_anim_sys)
event_bind(scn.on_update, "Speck_System", speck_update_sys)
event_bind(scn.on_update, "Speck_Entity", speck_entity_system)
+ event_bind(scn.on_update, "Camera", camera_move_system)
event_bind(scn.on_draw, "Sprite", sprite_draw_sys)
event_bind(scn.on_draw, "Tilemap", tilemap_draw_sys)