Smoother missile tail fade

This commit is contained in:
Juhani Krekelä 2023-06-03 21:14:11 +03:00
parent 891e37fa4f
commit e98af7966f
1 changed files with 29 additions and 18 deletions

View File

@ -7,7 +7,9 @@ local wall_thickness = 0.01
local missiles = {} local missiles = {}
local missile_radius = 0.005 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 cities = {}
local city_radius = 0.05 local city_radius = 0.05
@ -102,6 +104,7 @@ function spawnMissile(x, y, target_x, target_y, speed)
history = { history = {
{x = x, y = y} {x = x, y = y}
}, },
trail_length = 0,
alive = true alive = true
}) })
end end
@ -130,25 +133,20 @@ function updateMissiles(dt)
missile.x = missile.x + missile.dx * dt missile.x = missile.x + missile.dx * dt
missile.y = missile.y + missile.dy * dt missile.y = missile.y + missile.dy * dt
local collided = false
if missile.y < wall_thickness + missile_radius then if missile.y < wall_thickness + missile_radius then
-- Collision with top wall -- Collision with top wall
missile.y = wall_thickness + missile_radius missile.y = wall_thickness + missile_radius
missile.dy = -missile.dy missile.dy = -missile.dy
collided = true
end end
if missile.x < wall_thickness + missile_radius then if missile.x < wall_thickness + missile_radius then
-- Collision with left wall -- Collision with left wall
missile.x = wall_thickness + missile_radius missile.x = wall_thickness + missile_radius
missile.dx = -missile.dx missile.dx = -missile.dx
collided = true
elseif missile.x > 1 - (wall_thickness + missile_radius) then elseif missile.x > 1 - (wall_thickness + missile_radius) then
-- Collision with right wall -- Collision with right wall
missile.x = 1 - (wall_thickness + missile_radius) missile.x = 1 - (wall_thickness + missile_radius)
missile.dx = -missile.dx missile.dx = -missile.dx
collided = true
end end
local paddle_left = paddle_x - paddle_width/2 local paddle_left = paddle_x - paddle_width/2
@ -159,7 +157,6 @@ function updateMissiles(dt)
missile.y = paddle_top missile.y = paddle_top
missile.dy = -missile.dy missile.dy = -missile.dy
missile.reflected = true missile.reflected = true
collided = true
end end
for _, city in ipairs(cities) do for _, city in ipairs(cities) do
@ -188,16 +185,23 @@ function updateMissiles(dt)
end end
end end
if collided then local dx = missile.history[1].x - missile.x
table.insert(missile.history, 1, { local dy = missile.history[1].y - missile.y
x = missile.x, local distance = math.sqrt(dx * dx + dy * dy)
y = missile.y missile.history[1].length = distance
}) missile.trail_length = missile.trail_length + distance
-- Remove the oldest segments table.insert(missile.history, 1, {
if #missile.history > missile_trail_length then x = missile.x,
table.remove(missile.history) y = missile.y,
end 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 end
print(#missile.history)
end end
local i = 1 local i = 1
@ -335,16 +339,23 @@ function drawMissiles()
-- Trails -- Trails
for _, missile in ipairs(missiles) do 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 from_x, from_y = toScreenCoordinates(missile.x, missile.y)
local visibility = 1
for _, point in ipairs(missile.history) do 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) local x, y = toScreenCoordinates(point.x, point.y)
if missile.reflected then if missile.reflected then
love.graphics.setColor(1 * visibility, 1 * visibility, 0.5 * visibility) love.graphics.setColor(1 * visibility, 1 * visibility, 0.5 * visibility)
else else
love.graphics.setColor(1 * visibility, 0.4 * visibility, 0 * visibility) love.graphics.setColor(1 * visibility, 0.4 * visibility, 0 * visibility)
end end
visibility = visibility * 0.8
love.graphics.line(from_x, from_y, x, y) love.graphics.line(from_x, from_y, x, y)
from_x = x from_x = x
from_y = y from_y = y