diff options
| -rw-r--r-- | main.lua | 5 | ||||
| -rw-r--r-- | res/speck/test.speck.lua | 2 | ||||
| -rw-r--r-- | src/camera.lua | 41 | ||||
| -rw-r--r-- | src/init.lua | 1 | ||||
| -rw-r--r-- | src/input.lua | 17 | ||||
| -rw-r--r-- | src/objs/camera_comp.lua | 10 | ||||
| -rw-r--r-- | src/objs/player.lua | 3 | ||||
| -rw-r--r-- | src/scenes/game.lua | 1 |
8 files changed, 77 insertions, 3 deletions
@@ -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) |
