| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- local g = love.graphics
- local tween = require 'lib/deps/tween/tween'
- MenuStart = class()
- function MenuStart:init()
- self.geometry = setmetatable({}, {__index = function(t, k)
- return rawset(t, k, self.geometryFunctions[k]())[k]
- end})
- self.geometryFunctions = {
- campaign = function()
- local u, v = ctx.u, ctx.v
- local w = u * .25
- local h = w * .28
- return {u * .5 - w / 2, v * .65 - h / 2, w, h}
- end,
- survival = function()
- local u, v = ctx.u, ctx.v
- local w = u * .25
- local h = w * .28
- return {u * .5 - w / 2, v * .65 + h / 2 + .01 * v, w, h}
- end,
- options = function()
- local u, v = ctx.u, ctx.v
- local sx, sy, sw, sh = unpack(self.geometry.campaign)
- local w = u * .12
- local h = w * .28
- return {u * .5 - sw / 2, sy + (sh + v * .01) * 2, w, h}
- end,
- quit = function()
- local u, v = ctx.u, ctx.v
- local sx, sy, sw, sh = unpack(self.geometry.campaign)
- local w = u * .12
- local h = w * .28
- return {u * .5 + v * .01 - 1, sy + (sh + v * .01) * 2, w, h}
- end,
- feedback = function()
- local u, v = ctx.u, ctx.v
- local w, h = .1 * u, .05 * v
- return {0, v - h, w, h}
- end
- }
- self.scale = 0
- self.tween = tween.new(.5, self, {scale = 1}, 'outBack')
- self.campaign = ctx.gooey:add(Button, 'menu.start.campaign')
- self.campaign.geometry = function() return self.geometry.campaign end
- self.campaign.text = 'Campaign'
- self.campaign:on('click', function() self:continue('campaign') end)
- self.survival = ctx.gooey:add(Button, 'menu.start.survival')
- self.survival.geometry = function() return self.geometry.survival end
- self.survival.text = 'Survival'
- self.survival:on('click', function() self:continue('survival') end)
- self.options = ctx.gooey:add(Button, 'menu.start.options')
- self.options.geometry = function() return self.geometry.options end
- self.options:on('click', function() ctx.optionsPane:toggle() end)
- self.options.text = 'Options'
- self.quit = ctx.gooey:add(Button, 'menu.start.quit')
- self.quit.geometry = function() return self.geometry.quit end
- self.quit:on('click', function() love.event.quit() end)
- self.quit.text = 'Quit'
- self.feedback = ctx.gooey:add(Button, 'menu.start.feedback')
- self.feedback.geometry = function() return self.geometry.feedback end
- self.feedback.text = 'Feedback'
- self.feedback:on('click', function()
- love.system.openURL('http://mujujuju.com/feedback.html')
- end)
- self.offsetX = 0
- self.offsetY = 0
- self.prevOffsetX = self.offsetX
- self.prevOffsetY = self.offsetY
- self.sadAlpha = 0
- self.prevSadAlpha = 0
- end
- function MenuStart:update()
- if not self.active then return end
- self.prevOffsetX = self.offsetX
- self.prevOffsetY = self.offsetY
- local u, v = ctx.u, ctx.v
- local image = data.media.graphics.menu.titlescreen
- local scale = math.max(u / image:getWidth(), v / image:getHeight()) * 1.05
- self.offsetX = math.lerp(self.offsetX, (.5 - (love.mouse.getX() / u)) * (u * .04), 2 * ls.tickrate)
- self.offsetY = math.lerp(self.offsetY, (.5 - (love.mouse.getY() / v)) * (v * .04), 2 * ls.tickrate)
- self.prevSadAlpha = self.sadAlpha
- self.sadAlpha = math.lerp(self.sadAlpha, ((love.keyboard.isDown('escape') and not ctx.optionsPane.active) or (self.quit:contains(love.mouse.getPosition()) and love.mouse.isDown('l'))) and 1 or 0, 4 * ls.tickrate)
- end
- function MenuStart:draw()
- if not self.active then return end
- local u, v = ctx.u, ctx.v
- self.tween:update(ls.dt)
- local factor = self.scale
- g.setColor(255, 255, 255)
- data.media.shaders.vignette:send('frame', {0, 0, u, v})
- data.media.shaders.vignette:send('blur', .45)
- data.media.shaders.vignette:send('radius', .85)
- g.setShader(data.media.shaders.vignette)
- local image = data.media.graphics.menu.titlescreen
- local scale = math.max(u / image:getWidth(), v / image:getHeight()) * 1.05
- local offsetX = math.lerp(self.prevOffsetX, self.offsetX, ls.accum / ls.tickrate)
- local offsetY = math.lerp(self.prevOffsetY, self.offsetY, ls.accum / ls.tickrate)
- g.draw(image, u / 2 + offsetX, v / 2 + offsetY, 0, scale, scale, image:getWidth() / 2, image:getHeight() / 2)
- g.setShader()
- local image = data.media.graphics.menu.title
- local scale = v * .45 / image:getHeight()
- g.draw(image, u * .5 + offsetX / 2, v * .3 + offsetY / 2, 0, scale * factor, scale * factor, image:getWidth() / 2, image:getHeight() / 2)
- local image = data.media.graphics.menu.leaves
- local scale = u / image:getWidth() * 1.05
- g.draw(image, u / 2 + offsetX / 4, 0, 0, scale, scale, image:getWidth() / 2, 0)
- self.campaign:draw()
- self.survival:draw()
- self.options:draw()
- self.quit:draw()
- self.feedback:draw()
- local sadAlpha = math.lerp(self.prevSadAlpha, self.sadAlpha, ls.accum / ls.tickrate)
- g.setColor(0, 0, 0, 255 * sadAlpha)
- g.rectangle('fill', 0, 0, u, v)
- g.setColor(255, 255, 255, 255 * sadAlpha)
- g.setFont('mesmerize', .2 * v)
- local str = ':('
- if not love.keyboard.isDown('escape') and love.mouse.isDown('l') and not self.quit:contains(love.mouse.getPosition()) then str = ':)' end
- g.printCenter(str, u * .5, v * .5)
- end
- function MenuStart:keyreleased(key)
- if not self.active then return end
- if key == 'escape' then love.event.quit() end
- end
- function MenuStart:mousepressed(mx, my, b)
- --
- end
- function MenuStart:mousereleased(mx, my, b)
- if not self.active then return end
- end
- function MenuStart:gamepadpressed(gamepad, button)
- if not self.active then return end
- if button == 'b' and not ctx.optionsPane.active then
- love.event.quit()
- end
- end
- function MenuStart:resize()
- table.clear(self.geometry)
- end
- function MenuStart:continue(destination)
- ctx:refreshBackground()
- if ctx.optionsPane.active then ctx.optionsPane:toggle() end
- ctx:setPage('select', destination)
- end
|