From 6ecbf07dbf2150d00a4da5df18687ffac3cdd7e3 Mon Sep 17 00:00:00 2001 From: jill Date: Sat, 23 Jan 2021 13:10:38 +0300 Subject: [PATCH] they die --- constructors.lua | 2 ++ main.lua | 52 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/constructors.lua b/constructors.lua index 03dda8b..e46f0af 100644 --- a/constructors.lua +++ b/constructors.lua @@ -8,6 +8,7 @@ function self.fish(x, y) y = y, 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 + dead = false, lifetime = 0, @@ -26,6 +27,7 @@ function self.fish(x, y) yspeed = 0, eattimer = 1, hungry = 0, + deathanim = 0, } } diff --git a/main.lua b/main.lua index ebf0660..1477773 100644 --- a/main.lua +++ b/main.lua @@ -52,7 +52,7 @@ function love.load() 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())) end end @@ -110,7 +110,7 @@ function love.update(dt) local angle = math.random(-FISH_ANGLE, FISH_ANGLE) 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 if n.eattimer <= 0 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 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) end @@ -159,8 +159,11 @@ function love.update(dt) 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 - if n.eattimer < -15 or (n.shortestfood and food[n.shortestfood]) then - e.speed = e.speed * 1.4 + if n.eattimer < FISH_FOOD_HUNGRY or (n.shortestfood and food[n.shortestfood]) then + e.speed = e.speed * 1.3 + end + if n.dead then + e.speed = e.speed * 0.2 end end end @@ -187,7 +190,9 @@ function love.update(dt) n.render.x = clamp(n.render.x, 0.05, 0.95) 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 local f = food[n.shortestfood] if f then @@ -208,7 +213,7 @@ function love.update(dt) end end end - bench.stopBenchmark('update_fish_position') + bench.stopBenchmark('update_fish_colission') bench.startBenchmark('update_fish_render') if frame % FISH_RENDER_FREQ == 0 then @@ -257,12 +262,27 @@ function love.update(dt) n.render.swim = 0 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 n.render.hungry = clamp(n.render.hungry + dt * m * 3, 0, 1) - 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 bench.stopBenchmark('update_fish') bench.stopBenchmark('update') @@ -309,7 +329,7 @@ function love.draw() -- shadow bench.startBenchmark('render_shadow') 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) end bench.stopBenchmark('render_shadow') @@ -330,14 +350,14 @@ function love.draw() if n.render.turndir == -1 then turn = 1 - turn; sizex = -1 end local turnframe = math.floor(turn * (#sample.quads - 1)) + 1 - if #sample.quads == 10 then + if #sample.quads == turnframe then sizex = -1 * sizex turnframe = 1 end 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' frame = turnframe end @@ -347,6 +367,12 @@ function love.draw() frame = math.floor(n.render.eattimer * (#sample.quads - 1)) + 1 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 if angle > math.pi/2 then angle = angle - math.pi @@ -372,9 +398,9 @@ function love.draw() local sadsheet = fishsprite(size, true, anim) 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.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.setColor(1, 1, 1)