This commit is contained in:
jill 2021-01-23 13:10:38 +03:00
parent 61d28a326f
commit 6ecbf07dbf
Signed by: oat
GPG key ID: DD83A9617A252385
2 changed files with 41 additions and 13 deletions

View file

@ -8,6 +8,7 @@ function self.fish(x, y)
y = y, y = y,
size = 0, -- 0 for small, 1 for medium, 2 for big, 3 for king size = 0, -- 0 for small, 1 for medium, 2 for big, 3 for king
eattimer = 0 + math.random() * 2, -- starts out hungry, with a 2s delay eattimer = 0 + math.random() * 2, -- starts out hungry, with a 2s delay
dead = false,
lifetime = 0, lifetime = 0,
@ -26,6 +27,7 @@ function self.fish(x, y)
yspeed = 0, yspeed = 0,
eattimer = 1, eattimer = 1,
hungry = 0, hungry = 0,
deathanim = 0,
} }
} }

View file

@ -52,7 +52,7 @@ function love.load()
sheets.food1 = newAnimation(sprites['food/1'], sprites['food/1']:getWidth()/10, sprites['food/1']:getHeight()) sheets.food1 = newAnimation(sprites['food/1'], sprites['food/1']:getWidth()/10, sprites['food/1']:getHeight())
for i = 1, 10 do for i = 1, 3 do
table.insert(feesh, constr.fish(math.random(), math.random())) table.insert(feesh, constr.fish(math.random(), math.random()))
end end
end end
@ -110,7 +110,7 @@ function love.update(dt)
local angle = math.random(-FISH_ANGLE, FISH_ANGLE) local angle = math.random(-FISH_ANGLE, FISH_ANGLE)
local str = math.random(70, 200)/200/4 local str = math.random(70, 200)/200/4
if n.eattimer <= 0 then -- needs to follow something if n.eattimer <= 0 and not n.dead then -- needs to follow something
local mx, my local mx, my
if n.eattimer <= 0 then if n.eattimer <= 0 then
if n.shortestfood and food[n.shortestfood] then if n.shortestfood and food[n.shortestfood] then
@ -143,7 +143,7 @@ function love.update(dt)
local x = math.cos(math.rad(angle)) * str local x = math.cos(math.rad(angle)) * str
local y = math.sin(math.rad(angle)) * str local y = math.sin(math.rad(angle)) * str
if not (n.shortestfood and food[n.shortestfood]) then if not ((n.shortestfood and food[n.shortestfood]) or n.dead) then
x = x * math.sign(n.render.x - n.render.prevx) x = x * math.sign(n.render.x - n.render.prevx)
end end
@ -159,8 +159,11 @@ function love.update(dt)
end end
e.speed = 1 / (math.sqrt(math.pow(math.abs(e.x - e.fromx), 2) + math.pow(math.abs(e.y - e.fromy), 2))/2) / 15 e.speed = 1 / (math.sqrt(math.pow(math.abs(e.x - e.fromx), 2) + math.pow(math.abs(e.y - e.fromy), 2))/2) / 15
if n.eattimer < -15 or (n.shortestfood and food[n.shortestfood]) then if n.eattimer < FISH_FOOD_HUNGRY or (n.shortestfood and food[n.shortestfood]) then
e.speed = e.speed * 1.4 e.speed = e.speed * 1.3
end
if n.dead then
e.speed = e.speed * 0.2
end end
end end
end end
@ -187,7 +190,9 @@ function love.update(dt)
n.render.x = clamp(n.render.x, 0.05, 0.95) n.render.x = clamp(n.render.x, 0.05, 0.95)
n.render.y = clamp(n.render.y, 0.1, 0.85) n.render.y = clamp(n.render.y, 0.1, 0.85)
bench.stopBenchmark('update_fish_position')
bench.startBenchmark('update_fish_colission')
if n.shortestfood and food[n.shortestfood] and frame % FISH_COLISSION_CHECK_FREQ == 0 then if n.shortestfood and food[n.shortestfood] and frame % FISH_COLISSION_CHECK_FREQ == 0 then
local f = food[n.shortestfood] local f = food[n.shortestfood]
if f then if f then
@ -208,7 +213,7 @@ function love.update(dt)
end end
end end
end end
bench.stopBenchmark('update_fish_position') bench.stopBenchmark('update_fish_colission')
bench.startBenchmark('update_fish_render') bench.startBenchmark('update_fish_render')
if frame % FISH_RENDER_FREQ == 0 then if frame % FISH_RENDER_FREQ == 0 then
@ -257,12 +262,27 @@ function love.update(dt)
n.render.swim = 0 n.render.swim = 0
end end
n.render.turndir = math.sign(n.render.x - n.render.prevx) if not n.dead then
n.render.turndir = math.sign(n.render.x - n.render.prevx)
end
local m = n.eattimer < FISH_FOOD_HUNGRY and 1 or -1 local m = n.eattimer < FISH_FOOD_HUNGRY and 1 or -1
n.render.hungry = clamp(n.render.hungry + dt * m * 3, 0, 1) n.render.hungry = clamp(n.render.hungry + dt * m * 3, 0, 1)
bench.stopBenchmark('update_fish_render') bench.stopBenchmark('update_fish_render')
if n.eattimer <= FISH_FOOD_DEAD then
n.dead = true
local timeSinceDead = math.abs(n.eattimer - FISH_FOOD_DEAD)
n.render.y = n.render.y + timeSinceDead/5 * math.min(timeSinceDead, 1)
n.render.y = clamp(n.render.y, 0, 0.85)
if n.render.y == 0.85 then
n.render.deathanim = n.render.deathanim + dt
if n.render.deathanim > 1 then
table.remove(feesh, fi)
end
end
end
end end
bench.stopBenchmark('update_fish') bench.stopBenchmark('update_fish')
bench.stopBenchmark('update') bench.stopBenchmark('update')
@ -309,7 +329,7 @@ function love.draw()
-- shadow -- shadow
bench.startBenchmark('render_shadow') bench.startBenchmark('render_shadow')
for i, n in ipairs(feesh) do for i, n in ipairs(feesh) do
love.graphics.setColor(1, 1, 1, n.render.y + 0.2) love.graphics.setColor(1, 1, 1, n.render.y + 0.2 - n.render.deathanim)
love.graphics.draw(sprites['shadow'], n.render.x * sw - (sprites['shadow']:getWidth() * spritescale)/2, sh - sh * 0.18 - (sprites['shadow']:getHeight() * spritescale)/2 + n.render.y * sh * 0.08, 0, spritescale, spritescale) love.graphics.draw(sprites['shadow'], n.render.x * sw - (sprites['shadow']:getWidth() * spritescale)/2, sh - sh * 0.18 - (sprites['shadow']:getHeight() * spritescale)/2 + n.render.y * sh * 0.08, 0, spritescale, spritescale)
end end
bench.stopBenchmark('render_shadow') bench.stopBenchmark('render_shadow')
@ -330,14 +350,14 @@ function love.draw()
if n.render.turndir == -1 then turn = 1 - turn; sizex = -1 end if n.render.turndir == -1 then turn = 1 - turn; sizex = -1 end
local turnframe = math.floor(turn * (#sample.quads - 1)) + 1 local turnframe = math.floor(turn * (#sample.quads - 1)) + 1
if #sample.quads == 10 then if #sample.quads == turnframe then
sizex = -1 * sizex sizex = -1 * sizex
turnframe = 1 turnframe = 1
end end
local frame = math.floor(n.render.swim * (#sample.quads - 1)) + 1 local frame = math.floor(n.render.swim * (#sample.quads - 1)) + 1
if turnframe ~= 1 and turnframe ~= 10 then if turnframe ~= 1 and turnframe ~= #sample.quads then
anim = 'turn' anim = 'turn'
frame = turnframe frame = turnframe
end end
@ -347,6 +367,12 @@ function love.draw()
frame = math.floor(n.render.eattimer * (#sample.quads - 1)) + 1 frame = math.floor(n.render.eattimer * (#sample.quads - 1)) + 1
end end
if n.dead then
anim = 'die'
local a = math.min(math.abs(n.eattimer - FISH_FOOD_DEAD) * 1.4, 1) - n.render.deathanim * 0.4
frame = math.floor(a * (#sample.quads - 1)) + 1
end
local angle = n.render.angle local angle = n.render.angle
if angle > math.pi/2 then if angle > math.pi/2 then
angle = angle - math.pi angle = angle - math.pi
@ -372,9 +398,9 @@ function love.draw()
local sadsheet = fishsprite(size, true, anim) local sadsheet = fishsprite(size, true, anim)
local alpha = n.render.hungry == 1 and 0 or 1 local alpha = n.render.hungry == 1 and 0 or 1
love.graphics.setColor(1, 1, 1, alpha) love.graphics.setColor(1, 1, 1, alpha - n.render.deathanim)
love.graphics.draw(sheet.spriteSheet, sheet.quads[math.max(math.min(frame, #sample.quads), 1)], x, y, angle, sizex * spritescale, spritescale, sample.width/2, sample.height/2) love.graphics.draw(sheet.spriteSheet, sheet.quads[math.max(math.min(frame, #sample.quads), 1)], x, y, angle, sizex * spritescale, spritescale, sample.width/2, sample.height/2)
love.graphics.setColor(1, 1, 1, n.render.hungry) love.graphics.setColor(1, 1, 1, n.render.hungry - n.render.deathanim)
love.graphics.draw(sadsheet.spriteSheet, sheet.quads[math.max(math.min(frame, #sample.quads), 1)], x, y, angle, sizex * spritescale, spritescale, sample.width/2, sample.height/2) love.graphics.draw(sadsheet.spriteSheet, sheet.quads[math.max(math.min(frame, #sample.quads), 1)], x, y, angle, sizex * spritescale, spritescale, sample.width/2, sample.height/2)
love.graphics.setColor(1, 1, 1) love.graphics.setColor(1, 1, 1)