menustart.lua 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. local g = love.graphics
  2. local tween = require 'lib/deps/tween/tween'
  3. MenuStart = class()
  4. function MenuStart:init()
  5. self.geometry = setmetatable({}, {__index = function(t, k)
  6. return rawset(t, k, self.geometryFunctions[k]())[k]
  7. end})
  8. self.geometryFunctions = {
  9. campaign = function()
  10. local u, v = ctx.u, ctx.v
  11. local w = u * .25
  12. local h = w * .28
  13. return {u * .5 - w / 2, v * .65 - h / 2, w, h}
  14. end,
  15. survival = function()
  16. local u, v = ctx.u, ctx.v
  17. local w = u * .25
  18. local h = w * .28
  19. return {u * .5 - w / 2, v * .65 + h / 2 + .01 * v, w, h}
  20. end,
  21. options = function()
  22. local u, v = ctx.u, ctx.v
  23. local sx, sy, sw, sh = unpack(self.geometry.campaign)
  24. local w = u * .12
  25. local h = w * .28
  26. return {u * .5 - sw / 2, sy + (sh + v * .01) * 2, w, h}
  27. end,
  28. quit = function()
  29. local u, v = ctx.u, ctx.v
  30. local sx, sy, sw, sh = unpack(self.geometry.campaign)
  31. local w = u * .12
  32. local h = w * .28
  33. return {u * .5 + v * .01 - 1, sy + (sh + v * .01) * 2, w, h}
  34. end,
  35. feedback = function()
  36. local u, v = ctx.u, ctx.v
  37. local w, h = .1 * u, .05 * v
  38. return {0, v - h, w, h}
  39. end
  40. }
  41. self.scale = 0
  42. self.tween = tween.new(.5, self, {scale = 1}, 'outBack')
  43. self.campaign = ctx.gooey:add(Button, 'menu.start.campaign')
  44. self.campaign.geometry = function() return self.geometry.campaign end
  45. self.campaign.text = 'Campaign'
  46. self.campaign:on('click', function() self:continue('campaign') end)
  47. self.survival = ctx.gooey:add(Button, 'menu.start.survival')
  48. self.survival.geometry = function() return self.geometry.survival end
  49. self.survival.text = 'Survival'
  50. self.survival:on('click', function() self:continue('survival') end)
  51. self.options = ctx.gooey:add(Button, 'menu.start.options')
  52. self.options.geometry = function() return self.geometry.options end
  53. self.options:on('click', function() ctx.optionsPane:toggle() end)
  54. self.options.text = 'Options'
  55. self.quit = ctx.gooey:add(Button, 'menu.start.quit')
  56. self.quit.geometry = function() return self.geometry.quit end
  57. self.quit:on('click', function() love.event.quit() end)
  58. self.quit.text = 'Quit'
  59. self.feedback = ctx.gooey:add(Button, 'menu.start.feedback')
  60. self.feedback.geometry = function() return self.geometry.feedback end
  61. self.feedback.text = 'Feedback'
  62. self.feedback:on('click', function()
  63. love.system.openURL('http://mujujuju.com/feedback.html')
  64. end)
  65. self.offsetX = 0
  66. self.offsetY = 0
  67. self.prevOffsetX = self.offsetX
  68. self.prevOffsetY = self.offsetY
  69. self.sadAlpha = 0
  70. self.prevSadAlpha = 0
  71. end
  72. function MenuStart:update()
  73. if not self.active then return end
  74. self.prevOffsetX = self.offsetX
  75. self.prevOffsetY = self.offsetY
  76. local u, v = ctx.u, ctx.v
  77. local image = data.media.graphics.menu.titlescreen
  78. local scale = math.max(u / image:getWidth(), v / image:getHeight()) * 1.05
  79. self.offsetX = math.lerp(self.offsetX, (.5 - (love.mouse.getX() / u)) * (u * .04), 2 * ls.tickrate)
  80. self.offsetY = math.lerp(self.offsetY, (.5 - (love.mouse.getY() / v)) * (v * .04), 2 * ls.tickrate)
  81. self.prevSadAlpha = self.sadAlpha
  82. 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)
  83. end
  84. function MenuStart:draw()
  85. if not self.active then return end
  86. local u, v = ctx.u, ctx.v
  87. self.tween:update(ls.dt)
  88. local factor = self.scale
  89. g.setColor(255, 255, 255)
  90. data.media.shaders.vignette:send('frame', {0, 0, u, v})
  91. data.media.shaders.vignette:send('blur', .45)
  92. data.media.shaders.vignette:send('radius', .85)
  93. g.setShader(data.media.shaders.vignette)
  94. local image = data.media.graphics.menu.titlescreen
  95. local scale = math.max(u / image:getWidth(), v / image:getHeight()) * 1.05
  96. local offsetX = math.lerp(self.prevOffsetX, self.offsetX, ls.accum / ls.tickrate)
  97. local offsetY = math.lerp(self.prevOffsetY, self.offsetY, ls.accum / ls.tickrate)
  98. g.draw(image, u / 2 + offsetX, v / 2 + offsetY, 0, scale, scale, image:getWidth() / 2, image:getHeight() / 2)
  99. g.setShader()
  100. local image = data.media.graphics.menu.title
  101. local scale = v * .45 / image:getHeight()
  102. g.draw(image, u * .5 + offsetX / 2, v * .3 + offsetY / 2, 0, scale * factor, scale * factor, image:getWidth() / 2, image:getHeight() / 2)
  103. local image = data.media.graphics.menu.leaves
  104. local scale = u / image:getWidth() * 1.05
  105. g.draw(image, u / 2 + offsetX / 4, 0, 0, scale, scale, image:getWidth() / 2, 0)
  106. self.campaign:draw()
  107. self.survival:draw()
  108. self.options:draw()
  109. self.quit:draw()
  110. self.feedback:draw()
  111. local sadAlpha = math.lerp(self.prevSadAlpha, self.sadAlpha, ls.accum / ls.tickrate)
  112. g.setColor(0, 0, 0, 255 * sadAlpha)
  113. g.rectangle('fill', 0, 0, u, v)
  114. g.setColor(255, 255, 255, 255 * sadAlpha)
  115. g.setFont('mesmerize', .2 * v)
  116. local str = ':('
  117. if not love.keyboard.isDown('escape') and love.mouse.isDown('l') and not self.quit:contains(love.mouse.getPosition()) then str = ':)' end
  118. g.printCenter(str, u * .5, v * .5)
  119. end
  120. function MenuStart:keyreleased(key)
  121. if not self.active then return end
  122. if key == 'escape' then love.event.quit() end
  123. end
  124. function MenuStart:mousepressed(mx, my, b)
  125. --
  126. end
  127. function MenuStart:mousereleased(mx, my, b)
  128. if not self.active then return end
  129. end
  130. function MenuStart:gamepadpressed(gamepad, button)
  131. if not self.active then return end
  132. if button == 'b' and not ctx.optionsPane.active then
  133. love.event.quit()
  134. end
  135. end
  136. function MenuStart:resize()
  137. table.clear(self.geometry)
  138. end
  139. function MenuStart:continue(destination)
  140. ctx:refreshBackground()
  141. if ctx.optionsPane.active then ctx.optionsPane:toggle() end
  142. ctx:setPage('select', destination)
  143. end