Skip to content

Instantly share code, notes, and snippets.

@dvdfu
Created April 23, 2017 03:08
Show Gist options
  • Save dvdfu/4e86f15198c310ebe0daec102b3e8494 to your computer and use it in GitHub Desktop.
Save dvdfu/4e86f15198c310ebe0daec102b3e8494 to your computer and use it in GitHub Desktop.
local Class = require 'modules.middleclass.middleclass'
local Stateful = require 'modules.stateful.stateful'
local Timer = require 'modules.hump.timer'
local Const = require 'src.const'
local Screen = Class('Screen')
Screen:include(Stateful)
local Iris = Screen:addState('Iris')
local Overlay = Screen:addState('Overlay')
function Screen:initialize(props)
self.timer = Timer.new()
self.progress = 0
props = props or {}
self.props = {
length = props.length or 20,
limit = props.limit or 1,
easeOut = props.easeOut or 'linear',
easeIn = props.easeIn or 'linear',
}
end
function Screen:update(dt)
self.timer:update(dt)
end
function Screen:fadeOut(after)
self.progress = 0
self.timer:clear()
self.timer:tween(self.props.length, self, { progress = self.props.limit }, self.props.easeOut, function()
-- tweener has small absolute error
self.progress = self.props.limit
if after then after() end
end)
end
function Screen:fadeIn(after)
self.progress = self.props.limit
self.timer:clear()
self.timer:tween(self.props.length, self, { progress = 0 }, self.props.easeIn, function()
-- tweener has small absolute error
self.progress = 0
if after then after() end
end)
end
function Screen:irisOut(after)
Screen.fadeOut(self, after)
self:gotoState('Iris')
end
function Screen:irisIn(after)
Screen.fadeIn(self, after)
self:gotoState('Iris')
end
function Screen:overlayOut(after)
Screen.fadeOut(self, after)
self:gotoState('Overlay')
end
function Screen:overlayIn(after)
Screen.fadeIn(self, after)
self:gotoState('Overlay')
end
function Screen:inProgress()
return self.progress > 0 and self.progress < self.props.limit
end
function Screen:draw() end
function Iris:draw()
if self.progress == 0 then return end
local sw, sh = Const.SCREEN_WIDTH, Const.SCREEN_HEIGHT
local cw, ch = sw / 2, sh / 2
local pw = sw * self.progress
love.graphics.setColor(0, 0, 0)
love.graphics.polygon('fill', 0, ch - cw, 0, ch - cw + pw, pw, ch - cw) -- tl
love.graphics.polygon('fill', sw, ch - cw, sw - pw, ch - cw, sw, ch - cw + pw) -- tr
love.graphics.polygon('fill', 0, ch + cw, 0, ch + cw - pw, pw, ch + cw) -- bl
love.graphics.polygon('fill', sw, ch + cw, sw - pw, ch + cw, sw, ch + cw - pw) -- br
love.graphics.setColor(255, 255, 255)
end
function Overlay:draw()
if self.progress == 0 then return end
love.graphics.setColor(0, 0, 0, self.progress * self.props.limit * 255)
love.graphics.rectangle('fill', 0, 0, Const.SCREEN_WIDTH, Const.SCREEN_HEIGHT)
love.graphics.setColor(255, 255, 255, 255)
end
return Screen
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment