From 2b207c4282219bae06eff9589824dc851f014be3 Mon Sep 17 00:00:00 2001 From: Aki Date: Wed, 29 Jun 2016 03:28:35 +0200 Subject: Flying Rayss! --- player.lua | 7 ++++++- ray.lua | 43 +++++++++++++++++++++++++++++++++++++++++++ world.lua | 23 ++++++++++++++++++++++- 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 ray.lua diff --git a/player.lua b/player.lua index 70446b4..a0599a3 100644 --- a/player.lua +++ b/player.lua @@ -293,6 +293,11 @@ function Player:draw (offset_x, offset_y, scale, debug) end end +-- getPosition +function Player:getPosition() + return self.body:getPosition() +end + -- Draw HUD of `Player` -- elevation: 1 bottom, 0 top function Player:drawHUD (x,y,scale,elevation) @@ -386,4 +391,4 @@ end function Player:playSound(sfx) local source = love.audio.newSource(self.sfx[sfx]) source:play() -end \ No newline at end of file +end diff --git a/ray.lua b/ray.lua new file mode 100644 index 0000000..486c505 --- /dev/null +++ b/ray.lua @@ -0,0 +1,43 @@ +-- `Ray` +-- That awesome effect that blinks when player dies! + +-- WHOLE CODE HAS FLAG OF "need a cleanup" + +Ray = { + naut = nil, + world = nil, + delay = 0.3 +} +function Ray:new(naut, world) + -- Meta + local o = {} + setmetatable(o, self) + self.__index = self + -- Init + o.naut = naut + o.world = world + return o +end +function Ray:update(dt) + self.delay = self.delay - dt + if self.delay < 0 then + return true -- delete + end + return false +end +function Ray:draw(offset_x, offset_y, scale) + love.graphics.setLineStyle("rough") + love.graphics.setLineWidth(self.delay*160*scale) + local x, y = self.naut:getPosition() + local m = self.world.map + local dy = m.height + if y > m.center_y then + dy = -dy + end + local dx = m.width + if x > m.center_x then + dx = -dx + end + love.graphics.line((m.center_x+offset_x+dx)*scale,(m.center_y+offset_y+dy)*scale,(x+offset_x)*scale,(y+dy*0.7+offset_y)*scale) + love.graphics.setLineWidth(1) +end diff --git a/world.lua b/world.lua index 8da0d6b..86a8ab1 100644 --- a/world.lua +++ b/world.lua @@ -8,6 +8,7 @@ require "player" require "cloud" require "effect" require "decoration" +require "ray" -- Metatable of `World` -- nils initialized in constructor @@ -19,6 +20,7 @@ World = { Clouds = nil, Decorations = nil, Effects = nil, + Rays = nil, camera = nil, -- cloud generator clouds_delay = 5, @@ -53,6 +55,8 @@ function World:new(map, ...) o.Effects = e local d = {} o.Decorations = d + local r = {} + o.Rays = r -- Random init math.randomseed(os.time()) -- Map @@ -166,6 +170,11 @@ function World:createEffect(name, x, y) table.insert(self.Effects, Effect:new(name, x, y)) end +-- Add a ray +function World:createRay(naut) + table.insert(self.Rays, Ray:new(naut, self)) +end + -- get Nauts functions -- more than -1 lives function World:getNautsPlayable() @@ -192,6 +201,7 @@ end -- Event: when player is killed function World:onNautKilled(naut) self.camera:startShake() + self:createRay(naut) local nauts = self:getNautsPlayable() if self.lastNaut then local m = Menu:new() @@ -236,6 +246,12 @@ function World:update(dt) table.remove(self.Effects, _) end end + -- Rays + for _,ray in pairs(self.Rays) do + if ray:update(dt) then + table.remove(self.Rays, _) + end + end -- Bounce `winner` self.win_move = self.win_move + dt if self.win_move > 2 then @@ -283,6 +299,11 @@ function World:draw() platform:draw(offset_x, offset_y, scale, debug) end + -- Draw rays + for _,ray in pairs(self.Rays) do + ray:draw(offset_x, offset_y, scale) + end + -- draw center if debug then local c = self.camera @@ -351,4 +372,4 @@ function World.endContact(a, b, coll) print(b:getUserData().name .. " is in air") b:getUserData().inAir = true end -end \ No newline at end of file +end -- cgit v1.1