Smoother missile tail fade
This commit is contained in:
parent
891e37fa4f
commit
e98af7966f
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue