From e98af7966f1cb3071806f8124dceea1a4c4c45d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Sat, 3 Jun 2023 21:14:11 +0300 Subject: [PATCH] Smoother missile tail fade --- bundle/main.lua | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/bundle/main.lua b/bundle/main.lua index d9cc55e..4617d89 100644 --- a/bundle/main.lua +++ b/bundle/main.lua @@ -7,7 +7,9 @@ local wall_thickness = 0.01 local missiles = {} local missile_radius = 0.005 -local missile_trail_length = 15 +local missile_trail_fade = 0.4 +local missile_trail_min_visibility = 0.03 +local missile_trail_length = math.log(missile_trail_min_visibility, missile_trail_fade) local cities = {} local city_radius = 0.05 @@ -102,6 +104,7 @@ function spawnMissile(x, y, target_x, target_y, speed) history = { {x = x, y = y} }, + trail_length = 0, alive = true }) end @@ -130,25 +133,20 @@ function updateMissiles(dt) missile.x = missile.x + missile.dx * dt missile.y = missile.y + missile.dy * dt - local collided = false - if missile.y < wall_thickness + missile_radius then -- Collision with top wall missile.y = wall_thickness + missile_radius missile.dy = -missile.dy - collided = true end if missile.x < wall_thickness + missile_radius then -- Collision with left wall missile.x = wall_thickness + missile_radius missile.dx = -missile.dx - collided = true elseif missile.x > 1 - (wall_thickness + missile_radius) then -- Collision with right wall missile.x = 1 - (wall_thickness + missile_radius) missile.dx = -missile.dx - collided = true end local paddle_left = paddle_x - paddle_width/2 @@ -159,7 +157,6 @@ function updateMissiles(dt) missile.y = paddle_top missile.dy = -missile.dy missile.reflected = true - collided = true end for _, city in ipairs(cities) do @@ -188,16 +185,23 @@ function updateMissiles(dt) end end - if collided then - table.insert(missile.history, 1, { - x = missile.x, - y = missile.y - }) - -- Remove the oldest segments - if #missile.history > missile_trail_length then - table.remove(missile.history) - end + local dx = missile.history[1].x - missile.x + local dy = missile.history[1].y - missile.y + local distance = math.sqrt(dx * dx + dy * dy) + missile.history[1].length = distance + missile.trail_length = missile.trail_length + distance + table.insert(missile.history, 1, { + x = missile.x, + y = missile.y, + length = nil, + }) + -- Remove the oldest segments + while missile.trail_length > missile_trail_length do + local length = missile.history[#missile.history].length + missile.trail_length = missile.trail_length - length + table.remove(missile.history) end + print(#missile.history) end local i = 1 @@ -335,16 +339,23 @@ function drawMissiles() -- Trails for _, missile in ipairs(missiles) do + local dx = missile.history[1].x - missile.x + local dy = missile.history[1].y - missile.y + local length = math.sqrt(dx * dx + dy * dy) + local from_x, from_y = toScreenCoordinates(missile.x, missile.y) - local visibility = 1 for _, point in ipairs(missile.history) do + local visibility = missile_trail_fade ^ length + if point.length ~= nil then + length = length + point.length + end + local x, y = toScreenCoordinates(point.x, point.y) if missile.reflected then love.graphics.setColor(1 * visibility, 1 * visibility, 0.5 * visibility) else love.graphics.setColor(1 * visibility, 0.4 * visibility, 0 * visibility) end - visibility = visibility * 0.8 love.graphics.line(from_x, from_y, x, y) from_x = x from_y = y