aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.lua5
-rw-r--r--res/speck/test.speck.lua2
-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
8 files changed, 77 insertions, 3 deletions
diff --git a/main.lua b/main.lua
index 2f73f3d..f0e1a39 100644
--- a/main.lua
+++ b/main.lua
@@ -19,11 +19,14 @@ function love.update(dt)
fire_event(scn.on_update, dt)
flush_scene()
+
+ get_active_camera():update(dt)
end
function love.draw(dt)
lg.origin()
lg.setCanvas({viewport, stencil=true})
+ use_camera_transform()
lg.clear()
local scn = get_current_scene()
@@ -31,7 +34,9 @@ function love.draw(dt)
fire_event(scn.on_draw, dt)
+ lg.origin()
lg.setCanvas()
+
local scr_width, scr_height = lg.getDimensions()
WindowScale = min(scr_width / SCR_WIDTH, scr_height / SCR_HEIGHT)
diff --git a/res/speck/test.speck.lua b/res/speck/test.speck.lua
index bd20cee..b99c340 100644
--- a/res/speck/test.speck.lua
+++ b/res/speck/test.speck.lua
@@ -1 +1 @@
-return {["interval"]=0.05,["texture_path"]="res/img/speck.png",["lifetime_max"]=0.6,["lifetime_min"]=0.3,["gradient"]="res/img/test_gradient.png",["spread"]=360,["spawn_shape"]="Point",["spawn_amount_min"]=3,["spawn_amount_max"]=4,["scale_curve"]="Lerp",["scale_start_min"]=0.8,["scale_start_max"]=1.3,["scale_end_min"]=0,["scale_end_max"]=0,["forcex"]=0,["forcey"]=502.1,["damping"]=0,["initial_velx_min"]=0,["initial_velx_max"]=140.3,["initial_vely_min"]=0,["initial_vely_max"]=0,["spawn_width"]=100,["spawn_height"]=100,} \ No newline at end of file
+return {["spawn_amount_max"]=4,["scale_curve"]="Lerp",["scale_start_min"]=0.8,["scale_start_max"]=1.3,["scale_end_min"]=0,["scale_end_max"]=0,["forcex"]=0,["forcey"]=502.1,["damping"]=0,["initial_velx_min"]=0,["initial_velx_max"]=140.3,["initial_vely_min"]=0,["initial_vely_max"]=0,["spawn_width"]=100,["spawn_height"]=100,["interval"]=0.05,["texture_path"]="res/img/speck.png",["oneshot"]=false,["lifetime_max"]=0.6,["lifetime_min"]=0.3,["bounce"]=true,["gradient"]="res/img/test_gradient.png",["spread"]=360,["spawn_shape"]="Point",["spawn_amount_min"]=3,} \ No newline at end of file
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)