From 04bddf36e53d5b55e1b807ccf7f4b944580ed6d1 Mon Sep 17 00:00:00 2001 From: Trevor Corcoran Date: Fri, 25 Feb 2022 16:36:36 -0500 Subject: [PATCH 1/9] Basic window resizing --- conf.lua | 2 +- main.lua | 12 +++++++++++- services/camera.lua | 8 ++++---- services/state.lua | 2 ++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/conf.lua b/conf.lua index 073b275..4ebd2a7 100644 --- a/conf.lua +++ b/conf.lua @@ -15,7 +15,7 @@ function love.conf(t) t.window.width = 800 t.window.height = 600 t.window.borderless = false - t.window.resizable = false + t.window.resizable = true t.window.minwidth = 1 t.window.minheight = 1 t.window.fullscreen = false diff --git a/main.lua b/main.lua index 2b13cad..a467f4d 100644 --- a/main.lua +++ b/main.lua @@ -20,7 +20,7 @@ local UpdateEntityAnimation = require('systems/UpdateEntityAnimation') local SpaceFriction = require('systems/SpaceFriction') love.load = function() - love.window.setMode(800, 600) + love.window.updateMode(800, 600) love.graphics.setDefaultFilter('nearest', 'nearest') textures.load() love.globalFont = love.graphics.newFont('assets/gnevejpixel.ttf', 30) @@ -60,6 +60,16 @@ love.draw = function() Camera.unset() end +love.resize = function(w, h) + print(w, h) + State.windowScale.x = w / 800 + State.windowScale.y = h / 600 + State.camera.window_width, State.camera.window_height = w, h + State.camera.scale_x = State.windowScale.x + State.camera.scale_y = State.windowScale.y + print(State.windowScale.x, State.windowScale.y) +end + love.update = function(dt) if State.paused == false then State.world:update(dt) diff --git a/services/camera.lua b/services/camera.lua index 5e38722..72c8e24 100644 --- a/services/camera.lua +++ b/services/camera.lua @@ -10,12 +10,12 @@ State.camera.boundary_size = 0 State.camera.pos_x = 0 * .5 State.camera.pos_y = 0 * .5 State.camera.rotation = 0 -State.camera.scale_x = 1 -State.camera.scale_y = 1 +State.camera.scale_x = State.windowScale.x +State.camera.scale_y = State.windowScale.y State.camera.window_width, State.camera.window_height = love.graphics:getDimensions() -local window_width = State.camera.window_width / State.camera.scale_x -local window_height = State.camera.window_height / State.camera.scale_y +local window_width = State.camera.window_width-- / State.camera.scale_x +local window_height = State.camera.window_height-- / State.camera.scale_y -- https://love2d.org/wiki/FilterMode love.graphics.setDefaultFilter('nearest', 'nearest') diff --git a/services/state.lua b/services/state.lua index 7c890ee..f675571 100644 --- a/services/state.lua +++ b/services/state.lua @@ -12,6 +12,8 @@ State.activeShip = 1 State.camera = {} -- Initialized in /camera.lua +State.windowScale = {x = 1, y = 1} + State.credits = 0 -- True value loaded in services/save.lua State.seconds = 0 -- Keep track of map times. From 67a4f0e962d3093c2f2b49c5907cb05784abd4d7 Mon Sep 17 00:00:00 2001 From: Trevor Corcoran Date: Wed, 2 Mar 2022 15:06:27 -0500 Subject: [PATCH 2/9] Window icon --- assets/window_icon.png | Bin 0 -> 735 bytes conf.lua | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/window_icon.png diff --git a/assets/window_icon.png b/assets/window_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7dbc5d555a6a77d0800dd661235bef868252a3 GIT binary patch literal 735 zcmV<50wDc~P)P000>X1^@s6#OZ}&0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iQ^g`x2Rn#3M5s;{L`5963Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2zhIPS;0dyl(!fKV?p&FUBjG~G5+ ziMW`_u8Li+2qT0bhS4iC%b1g-Bz(u$Jpz2ai}5V~bAOH=HD@s(AQI0q!?cMvh^IGg zgY!OdgcW6#_?&pmqze*1a$WKGjdQ_efoDd{bZVYBLM#^ASZQNcG&SNW;;5?WlrLmF zRyl8R*2-1ZyeEHQIH#{HbDic85?I6%B#2N@MG0lth|#K(Vj)HQaUcJn>zBx-kgEhn zjs;YpL3aJ%fAG6oD?d5mC57Wa=ZoWfi~wD`K%?e3-^Y&AI01ssz?I(eSL(pbC+W48 z7Ci#`wteSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{006g1L_t(Y$L&->3d2AM+(=%KOTlaZxR3B1eydlZmwsV; zN-;|kolrs{^&%|jI5WDXfT5}lt)X&4Togn^n$Lf^E&$S-jhGKHVdh2tExFL0M?*v! z9XT%4N6P5yhj`uYkonA<_oN>NF&{F1X5ra<1tgLrBN=5HY)Lb}M?hmVU8FrT7c=|R z)LMs-iJ!g)n4XVC_CR~A2$5$EAS2(Ps?E#}t>#wr{l-jVUliTX+S@4~ Date: Thu, 3 Mar 2022 18:23:27 -0500 Subject: [PATCH 3/9] Foundation for settings menu --- main.lua | 16 +++--- menu/menu.lua | 117 +++++++++++++++++++++++----------------- menu/settingsMenu.lua | 60 +++++++++++++++++++++ menu/shipMenu.lua | 21 ++------ services/camera.lua | 11 ++-- services/state.lua | 7 ++- systems/DebugPlayer.lua | 6 +++ 7 files changed, 157 insertions(+), 81 deletions(-) create mode 100644 menu/settingsMenu.lua diff --git a/main.lua b/main.lua index a467f4d..cff2309 100644 --- a/main.lua +++ b/main.lua @@ -20,7 +20,7 @@ local UpdateEntityAnimation = require('systems/UpdateEntityAnimation') local SpaceFriction = require('systems/SpaceFriction') love.load = function() - love.window.updateMode(800, 600) + love.window.updateMode(State.camera.window_width, State.camera.window_height) love.graphics.setDefaultFilter('nearest', 'nearest') textures.load() love.globalFont = love.graphics.newFont('assets/gnevejpixel.ttf', 30) @@ -47,7 +47,7 @@ end love.draw = function() Camera.set() - background.draw(love.starLocations) + background.draw(love.starLocations) -- Currently bugged with how stars update to new resolution map.draw() @@ -61,13 +61,13 @@ love.draw = function() end love.resize = function(w, h) - print(w, h) - State.windowScale.x = w / 800 - State.windowScale.y = h / 600 + local function roundOff(value) + return math.floor(value * 100) / 100 + end + print(w .. ' (' .. roundOff(State.camera.scale_x) .. ') || '.. h .. ' (' .. roundOff(State.camera.scale_y) .. ')') State.camera.window_width, State.camera.window_height = w, h - State.camera.scale_x = State.windowScale.x - State.camera.scale_y = State.windowScale.y - print(State.windowScale.x, State.windowScale.y) + State.camera.scale_x = w / 800 + State.camera.scale_y = h / 800 end love.update = function(dt) diff --git a/menu/menu.lua b/menu/menu.lua index 4671afb..ea0e2ad 100644 --- a/menu/menu.lua +++ b/menu/menu.lua @@ -3,12 +3,14 @@ local mapList = require('maps/mapList') local State = require 'services/state' local map = require('services/map') local shipMenu = require('menu/shipMenu') +local settingsMenu = require('menu/settingsMenu') local save = require('services/save') local timer = require('services/timer') -local menu = { - state = {} -} +local menu = {} + +State.menu.state = nil +State.menu.blink = true menu.up = function() menu.mapSelect = menu.mapSelect + 1 @@ -32,7 +34,6 @@ local function displayTime() -- Draw current time and best times. local isNewBest = false local convertedTime - local corner = { State.camera.pos_x, State.camera.pos_y } -- Display either the last finish time (if map has finished) or current time. if State.activeMap ~= -1 then @@ -50,7 +51,7 @@ local function displayTime() end -- Print out times love.graphics.print('#' .. i + 1 .. ': ' .. menu.threeBest[i + 1], - corner[1] + 448, corner[2] + 430 + (i * 45), 0, 1.5, 1.5) + menu.corner[1] + 448, menu.corner[2] + 430 + (i * 45), 0, 1.5, 1.5) love.graphics.setColor(1, 1, 1, 1) end @@ -63,9 +64,9 @@ local function displayTime() love.graphics.setColor(1, 0, 0.25, 1) end -- Print current time. - love.graphics.print(convertedTime, corner[1] + 550, corner[2] + 340, 0, 1.5, 1.5) + love.graphics.print(convertedTime, menu.corner[1] + 550, menu.corner[2] + 340, 0, 1.5, 1.5) love.graphics.setColor(1, 1, 1, 1) - love.graphics.print('-----', corner[1] + 550, corner[2] + 385, 0, 1.5, 1.5) + love.graphics.print('-----', menu.corner[1] + 550, menu.corner[2] + 385, 0, 1.5, 1.5) end end @@ -73,19 +74,28 @@ menu.load = function() -- Yes, these are global variables. They will be unloaded when the menu is dismissed. menu.titleImage = love.graphics.newImage("/assets/sprites/menu.png") menu.blinkTimer = 0 - menu.blink = true if State.activeMap ~= -1 then menu.mapSelect = State.activeMap else menu.mapSelect = 1 end + -- Alias the true corner coordinates for convienience + menu.corner = { State.camera.pos_x, State.camera.pos_y } menu.threeBest = timer.getBestTimes(menu.mapSelect, 3) shipMenu.load() -- Load ship menu - J.R.C 2/2/22 + settingsMenu.load() + + --[[ Set the current menu state to map select + menu.state values can be: + nil - no menu + map_select - main menu/map selection prior to selecting ship + ship_select - select ship prior to loading map + settings - settings menu (precedes no specific event) + ]]-- + + State.menu.state = 'map_select' - -- Set the current menu state to map select - menu.state.map_select = true - menu.state.ship_select = false menu.font = love.graphics.newFont('assets/gnevejpixel.ttf', 30) -- Save data when opening menu since this is likely right before a player will quit. @@ -95,11 +105,12 @@ end menu.unload = function() menu.titleImage = nil menu.blinkTimer = nil - menu.blink = nil menu.mapSelect = nil menu.threeBest = nil menu.font = nil + menu.corner = nil shipMenu.unload() + settingsMenu.unload() end menu.key_map = { @@ -119,43 +130,53 @@ menu.key_map = { -- use ENTER to select a map and ship - J.R.C 2/7/22 p = function() if State.activeMap ~= -1 then - menu.state.map_select = not menu.state.map_select + State.menu.state = nil State.paused = not State.paused end end, up = function() - if menu.state.map_select then + if State.menu.state == 'map_select' then menu.up() + elseif State.menu.state == 'settings' then + settingsMenu.up() end end, down = function() - if menu.state.map_select then + if State.menu.state == 'map_select' then menu.down() + elseif State.menu.state == 'settings' then + settingsMenu.down() end end, left = function() - if menu.state.ship_select then + if State.menu.state == 'ship_select' then shipMenu.left() + elseif State.menu.state == 'settings' then + settingsMenu.left() end end, right = function() - if menu.state.ship_select then + if State.menu.state == 'map_select' then + State.menu.state = 'settings' + elseif State.menu.state == 'ship_select' then shipMenu.right() + elseif State.menu.state == 'settings' then + settingsMenu.right() end end, backspace = function() - if menu.state.ship_select then - menu.state.map_select = true - menu.state.ship_select = false + if State.menu.state == 'ship_select' then + State.menu.state = 'map_select' end end, ['return'] = function() - if menu.state.map_select then - menu.state.map_select = false - menu.state.ship_select = true - elseif menu.state.ship_select then + if State.menu.state == 'map_select' then + State.menu.state = 'ship_select' + elseif State.menu.state == 'ship_select' then shipMenu.load_ship() menu.load_map() + elseif State.menu.state == 'settings' then + settingsMenu.enter() end end, } @@ -188,19 +209,17 @@ end menu.draw = function() -- Draw map select (normal menu) - if menu.state.map_select then + if State.menu.state == 'map_select' then -- Added this because shipMenu changed the font - J.R.C love.graphics.setFont(menu.font) - -- Alias the true corner coordinates for convienience - local corner = { State.camera.pos_x, State.camera.pos_y } -- Transparent red background love.graphics.setColor(0.1, 0.0, 0.0, 0.6) local verticies = { - 0 + corner[1], 0 + corner[2], - 0 + corner[1], 600 + corner[2], - 800 + corner[1], 600 + corner[2], - 800 + corner[1], 0 + corner[2] } + 0 + menu.corner[1], 0 + menu.corner[2], + 0 + menu.corner[1], 600 + menu.corner[2], + 800 + menu.corner[1], 600 + menu.corner[2], + 800 + menu.corner[1], 0 + menu.corner[2] } love.graphics.polygon('fill', verticies) -- Draw menu image background @@ -208,41 +227,43 @@ menu.draw = function() love.graphics.draw(menu.titleImage, verticies[1], verticies[2]) -- Draw text - if menu.blink then - love.graphics.print(State.credits, corner[1] + 700, corner[2] + 30) + if State.menu.blink then + love.graphics.print(State.credits, menu.corner[1] + 700, menu.corner[2] + 30) -- Highlight map name in red if it is the active map. if menu.mapSelect == State.activeMap then love.graphics.setColor(1, 0, 0.25, 1) end - love.graphics.print(mapList[menu.mapSelect].displayName, corner[1] + 55, corner[2] + 420, 0, 2, 2) + love.graphics.print(mapList[menu.mapSelect].displayName, menu.corner[1] + 55, menu.corner[2] + 420, 0, 2, 2) love.graphics.setColor(1, 1, 1, 1) end - love.graphics.print('SPACE RACE', corner[1] + 25, corner[2] + 100, 0, 2, 2) - love.graphics.print('Credits: ', corner[1] + 550, corner[2] + 30) + love.graphics.print('SPACE RACE', menu.corner[1] + 25, menu.corner[2] + 100, 0, 2, 2) + love.graphics.print('Credits: ', menu.corner[1] + 550, menu.corner[2] + 30) -- Draw best times and current time. displayTime() -- Draw ship select Menu - elseif menu.state.ship_select then + elseif State.menu.state == 'ship_select' then shipMenu.draw() + elseif State.menu.state == 'settings' then + settingsMenu.draw() end end menu.update = function(dt) - if menu.state.map_select then - -- Blink timer for visual effect - menu.blinkTimer = menu.blinkTimer + dt - if menu.blinkTimer > 0.80 and menu.blink == true then - menu.blinkTimer = 0 - menu.blink = not menu.blink - elseif menu.blinkTimer > 0.2 and menu.blink == false then - menu.blinkTimer = 0 - menu.blink = not menu.blink - end - elseif menu.state.ship_select then + -- Blink timer for visual effect + menu.blinkTimer = menu.blinkTimer + dt + if menu.blinkTimer > 0.80 and State.menu.blink == true then + menu.blinkTimer = 0 + State.menu.blink = not State.menu.blink + elseif menu.blinkTimer > 0.2 and State.menu.blink == false then + menu.blinkTimer = 0 + State.menu.blink = not State.menu.blink + end + + if State.menu.state == 'ship_select' then shipMenu.update(dt) end end diff --git a/menu/settingsMenu.lua b/menu/settingsMenu.lua new file mode 100644 index 0000000..194aad4 --- /dev/null +++ b/menu/settingsMenu.lua @@ -0,0 +1,60 @@ +local sounds = require('services/sounds') +local mapList = require('maps/mapList') +local State = require 'services/state' +local map = require('services/map') +local shipMenu = require('menu/shipMenu') +local save = require('services/save') +local timer = require('services/timer') + +local settingsMenu = {} + +settingsMenu.up = function() + -- placeholder +end + +settingsMenu.down = function() + -- placeholder +end + +settingsMenu.load = function() + -- Alias the true corner coordinates for convienience + settingsMenu.corner = { State.camera.pos_x, State.camera.pos_y } + settingsMenu.font = love.graphics.newFont('assets/gnevejpixel.ttf', 30) + + -- Save data when opening menu since this is likely right before a player will quit. + save.write() +end + +settingsMenu.unload = function() + settingsMenu.titleImage = nil + settingsMenu.blinkTimer = nil + settingsMenu.mapSelect = nil + settingsMenu.threeBest = nil + settingsMenu.font = nil + settingsMenu.corner = nil +end + +settingsMenu.draw = function() + -- Reset font + love.graphics.setFont(settingsMenu.font) + + -- Transparent red background + love.graphics.setColor(0.1, 0.0, 0.0, 0.6) + local verticies = { + 0 + settingsMenu.corner[1], 0 + settingsMenu.corner[2], + 0 + settingsMenu.corner[1], 600 + settingsMenu.corner[2], + 800 + settingsMenu.corner[1], 600 + settingsMenu.corner[2], + 800 + settingsMenu.corner[1], 0 + settingsMenu.corner[2] } + love.graphics.polygon('fill', verticies) + + -- Draw settingsMenu image background + love.graphics.setColor(1, 1, 1, 1) + --love.graphics.draw(settingsMenu.titleImage, verticies[1], verticies[2]) + +end + +settingsMenu.update = function(dt) + -- nothing for now! +end + +return settingsMenu diff --git a/menu/shipMenu.lua b/menu/shipMenu.lua index 1c178cc..b104701 100644 --- a/menu/shipMenu.lua +++ b/menu/shipMenu.lua @@ -57,8 +57,7 @@ end ship_menu.load = function() -- Yes, these are global variables. They will be unloaded when the ship_menu is dismissed. ship_menu.titleImage = love.graphics.newImage("assets/sprites/ship_menu/ship_menu.png") - ship_menu.blinkTimer = 0 - ship_menu.blink = true + State.menu.blink = true ship_menu.shipSelect = State.activeShip ship_menu.title_font = love.graphics.newFont('assets/gnevejpixel.ttf', 30) @@ -68,8 +67,6 @@ end ship_menu.unload = function() -- ship_menu.titleImage = nil - ship_menu.blinkTimer = nil - ship_menu.blink = nil ship_menu.shipSelect = nil ship_menu.title_font = nil @@ -79,7 +76,7 @@ end ship_menu.load_ship = function() State.activeShip = ship_menu.shipSelect - State.shipMenu = not State.shipMenu + State.menu.state = nil love.audio.play(sounds.chirp_down) end @@ -101,7 +98,7 @@ ship_menu.draw = function() love.graphics.draw(ship_menu.titleImage, verticies[1], verticies[2]) -- Draw text - if ship_menu.blink then + if State.menu.blink then love.graphics.setFont(ship_menu.font) local name = shipList[ship_menu.shipSelect].displayName love.graphics.printf(name, corner[1] + 208 / 2, corner[2] + 143, 300, "center", 0, 2, 2) @@ -139,7 +136,7 @@ ship_menu.draw = function() local shift_y = image:getPixelHeight() * (center_scale_y) / 2 -- Draw blinking Square around currently selected ship - if ship_menu.blink then + if State.menu.blink then love.graphics.setColor(1, 0, 0, 1) love.graphics.rectangle("line", corner[1] + 400 - shift_x - 10, corner[2] + 200 + shift_y - 10, 148, 148) @@ -298,15 +295,7 @@ ship_menu.draw = function() end ship_menu.update = function(dt) - -- Blink timer for visual effect - ship_menu.blinkTimer = ship_menu.blinkTimer + dt - if ship_menu.blinkTimer > 0.40 and ship_menu.blink == true then - ship_menu.blinkTimer = 0 - ship_menu.blink = not ship_menu.blink - elseif ship_menu.blinkTimer > 0.2 and ship_menu.blink == false then - ship_menu.blinkTimer = 0 - ship_menu.blink = not ship_menu.blink - end + -- nothing for now! end return ship_menu diff --git a/services/camera.lua b/services/camera.lua index 72c8e24..77dd72e 100644 --- a/services/camera.lua +++ b/services/camera.lua @@ -10,12 +10,13 @@ State.camera.boundary_size = 0 State.camera.pos_x = 0 * .5 State.camera.pos_y = 0 * .5 State.camera.rotation = 0 -State.camera.scale_x = State.windowScale.x -State.camera.scale_y = State.windowScale.y -State.camera.window_width, State.camera.window_height = love.graphics:getDimensions() +State.camera.scale_x = 1 +State.camera.scale_y = 1 +State.camera.window_width, State.camera.window_height = 800, 800 +State.camera.play_area_width, State.camera.play_area_height = 800, 800 -local window_width = State.camera.window_width-- / State.camera.scale_x -local window_height = State.camera.window_height-- / State.camera.scale_y +local window_width = State.camera.window_width +local window_height = State.camera.window_height -- https://love2d.org/wiki/FilterMode love.graphics.setDefaultFilter('nearest', 'nearest') diff --git a/services/state.lua b/services/state.lua index f675571..efe1d8e 100644 --- a/services/state.lua +++ b/services/state.lua @@ -3,17 +3,16 @@ local world = require('services/world') local State = {} State.paused = true -State.debugOn = false +State.debugOn = true State.activeMap = -1 +State.menu = {} -- Initialized in /menu/menu.lua + -- Ship stuff duh - J.R.C 2/2/22 -State.shipMenu = false; State.activeShip = 1 State.camera = {} -- Initialized in /camera.lua -State.windowScale = {x = 1, y = 1} - State.credits = 0 -- True value loaded in services/save.lua State.seconds = 0 -- Keep track of map times. diff --git a/systems/DebugPlayer.lua b/systems/DebugPlayer.lua index 2edabb0..4bf7f04 100644 --- a/systems/DebugPlayer.lua +++ b/systems/DebugPlayer.lua @@ -44,6 +44,12 @@ local function debug(entity) love.graphics.setColor({ 1, 0, 0, 1 }) love.graphics.line(entity.body:getX(), entity.body:getY(), velocityArrowX,velocityArrowY) love.graphics.setColor({ 1, 1, 1, 1 }) -- Added this line to fix sprite drawing as red - J.R.C 2/2/22 + + -- Window debug information + love.graphics.setColor({ 1, 1, 1, 1 }) + love.graphics.circle('fill', 400 + State.camera.pos_x, State.camera.pos_y + 400, 5) + love.graphics.setColor({ 0, 0, 1, 1 }) + love.graphics.line(pos_x, pos_y + (State.camera.window_height / 2), pos_x + State.camera.window_width, pos_y + State.camera.window_height / 2) end end From f5cfd35b494f8b75b6bd30333fe4798e7493a8be Mon Sep 17 00:00:00 2001 From: Trevor Corcoran Date: Thu, 3 Mar 2022 22:36:11 -0500 Subject: [PATCH 4/9] Added settings menu to facilitate screen resizing. --- assets/sounds/boop.mp3 | Bin 0 -> 4642 bytes assets/sprites/{ => menu_images}/menu.png | Bin assets/sprites/menu_images/settings_menu.png | Bin 0 -> 12951 bytes assets/sprites/menu_images/settings_menu.png~ | Bin 0 -> 20245 bytes .../{ship_menu => menu_images}/ship_menu.png | Bin conf.lua | 2 +- main.lua | 11 - menu/menu.lua | 50 +++-- menu/settingsMenu.lua | 189 +++++++++++++++--- menu/shipMenu.lua | 13 +- services/camera.lua | 14 +- services/save.lua | 6 + services/sounds.lua | 2 +- services/state.lua | 2 + systems/CompleteLevel.lua | 2 - systems/DebugPlayer.lua | 9 +- 16 files changed, 221 insertions(+), 79 deletions(-) create mode 100644 assets/sounds/boop.mp3 rename assets/sprites/{ => menu_images}/menu.png (100%) create mode 100644 assets/sprites/menu_images/settings_menu.png create mode 100644 assets/sprites/menu_images/settings_menu.png~ rename assets/sprites/{ship_menu => menu_images}/ship_menu.png (100%) diff --git a/assets/sounds/boop.mp3 b/assets/sounds/boop.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..44256aed5f294209e9b4de47f79d6fcc0d596b67 GIT binary patch literal 4642 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/menu.png b/assets/sprites/menu_images/menu.png similarity index 100% rename from assets/sprites/menu.png rename to assets/sprites/menu_images/menu.png diff --git a/assets/sprites/menu_images/settings_menu.png b/assets/sprites/menu_images/settings_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..7e44c35d321d2d28bc35b7673315ae1d78e4ca84 GIT binary patch literal 12951 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 gDu^S!v(KK42geSN^J#+ry-u^AQb0|aO!7ytkO literal 0 HcmV?d00001 diff --git a/assets/sprites/menu_images/settings_menu.png~ b/assets/sprites/menu_images/settings_menu.png~ new file mode 100644 index 0000000000000000000000000000000000000000..a33bcb48d601f5e76a424f3e29abeda8464b477c GIT binary patch literal 20245 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/ship_menu/ship_menu.png b/assets/sprites/menu_images/ship_menu.png similarity index 100% rename from assets/sprites/ship_menu/ship_menu.png rename to assets/sprites/menu_images/ship_menu.png diff --git a/conf.lua b/conf.lua index f3e6ac1..c1be378 100644 --- a/conf.lua +++ b/conf.lua @@ -15,7 +15,7 @@ function love.conf(t) t.window.width = 800 t.window.height = 600 t.window.borderless = false - t.window.resizable = true + t.window.resizable = false t.window.minwidth = 1 t.window.minheight = 1 t.window.fullscreen = false diff --git a/main.lua b/main.lua index cff2309..cb696af 100644 --- a/main.lua +++ b/main.lua @@ -1,4 +1,3 @@ - local Entity = require('services/entity') local keyboard = require('services/keyboard') local Camera = require('services/camera') @@ -60,16 +59,6 @@ love.draw = function() Camera.unset() end -love.resize = function(w, h) - local function roundOff(value) - return math.floor(value * 100) / 100 - end - print(w .. ' (' .. roundOff(State.camera.scale_x) .. ') || '.. h .. ' (' .. roundOff(State.camera.scale_y) .. ')') - State.camera.window_width, State.camera.window_height = w, h - State.camera.scale_x = w / 800 - State.camera.scale_y = h / 800 -end - love.update = function(dt) if State.paused == false then State.world:update(dt) diff --git a/menu/menu.lua b/menu/menu.lua index ea0e2ad..89be364 100644 --- a/menu/menu.lua +++ b/menu/menu.lua @@ -72,7 +72,7 @@ end menu.load = function() -- Yes, these are global variables. They will be unloaded when the menu is dismissed. - menu.titleImage = love.graphics.newImage("/assets/sprites/menu.png") + menu.titleImage = love.graphics.newImage("/assets/sprites/menu_images/menu.png") menu.blinkTimer = 0 if State.activeMap ~= -1 then menu.mapSelect = State.activeMap @@ -96,7 +96,8 @@ menu.load = function() State.menu.state = 'map_select' - menu.font = love.graphics.newFont('assets/gnevejpixel.ttf', 30) + menu.smallFont = love.graphics.newFont('assets/gnevejpixel.ttf', 30) + menu.bigFont = love.graphics.newFont('assets/gnevejpixel.ttf', 60) -- Save data when opening menu since this is likely right before a player will quit. save.write() @@ -107,7 +108,8 @@ menu.unload = function() menu.blinkTimer = nil menu.mapSelect = nil menu.threeBest = nil - menu.font = nil + menu.smallFont = nil + menu.bigFont = nil menu.corner = nil shipMenu.unload() settingsMenu.unload() @@ -115,8 +117,14 @@ end menu.key_map = { escape = function() - save.write() - love.event.quit() + if State.menu.state == 'map_select' then + save.write() + love.event.quit() + elseif State.menu.state == 'ship_select' then + State.menu.state = 'map_select' + elseif State.menu.state == 'settings' then + settingsMenu.escape() + end end, o = function() -- Become Mr. Krabs and get all the money @@ -158,6 +166,8 @@ menu.key_map = { right = function() if State.menu.state == 'map_select' then State.menu.state = 'settings' + love.audio.stop(sounds.menu_click) + love.audio.play(sounds.menu_click) elseif State.menu.state == 'ship_select' then shipMenu.right() elseif State.menu.state == 'settings' then @@ -208,19 +218,19 @@ end menu.draw = function() + -- Transparent red background to be displayed for all menus + love.graphics.setColor(0.1, 0.0, 0.0, 0.6) + local verticies = { + 0 + menu.corner[1], 0 + menu.corner[2], + 0 + menu.corner[1], State.camera.window_height + menu.corner[2], + State.camera.window_width + menu.corner[1], State.camera.window_height + menu.corner[2], + State.camera.window_width + menu.corner[1], 0 + menu.corner[2] } + love.graphics.polygon('fill', verticies) + -- Draw map select (normal menu) if State.menu.state == 'map_select' then -- Added this because shipMenu changed the font - J.R.C - love.graphics.setFont(menu.font) - - -- Transparent red background - love.graphics.setColor(0.1, 0.0, 0.0, 0.6) - local verticies = { - 0 + menu.corner[1], 0 + menu.corner[2], - 0 + menu.corner[1], 600 + menu.corner[2], - 800 + menu.corner[1], 600 + menu.corner[2], - 800 + menu.corner[1], 0 + menu.corner[2] } - love.graphics.polygon('fill', verticies) + love.graphics.setFont(menu.smallFont) -- Draw menu image background love.graphics.setColor(1, 1, 1, 1) @@ -234,10 +244,14 @@ menu.draw = function() if menu.mapSelect == State.activeMap then love.graphics.setColor(1, 0, 0.25, 1) end - love.graphics.print(mapList[menu.mapSelect].displayName, menu.corner[1] + 55, menu.corner[2] + 420, 0, 2, 2) + love.graphics.setFont(menu.bigFont) + love.graphics.print(mapList[menu.mapSelect].displayName, menu.corner[1] + 55, menu.corner[2] + 420) love.graphics.setColor(1, 1, 1, 1) end - love.graphics.print('SPACE RACE', menu.corner[1] + 25, menu.corner[2] + 100, 0, 2, 2) + + love.graphics.setFont(menu.bigFont) + love.graphics.print('SPACE RACE', menu.corner[1] + 25, menu.corner[2] + 100) + love.graphics.setFont(menu.smallFont) love.graphics.print('Credits: ', menu.corner[1] + 550, menu.corner[2] + 30) -- Draw best times and current time. @@ -265,6 +279,8 @@ menu.update = function(dt) if State.menu.state == 'ship_select' then shipMenu.update(dt) + elseif State.menu.state == 'settings' then + settingsMenu.update(dt) end end diff --git a/menu/settingsMenu.lua b/menu/settingsMenu.lua index 194aad4..3de1826 100644 --- a/menu/settingsMenu.lua +++ b/menu/settingsMenu.lua @@ -1,60 +1,187 @@ local sounds = require('services/sounds') -local mapList = require('maps/mapList') local State = require 'services/state' -local map = require('services/map') -local shipMenu = require('menu/shipMenu') local save = require('services/save') -local timer = require('services/timer') +local camera = require('services/camera') local settingsMenu = {} +-- Next section: Actions + settingsMenu.up = function() - -- placeholder + -- Loop up the list of settings + settingsMenu.selection = settingsMenu.selection + 1 + if settingsMenu.selection > #settingsMenu.options then + settingsMenu.selection = 1 + end + + settingsMenu.ready = false + + love.audio.stop(sounds.boop) + love.audio.play(sounds.boop) end settingsMenu.down = function() - -- placeholder + -- Loop down the list of settings + settingsMenu.selection = settingsMenu.selection - 1 + if settingsMenu.selection < 1 then + settingsMenu.selection = #settingsMenu.options + end + + settingsMenu.ready = false + + love.audio.stop(sounds.boop) + love.audio.play(sounds.boop) end -settingsMenu.load = function() - -- Alias the true corner coordinates for convienience - settingsMenu.corner = { State.camera.pos_x, State.camera.pos_y } - settingsMenu.font = love.graphics.newFont('assets/gnevejpixel.ttf', 30) +settingsMenu.left = function() + -- Decrement settings value, else if player is not entering values leave the settings menu. + + -- If setting a setting, set the setting with the setting set + if settingsMenu.ready then + -- Change value and take a sanity check + local setting = settingsMenu.options[settingsMenu.selection] + setting.value = setting.value - setting.increment + if setting.value < setting.min then + setting.value = setting.min + end + + -- Play essential sound effects + love.audio.stop(sounds.boop) + love.audio.play(sounds.boop) + else + -- If not setting a setting, leave + love.audio.stop(sounds.menu_click) + love.audio.play(sounds.menu_click) + State.menu.state = 'map_select' + save.write() + end +end + +settingsMenu.right = function() + -- If player is entering values, increment settings value + if settingsMenu.ready then + local setting = settingsMenu.options[settingsMenu.selection] + setting.value = setting.value + setting.increment + if setting.value > setting.max then + setting.value = setting.max + end + + love.audio.stop(sounds.boop) + love.audio.play(sounds.boop) + end +end + +settingsMenu.enter = function() + -- Player must press enter to enable setting changes + settingsMenu.ready = not settingsMenu.ready - -- Save data when opening menu since this is likely right before a player will quit. + if settingsMenu.ready == false then + settingsMenu.updateSettings() + end +end + +settingsMenu.escape = function() + -- Alternate way of leaving settings menu + settingsMenu.ready = false + settingsMenu.updateSettings() save.write() + State.menu.state = 'map_select' +end + +settingsMenu.updateSettings = function() + camera.resize(settingsMenu.options[1].value) + State.volume = settingsMenu.options[2].value / 100 + love.audio.setVolume(State.volume) + + love.audio.stop(sounds.menu_click) + love.audio.play(sounds.menu_click) + + settingsMenu.ready = false -- Don't ask +end + + +-- Next section: Loading + +settingsMenu.load = function() + settingsMenu.titleImage = love.graphics.newImage("/assets/sprites/menu_images/settings_menu.png") + settingsMenu.smallFont = love.graphics.newFont('assets/gnevejpixel.ttf', 60) + settingsMenu.bigFont = love.graphics.newFont('assets/gnevejpixel.ttf', 90) + settingsMenu.selection = 1 + settingsMenu.ready = false + + settingsMenu.options = { + [1] = { + name = 'Resolution', + value = State.camera.scale_x, + increment = 0.1, + min = 1, + max = 10 + }, + [2] = { + name = 'Volume', + value = State.volume * 100, + increment = 10, + min = 0, + max = 100 + } + } end settingsMenu.unload = function() - settingsMenu.titleImage = nil - settingsMenu.blinkTimer = nil - settingsMenu.mapSelect = nil - settingsMenu.threeBest = nil settingsMenu.font = nil - settingsMenu.corner = nil + settingsMenu.options = nil + settingsMenu.selection = nil + settingsMenu.ready = nil + settingsMenu.titleImage = nil end + +-- Next section: Drawing + settingsMenu.draw = function() - -- Reset font - love.graphics.setFont(settingsMenu.font) - - -- Transparent red background - love.graphics.setColor(0.1, 0.0, 0.0, 0.6) - local verticies = { - 0 + settingsMenu.corner[1], 0 + settingsMenu.corner[2], - 0 + settingsMenu.corner[1], 600 + settingsMenu.corner[2], - 800 + settingsMenu.corner[1], 600 + settingsMenu.corner[2], - 800 + settingsMenu.corner[1], 0 + settingsMenu.corner[2] } - love.graphics.polygon('fill', verticies) - - -- Draw settingsMenu image background + -- Alias the true corner coordinates for convienience + local corner = { State.camera.pos_x, State.camera.pos_y } + local unit = '' love.graphics.setColor(1, 1, 1, 1) - --love.graphics.draw(settingsMenu.titleImage, verticies[1], verticies[2]) + -- Short message and fancy graphic before the actual settings stuff + love.graphics.setColor(1, 1, 1, 1) + love.graphics.draw(settingsMenu.titleImage, corner[1], corner[2] + 375) + love.graphics.setFont(settingsMenu.smallFont) + local settingsMessage = 'Use arrow keys and enter key \nto adjust settings' + love.graphics.print(settingsMessage, corner[1] + 50, corner[2] + 500, 0, 0.5, 0.5) + + -- Begin actual settings stuff + for i = 0, 1 do + -- Display current selection in gold, or green if currently setting the setting + if i + 1 == settingsMenu.selection then + if settingsMenu.ready then + love.graphics.setColor(1, 0, 0, 1) + else + love.graphics.setColor(255, 215, 0, 1) + end + else + love.graphics.setColor(1, 1, 1, 1) + end + + -- Draw settings + + -- Give appropriate unit to the setting + if settingsMenu.options[i + 1].name == 'Resolution' then + unit = 'x' + elseif settingsMenu.options[i + 1].name == 'Volume' then + unit = '%' + end + + love.graphics.setFont(settingsMenu.bigFont) + love.graphics.print(settingsMenu.options[i + 1].name, corner[1] + 50, corner[2] + 50 + (200 * i)) + love.graphics.setFont(settingsMenu.smallFont) + love.graphics.print(settingsMenu.options[i + 1].value .. unit, corner[1] + 50, corner[2] + 150 + (200 * i)) + end end settingsMenu.update = function(dt) - -- nothing for now! + -- Nothing for now! end return settingsMenu diff --git a/menu/shipMenu.lua b/menu/shipMenu.lua index b104701..9e709dc 100644 --- a/menu/shipMenu.lua +++ b/menu/shipMenu.lua @@ -56,7 +56,7 @@ end ship_menu.load = function() -- Yes, these are global variables. They will be unloaded when the ship_menu is dismissed. - ship_menu.titleImage = love.graphics.newImage("assets/sprites/ship_menu/ship_menu.png") + ship_menu.titleImage = love.graphics.newImage("assets/sprites/menu_images/ship_menu.png") State.menu.blink = true ship_menu.shipSelect = State.activeShip @@ -84,18 +84,9 @@ ship_menu.draw = function() -- Alias the true corner coordinates for convienience local corner = { State.camera.pos_x, State.camera.pos_y } - -- Transparent red background - love.graphics.setColor(0.1, 0.0, 0.0, 0.6) - local verticies = { - 0 + corner[1], 0 + corner[2], - 0 + corner[1], 600 + corner[2], - 800 + corner[1], 600 + corner[2], - 800 + corner[1], 0 + corner[2] } - love.graphics.polygon('fill', verticies) - -- Draw ship_menu image background love.graphics.setColor(1, 1, 1, 1) - love.graphics.draw(ship_menu.titleImage, verticies[1], verticies[2]) + love.graphics.draw(ship_menu.titleImage, corner[1], corner[2]) -- Draw text if State.menu.blink then diff --git a/services/camera.lua b/services/camera.lua index 77dd72e..abc1913 100644 --- a/services/camera.lua +++ b/services/camera.lua @@ -12,8 +12,7 @@ State.camera.pos_y = 0 * .5 State.camera.rotation = 0 State.camera.scale_x = 1 State.camera.scale_y = 1 -State.camera.window_width, State.camera.window_height = 800, 800 -State.camera.play_area_width, State.camera.play_area_height = 800, 800 +State.camera.window_width, State.camera.window_height = 800, 600 local window_width = State.camera.window_width local window_height = State.camera.window_height @@ -45,6 +44,16 @@ local move = function(dx, dy) State.camera.pos_y = State.camera.pos_y + (dy or 0) end +local resize = function(dx) + State.camera.scale_x = dx + State.camera.scale_y = dx + + State.camera.window_width = 800 * dx + State.camera.window_height = 600 * dx + love.window.updateMode(State.camera.window_width, State.camera.window_height) +end + + local rotate = function(dr) State.camera.rotation = State.camera.rotation + dr end @@ -77,6 +86,7 @@ return { get_boundary_top = get_boundary_top, get_position = get_position, move = move, + resize = resize, rotate = rotate, set = set, set_position = set_position, diff --git a/services/save.lua b/services/save.lua index 05ff688..01a9063 100644 --- a/services/save.lua +++ b/services/save.lua @@ -1,6 +1,7 @@ local state = require('services/state') local Serialize = require('lib/serialize') local timer = require('services/timer') +local camera = require('services/camera') local save = {} @@ -29,6 +30,9 @@ save.read = function() state.credits = data.credits or 0 timer.timesTable = data.times or {} state.activeShip = data.lastShip or 1 + camera.resize(data.windowScale or 1) + state.volume = data.volume or 1; love.audio.setVolume(state.volume) + -- Check for errors else @@ -49,6 +53,8 @@ save.write = function() data.credits = state.credits data.times = timer.timesTable data.lastShip = state.activeShip + data.windowScale = state.camera.scale_x + data.volume = state.volume -- Serialize data local serializedData = Serialize(data) diff --git a/services/sounds.lua b/services/sounds.lua index 9c7344a..91a8072 100644 --- a/services/sounds.lua +++ b/services/sounds.lua @@ -5,8 +5,8 @@ sounds.engine = love.audio.newSource('/assets/sounds/engine_normal.mp3', 'stream sounds.braking = love.audio.newSource('/assets/sounds/engine_braking.mp3', 'stream') sounds.chirp_up = love.audio.newSource('/assets/sounds/chirp_up.mp3', 'stream') sounds.chirp_down = love.audio.newSource('/assets/sounds/chirp_down.mp3', 'stream') - sounds.menu_click = love.audio.newSource('/assets/sounds/Flashpoint001d.flac', 'stream') +sounds.boop = love.audio.newSource('/assets/sounds/boop.mp3', 'stream') --[[ Flashpoint001d.flac diff --git a/services/state.lua b/services/state.lua index efe1d8e..f659a4f 100644 --- a/services/state.lua +++ b/services/state.lua @@ -19,6 +19,8 @@ State.seconds = 0 -- Keep track of map times. State.lastCompletedTime = 0 State.world = love.physics.newWorld(0, 0) +State.volume = 1 + State.world:setCallbacks(world.begin_contact_callback, world.end_contact_callback, world.pre_solve_callback, nil) diff --git a/systems/CompleteLevel.lua b/systems/CompleteLevel.lua index 3e35f1b..8dc76b3 100644 --- a/systems/CompleteLevel.lua +++ b/systems/CompleteLevel.lua @@ -16,8 +16,6 @@ return System( State.paused = true love.audio.stop() love.audio.play(Sounds.chirp_up) - Menu.state.map_select = true - Menu.state.ship_select = false Menu.load() Map.loadMap(-1) end diff --git a/systems/DebugPlayer.lua b/systems/DebugPlayer.lua index 4bf7f04..54234b4 100644 --- a/systems/DebugPlayer.lua +++ b/systems/DebugPlayer.lua @@ -21,6 +21,7 @@ local function debug(entity) print('=================================') end if State.debugOn then + love.graphics.setNewFont('assets/gnevejpixel.ttf', 30) local pos_x = State.camera.pos_x local pos_y = State.camera.pos_y love.graphics.setColor({ 1, 1, 1, 1 }) @@ -46,10 +47,12 @@ local function debug(entity) love.graphics.setColor({ 1, 1, 1, 1 }) -- Added this line to fix sprite drawing as red - J.R.C 2/2/22 -- Window debug information + love.graphics.setColor({ 1, 0, 1, 1 }) + love.graphics.line(pos_x, pos_y + 300, pos_x + 800, pos_y + 300) + love.graphics.line(pos_x + 400, pos_y, pos_x + 400, pos_y + 600) + love.graphics.setColor({ 1, 1, 1, 1 }) - love.graphics.circle('fill', 400 + State.camera.pos_x, State.camera.pos_y + 400, 5) - love.graphics.setColor({ 0, 0, 1, 1 }) - love.graphics.line(pos_x, pos_y + (State.camera.window_height / 2), pos_x + State.camera.window_width, pos_y + State.camera.window_height / 2) + love.graphics.circle('fill', 400 + State.camera.pos_x, 300 + State.camera.pos_y, 5) end end From 17412f90d05651479b84eefcbda3b41aa9cb7d2b Mon Sep 17 00:00:00 2001 From: Trevor Corcoran Date: Thu, 3 Mar 2022 23:29:56 -0500 Subject: [PATCH 5/9] Appease the almighty luacheck --- menu/menu.lua | 6 ------ menu/settingsMenu.lua | 2 +- menu/shipMenu.lua | 2 +- services/state.lua | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/menu/menu.lua b/menu/menu.lua index 89be364..fa3c37b 100644 --- a/menu/menu.lua +++ b/menu/menu.lua @@ -276,12 +276,6 @@ menu.update = function(dt) menu.blinkTimer = 0 State.menu.blink = not State.menu.blink end - - if State.menu.state == 'ship_select' then - shipMenu.update(dt) - elseif State.menu.state == 'settings' then - settingsMenu.update(dt) - end end return menu diff --git a/menu/settingsMenu.lua b/menu/settingsMenu.lua index 3de1826..22188b0 100644 --- a/menu/settingsMenu.lua +++ b/menu/settingsMenu.lua @@ -180,7 +180,7 @@ settingsMenu.draw = function() end end -settingsMenu.update = function(dt) +settingsMenu.update = function() -- Nothing for now! end diff --git a/menu/shipMenu.lua b/menu/shipMenu.lua index 9e709dc..9be1218 100644 --- a/menu/shipMenu.lua +++ b/menu/shipMenu.lua @@ -285,7 +285,7 @@ ship_menu.draw = function() end end -ship_menu.update = function(dt) +ship_menu.update = function() -- nothing for now! end diff --git a/services/state.lua b/services/state.lua index f659a4f..95f5d62 100644 --- a/services/state.lua +++ b/services/state.lua @@ -3,7 +3,7 @@ local world = require('services/world') local State = {} State.paused = true -State.debugOn = true +State.debugOn = false State.activeMap = -1 State.menu = {} -- Initialized in /menu/menu.lua From 6cc1102ad834d5824bc8c11cf4ea392c38418b09 Mon Sep 17 00:00:00 2001 From: Trevor Corcoran Date: Fri, 4 Mar 2022 22:27:33 -0500 Subject: [PATCH 6/9] Appeased the almighty unit tests --- lib/love.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/love.lua b/lib/love.lua index 90052db..e86e79f 100644 --- a/lib/love.lua +++ b/lib/love.lua @@ -64,6 +64,7 @@ local base64 = { love.audio = {} love.audio.newSource = function() end love.audio.play = function() end +love.audio.setVolume = function() end love.data = {} love.data.decode = function(container, format, str) @@ -245,5 +246,6 @@ love.physics.setMeter = function() end love.window = {} love.window.setMode = function() end +love.window.updateMode = function() end return love From 387738c1b785aa07dac5e9cead519873d97bbea4 Mon Sep 17 00:00:00 2001 From: Trevor Corcoran Date: Fri, 4 Mar 2022 23:54:32 -0500 Subject: [PATCH 7/9] Added menu navigation bar. --- assets/sprites/menu.png~ | Bin 20909 -> 0 bytes assets/sprites/menu_images/menu.png | Bin 20909 -> 20802 bytes assets/sprites/menu_images/menu_bar.png | Bin 0 -> 1127 bytes assets/sprites/menu_images/settings_menu.png~ | Bin 20245 -> 0 bytes menu/menu.lua | 15 +++++-- menu/settingsMenu.lua | 42 +++++++++++++----- 6 files changed, 41 insertions(+), 16 deletions(-) delete mode 100644 assets/sprites/menu.png~ create mode 100644 assets/sprites/menu_images/menu_bar.png delete mode 100644 assets/sprites/menu_images/settings_menu.png~ diff --git a/assets/sprites/menu.png~ b/assets/sprites/menu.png~ deleted file mode 100644 index 2e6aaa67d900350dc9edc3689669f5fe85eb9672..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20909 zcmeHu2|Sc*`~R3!V^n7-l#;QF4r6vICS|RJw2~$Jk|mNYMrlEeN)#$Zk&1|tLYqjN z5?Um6+@l# z5@xu!F{dJy3F<7Jmp5Z`MC_(p87sCW=4v0>n>cGh=B~(Px0d?!xxSa|P|8=r?2_J3 z|1xQKQ|evsMD562h1#TjpHF=De0Pnhb&+(Z*8sKm?Rz(+1sB_DQr|2Jnq7jEjW_`sdLdU$*=x671l^@Wq_%a{G6|eM8_$psm{p@rp!*6Q-4QJVC z153<_@pDa?aaNT~mY_A^muU@?zID}KNcc(*L2rBAzkJ8dMj?X1Kx33vot)!P;-sKH z@PUA*{zh*UN<{|wQpKLK4f*WI?)CW=*Ss-wy?j|2xRzGV;>WU1OjQSbwWFqLPxH_hX`Gf zE~DKD>Z7d$f<3guvD%m*^)V%Coc?3&SdJz&8#tnXps@=!2r}e!%f$9AV+x3LXh)QC z1&tvfsX-Ic$rc$7R*eZFA(|0HWBqK|BoGKxbvkXl$ymFw0i(m=8-YIdM<&sTR0>s% zMuu-PkwBwS)!~>#qryXK|gDp`V8H=Ti63T7hoO8Mo2_z!Xo&A{+4sZPaQ5`EMPZTe(b&L~ z=~xPZN~b!2H4Zcq`v}+~kpLPQFh)5(kkn9OI zBwHHr3)uk!sdk7mDv*zyQ*EjCG!k+Ri)a8eKoNq2WHWk!+ntSsCk8}pVPm2rfdL^x z0%~C#5j;u;UXecn(QY&+X;cUXB7y{1w}ozGDwSkIA(F{t>c8L^y@o)cV`&gfGy=(n z=s`hxFrwY40{A7-fJ+(~3o%V6+93uZ*GF-T zM*=W_TVRd|5l;Zq)PV$hKsJUHXd!}13Lrvk2A6;#qyHw5hzx`en@Re3^la7kJa(~Q z0uV;E1H;A!A;z#d1EPONJllU0g<}zJ{#E)o;dC&a@aLkbU>du2PL%$~!htjPn2F-C zKVk+PPWr8Apqc^{+w%O0^aFb+5SA1y5_*XHz-y!2r~w`>Hyqv|j?^g-c;G(=sx1f{ z^B$rODL*6{1SAQH7z`#rtf>7+1X&%FsX^{hC`kT6+)?Rl0dx>R;EVv%cv{IwxT}vM zWYe>kJVuD4(Ga76fk=^M4};L;IDVWOE;2H30=;QmY*eIra=}f|MIWz? zqm0MMZwVRm8WPP&#_91wC50l!z@IoJ`7I6~}T5IeeQ>X2dVd4-K(Y$_l^ zDFb)dAyWZ`4962@0!R^r`|$>H0uI54;9+AUjnz=fsCgV5P&JX5v!O!v{~)*7ru^xA z$Ey`cwHWmplHWFDq)re;d(6?LRvET||Fw%tUd&D`;Z3KR^3V2>PqWOhoygKr~Uq zUpYf;`DYS5af5n)8 zylH>mn17yW6K(k)OOc6m{D~G>M!Nxz5RL_X2GbaX}IPLCju5{9W;8`IU{JhxVyW{+mm2RJU>yM2ze;iRwdiU+o!}~;4G(QH1XE0HGKM(#PBqV#I zb=n>5w8uGyY-;V<{XTS?wLM0?Z@tV^SL1OPbItKA)HcJ(cC8f$XF49a8W^Fwnr8}Q z4ZqP`hS9v*Xo6|*3cPc9=bWirUx&sCbkAYQY8b1iw+k?I%#chqzPZr`^zFqdIOV?g*aNbOsEG~u!xFO@ivoTpW^xjku zAimzJl4pXjV6GA~JzBP2qCkc#)i|4Re$xI<{gUfTy?I?-L_1c3wdefPoKA3cF(#vr zPseA-h;+|b#Wf3;z9Cr*V5K%~PEqICwFcWy1YIkynJ4M;h|vwLM_|p_5mU({W+fia z?B12Pt)uMmySAAxG-A05QK1rObQ!<-7CpR>uKXo$MIP~{4Ail0lAu7Koy^f1YAJ}p zi~L&Lsjm~0z~!wYmx(gH^C2VpIWxn6+tmnz!3)HhY?tNBQQ@ZhCMi5q)>6Le;N3So zhMZ!VC}Ml7vBa^D=ngI!_;ZXeiZ7*|SsDnHp(+A?vi|YwDlI@(48uCRyZP`h0mi#B zeU>7|Zx;5ey?E8vS))xGISuEZ5&|2l`S@h#&|~j z0E54uzI{2@e@rH7%P&07<6~AbPzJgeWjL(DV18U6uRAK#4vp3)x=0A|Y{N5OOd4mF z>`WZvkV)76aklZ@ozLse_(=tq&!1HMqykCcp9#V(IDefA(Zd6&?1I&Cn&EXj^@EC0 zMG{g1lQ;44rEXe%5lU6^dUWXw$^5_~<$cjfvvtdh#qCw+`XP5xcTuTPZ`I~S8G9*DYS>xF-g{Tef zslqshsX^C1q`g&emgWx0@$dihwSJ z`WjgCxC~~~3V*(;gO63S1%&Yx%RtJ$NcVC?%6X7tzW#AOba^iUvEz;u*U)v?^yu7e zFQ*}}G^dVM+)#Hw?PDwPXcsE9S1_IF6B6|(2Cf&*G?sW`dTNiwGk;9A2#y=^N<5CQr}TSIlR7<`n4 z=x$_E4K+i%Ggix8l!UAE#9(6N=X8Vqe`#WLN??A~O1L6@ZyA#z3A485g&cKZuE9?G z0e;LL!Ze=voj4q0=u&x`J`cVWz+WbMo4|wLzZBr#QA(6S;3rAHnc|bU3taM12*+q^ z&RoxvRtRJST9^|XW*QN3nWe@dWfyKIRiL_Wp0~aS{ ziZTUo9fbh*>#r!TFeXC-mJ!GEPK<*F0sr=!D2km3Z29=(u$+0kX*JhF`~j+XW`D3C z3V2`?^Vc%#vj(WrZKC~5EPxJ7$ z0p5op(+{xi7RKcBEg4-m681u9PC2xUrvaA^D$d1J}XNy-412^)&`t{9}e&4Kdl?jn30rC%j={+Q)ozkDlra4@d7I+ywLa>eeA{xXfRUIz)5T z*R3=SZMy3vxhN?4OeMjMGdfgbau`cv``5Zp2BE2`IK!brsfQ>zL9Zlm zdp5}wi;-K9H=x7383&6+8Gw_#5rXS-bqXuR>+L$p^>s-Cvcfn`;ic@Gn3-VnOlx&= zI8(_$*x@*?V;_KKZKtjP3gqz2T-U-OjZJG06=mM=pLx^-LQ<&WE!dV0(SMF_?cqGZ z^h3{$E=)q#LCzFpM>{NKjxphQ(orV1-+$oI@tbpCQEI*$sCooz&4jD+x@O0jE3Rf- zel8qZEr5}{Xil6Y&q!7Pl&eKwk+1Tb8MyJImq4Kl$bE6vkjXd?)UNwA{#G?U+0b-S zhP(h7v^(Ecnmq~FH-gCP#-bGf$O|EU4QV{n$4+Y1ZdB-Fm?@5%o6gKw%1}h0@^^~j z7@eZknlR`r06FXJEy@?~{&Et(_(FUT+0ScQ6e_eHVzICRjZzXemOFaU*mrnCDg244f#&p)pSZ?zJHo8r-p}1NgyFx z4I<3&<{9&~1}=_DK(i860m={l8dR|)i+%h7GRcO|63@8bTRu6);lgecq|~TFH&v+y z1x7NWPKlDY{Sd_eG9>=t9#(%*^?gMFpS6r5sppj!?eiDFdoya}z^P}!zh@cVPzLfK zaq>R+UiNBCN$hf2H*SIo%@oM@Iq#~xsV|5>CSoZ?4`wHE@Qk<@WfhaL6+Dpl^vY!$ zzSQGg4$t{9{m8`DUXVx$Rl%ko^6^?*nsgXNl#jgwg`xr$kEwi-))<(vr6HOHT|bJ8 zXd*cQ>zB|vaMV`_T}=UuoP@^?FXX3 zscA52`c4K@j6{v)oL@%6`rwK+Y=$u20mOO_J`_Jv{$dY=lCzfa$N1mxiibg!kQ|lQ z)Fa_grOxH%e4M8ECCpx!FhT`j6cU7RNW!EadT8T{;c(>uGnoUwj|S-Sg@`=oABe$I zCb=TFf7!R-q) z^jOeREZnj=><*DVUIgWyKr1)~m5u!t5vWC~&xc4UQ zqED${Unf+R&Vee#)C84^a;0$8v;M92K}ft`hOpX!RC!QyZ#}3fW?yo?Kv8`WTxzS&saLhOz9`E)`Mv^8_7cN1bmp?~ zk#`AZPx=5Umlj0RuxO^*Izzf&WT!RUZLjfD@48#Dq&q*AI5Ua4|)Hb-gf8mKofVR z2bBqD%y+C(BbJt=SJOUA=ToHri9)x0Vt#vP_ETrQnNqUmh2H%K)59zXX^ovo`5Dbr zh8$W6e}rIERra0Ub!l})u~@1e5uYwt-5#jq-W1;K29qw&jjqxT+jChaXt9Djy_gJt z4aeN+lIOGOPS=IEtqAgWH`At;E_vd`!`QaqjY5Y&|5as?)#0Vxnv0YqKOd(A#V)JQ z3|lN;G;Eh!9BVCJz>99eWhS=lVc2yV?xbgMF}zQ8Zr&t&x&mN}+8MR;&I z6Xkk7!d~m< zecELPWIgkhYdO`|nwByWctCCCK3=WXS4l>js(tx1y-`f(a>xd+N?VH9>KElr@}E`j z-O>_05;HQlOLi*nK2Bd2`b+tQvA*6-@wFmny*DvB6LfoBSj^PY_>z>{9lw(Ec_fK{SUG~NbXnFl5D;(OwxBq^+sl9_AtgTuwa=ZS~wi`F~7Ze!HV78 z_9-TxV&)`d^gQpuePDLH@m8z9?AoP&hsWwYoTotbZ2h!Fvh@!ely8@knoX`}&Fg(2 znIDjQH0KOCZTdcd=F*qf(PQGJzV6F)F^)D=Xbbp!O^io_XK?+qE#HS*TZg|U&etqo zpgUM59agJVv`|^9eWlvgG@e`7Ue~_eQ(n5q8L!J(+Ut;~@R2 zveebm_|~YmS1CKY?{O0b?mI+__qy{XQcSEl=e%ebYg>T*pyIN!>Y7qzsn+Rl zVNmPzPD`F?hXm4@2Ml)hzYlG_P&VV<%&cHi)FR_s-^brfi02F zi{qOs(H8?}E~#`&Tdb}$`D@eOk7?7VynFyjx-Wih*p(t9tkeT9+o4T;QAZ!7$bx%18@2i=kd0K ztOLL_(u=KHZ#(CwNC$qvKMAI2R=ksHb#(D*rPPYi&Pvu5seSX4YcW^5TDn}WMR4=6 z6n`$IN;IX@|RB2K}7}M^@A^lhG5)$NDvvnCAt2upYP{} zSAldgdRxMg+M@Pm>!7ZRa>MVJu2}g}dL1NGbmZ&`>FcIsVXQ-Fz5db2%4^i;giNRl zGtOZo?G+bkxzj_OgR1pBZkMi;vs<0lYc@;S&GsHL3yaa)Vej6?el&%+u3{Qry!FZ>-xSMn!j0!IgvHv}k#s%XEuy!t7&_Q-kW+(_BOx3cHdgIZRc#UbtR56Q z%YKl4N;n4>vfVrEviJ4;FOR}Gees2icgpy_wtx^b%@a7>zNVv%}9fz1${kSF4ns)Dn8=G6U7K*4hi8RX0 zRcY%h*A%kp8CKaE?9F}Zr>|P^8moWfm}PCz)8UG8f)-6vaM|qF_9Hr&`_;6_g&8`l zBMi&*Dm~UN;cmwHEKQE*lfA7shgyEJtysE#!-(0JHNjbhlgn{ALIQT)v72#HEi!>8 z8!?>dL)N|hAJV=1 zFP!%1&LH3SYklc;>-7c)@8@@yYaV4-OEtNeY32BB+OY0!NLS*^JthLzf_KT!z|q>aklyK)=7oU2JG!XHj4y<%@Oj8?U)lZQ0aEJQZQX2-nv9?qfS^%_imvNpVrpo#PI@KsUjY=Evxm+@SCPBMK7xMB-Pvy zZMwfz<0IE;L$J@l34@;p+&c2}fD@wJ`R(Vy&rIQ#m7fPc)8S`2{LF%%S@56F zf^;K%R^~b1TpxI;Qg8Z`O@sZfBoa58Y-rg~x#iH`~jK)zuNj;qz5kRy&?o9$v?N z#QaL7;yPCUnstf!7 z%kuT-RbB;Oeu>X<%a3*Ji#@-(R5X!9ZJ)-25_NM;HJ52S~~19Ol`W?A2}3k8_*K%W~0_H zZ>#9Z+5_)}ZZ+SbbT3=Qy*28Gow}B3f)XCNA=KNYk^=)mg?ElDR&Fnv6~FmnmY7wz zUQZD%{dtoS;aS2V<64!_CFiKHXulAv1vmS`D_gDT>OHT|%0gb7@J%6!gmh zO3%_qJVpAjN5v|Mrqw?QfA6){N=fQYW8caGT(QnzKIL|4U=vHT@rK?=igm`AG4SZb zjB)RIlwsKsA#Ii3ZE~qMx?Q?NPL}2utQ%ey#-f#0W@bj>u4u>~MxKC;xuhF;0(fbu zbeM%&EzPg5^J(wSEkhr+X(~}8Z{d42tQr<-imkprbTRo_b!Ddf3;Yc39n6b0H{~`2 z3h!)Z`jLVS!dN?WFvs3pXp`LZSi$Py)ZHaZuM}9;Ub%LxaFK40$@NE88Zw;sdUK7y zvv(+4c-M+^Kc#& zR`VO1b5zW<%fD)t>-A(_6d4hZx7;kEO2k;-y$m6OfP zFBgsbU=qesy|+ZtBWmvBtZ2`w!nqa>8*J0K#G5I@*4J*w8yiEm18I5L!o&j^dS4>m z_nq;3Rn;n_`F-W!Q5zEd2*+Z&hmI=HCL*|Gf}(D(<+R$XW{GF_EzEL zr5>f-nc@CHuDaMX-WKE-dr>-YHr-nC>*m ziTiFeAQXwoK6+0}QAsK*Jf(sDea?X7#`<^J*&FQyBfmIgAN%GF`EgumalLuSlK@U= z;P9R~4DS$&hG$12XrDYHP8AoJ++nS?Jn$g1x+XHj>h;2UG282zCe5VT9MVJUG3m_b zxz9}m{B_9Rt|TN#UVqtIviL#s-j7vPO;>=x*Ufj&e=6)PyISggGn8ude3v`nyItpmW4zwrhKmH73*7e{l1@n7?x;>1!SR{Z`njrHK=# z-{D2erStH(I(fRVRLh&&`0F-axYfC@=#;Q&@gLk~NqWrx((>u4lXB1v1trOm>f{Bp zdG8~IZiXH7Di~?gB$JrZZP0a)Q2wM}(dwYim7@8*tTPcP;k7Ie;4m|~v?or|X)tff z^akT`6?Oqcgo4S?q|?INf`ek-L_H9+f1{YA7+}}BL{iA8=t{Optfa%>V~q01@nAdl zmfxt$2#K)c=@y)qB+=N^Y|`kbZLxRl^1<2D->H|atBHt$@GI!JG~6ANRr4%cm%Ez4 zJYNV;6G-nDKGKtGsilu(qz4BLym0CJY$D>nB5Y=(t*BW$x7I<5JA`7Sv^E9Pf=8Ab n@$!)epBvf#{~lCGhmK4&vYLEWOx0cn1s?+)qve^}*1P^6MTV&P diff --git a/assets/sprites/menu_images/menu.png b/assets/sprites/menu_images/menu.png index 2e6aaa67d900350dc9edc3689669f5fe85eb9672..8446486344ec5b3f9aa2597cc9d411fc7e19b59c 100644 GIT binary patch literal 20802 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 diff --git a/assets/sprites/menu_images/menu_bar.png b/assets/sprites/menu_images/menu_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..af6fa66803f50315316c05106fc6daab2d1cd944 GIT binary patch literal 1127 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 diff --git a/menu/menu.lua b/menu/menu.lua index fa3c37b..9cde540 100644 --- a/menu/menu.lua +++ b/menu/menu.lua @@ -73,6 +73,7 @@ end menu.load = function() -- Yes, these are global variables. They will be unloaded when the menu is dismissed. menu.titleImage = love.graphics.newImage("/assets/sprites/menu_images/menu.png") + menu.barImage = love.graphics.newImage("/assets/sprites/menu_images/menu_bar.png") menu.blinkTimer = 0 if State.activeMap ~= -1 then menu.mapSelect = State.activeMap @@ -105,6 +106,7 @@ end menu.unload = function() menu.titleImage = nil + menu.barImage = nil menu.blinkTimer = nil menu.mapSelect = nil menu.threeBest = nil @@ -238,25 +240,30 @@ menu.draw = function() -- Draw text if State.menu.blink then - love.graphics.print(State.credits, menu.corner[1] + 700, menu.corner[2] + 30) + love.graphics.print(State.credits, menu.corner[1] + 700, menu.corner[2] + 70) -- Highlight map name in red if it is the active map. if menu.mapSelect == State.activeMap then love.graphics.setColor(1, 0, 0.25, 1) end love.graphics.setFont(menu.bigFont) - love.graphics.print(mapList[menu.mapSelect].displayName, menu.corner[1] + 55, menu.corner[2] + 420) + love.graphics.print(mapList[menu.mapSelect].displayName, menu.corner[1] + 55, menu.corner[2] + 410) love.graphics.setColor(1, 1, 1, 1) end love.graphics.setFont(menu.bigFont) - love.graphics.print('SPACE RACE', menu.corner[1] + 25, menu.corner[2] + 100) + love.graphics.print('SPACE RACE', menu.corner[1] + 25, menu.corner[2] + 110) love.graphics.setFont(menu.smallFont) - love.graphics.print('Credits: ', menu.corner[1] + 550, menu.corner[2] + 30) + love.graphics.print('Credits: ', menu.corner[1] + 550, menu.corner[2] + 70) -- Draw best times and current time. displayTime() + -- Display navigation bar + love.graphics.draw(menu.barImage, menu.corner[1], menu.corner[2]) + love.graphics.setColor(1, 1, 1, 1) + love.graphics.print('Settings >>', menu.corner[1] + 690, menu.corner[2] + 8, 0, 0.5, 0.5) + -- Draw ship select Menu elseif State.menu.state == 'ship_select' then shipMenu.draw() diff --git a/menu/settingsMenu.lua b/menu/settingsMenu.lua index 22188b0..a2364c1 100644 --- a/menu/settingsMenu.lua +++ b/menu/settingsMenu.lua @@ -81,15 +81,22 @@ settingsMenu.enter = function() end settingsMenu.escape = function() - -- Alternate way of leaving settings menu - settingsMenu.ready = false - settingsMenu.updateSettings() - save.write() - State.menu.state = 'map_select' + -- Alternate way of unreadying/leaving settings menu + if settingsMenu.ready == true then + settingsMenu.ready = false + settingsMenu.updateSettings() + elseif settingsMenu.ready == false then + love.audio.stop(sounds.menu_click) + love.audio.play(sounds.menu_click) + State.menu.state = 'map_select' + save.write() + end end settingsMenu.updateSettings = function() - camera.resize(settingsMenu.options[1].value) + if settingsMenu.options[1].value ~= State.camera.scale_x then + camera.resize(settingsMenu.options[1].value) + end State.volume = settingsMenu.options[2].value / 100 love.audio.setVolume(State.volume) @@ -104,8 +111,10 @@ end settingsMenu.load = function() settingsMenu.titleImage = love.graphics.newImage("/assets/sprites/menu_images/settings_menu.png") - settingsMenu.smallFont = love.graphics.newFont('assets/gnevejpixel.ttf', 60) + settingsMenu.barImage = love.graphics.newImage("/assets/sprites/menu_images/menu_bar.png") settingsMenu.bigFont = love.graphics.newFont('assets/gnevejpixel.ttf', 90) + settingsMenu.mediumFont = love.graphics.newFont('assets/gnevejpixel.ttf', 60) + settingsMenu.smallFont = love.graphics.newFont('assets/gnevejpixel.ttf', 30) settingsMenu.selection = 1 settingsMenu.ready = false @@ -128,11 +137,14 @@ settingsMenu.load = function() end settingsMenu.unload = function() - settingsMenu.font = nil + settingsMenu.bigFont = nil + settingsMenu.mediumFont = nil + settingsMenu.smallFont = nil settingsMenu.options = nil settingsMenu.selection = nil settingsMenu.ready = nil settingsMenu.titleImage = nil + settingsMenu.barImage = nil end @@ -147,7 +159,7 @@ settingsMenu.draw = function() -- Short message and fancy graphic before the actual settings stuff love.graphics.setColor(1, 1, 1, 1) love.graphics.draw(settingsMenu.titleImage, corner[1], corner[2] + 375) - love.graphics.setFont(settingsMenu.smallFont) + love.graphics.setFont(settingsMenu.mediumFont) local settingsMessage = 'Use arrow keys and enter key \nto adjust settings' love.graphics.print(settingsMessage, corner[1] + 50, corner[2] + 500, 0, 0.5, 0.5) @@ -174,10 +186,16 @@ settingsMenu.draw = function() end love.graphics.setFont(settingsMenu.bigFont) - love.graphics.print(settingsMenu.options[i + 1].name, corner[1] + 50, corner[2] + 50 + (200 * i)) - love.graphics.setFont(settingsMenu.smallFont) - love.graphics.print(settingsMenu.options[i + 1].value .. unit, corner[1] + 50, corner[2] + 150 + (200 * i)) + love.graphics.print(settingsMenu.options[i + 1].name, corner[1] + 50, corner[2] + 60 + (210 * i)) + love.graphics.setFont(settingsMenu.mediumFont) + love.graphics.print(settingsMenu.options[i + 1].value .. unit, corner[1] + 50, corner[2] + 160 + (210 * i)) end + + -- Draw navigation bar + love.graphics.setFont(settingsMenu.smallFont) + love.graphics.draw(settingsMenu.barImage, corner[1], corner[2]) + love.graphics.setColor(1, 1, 1, 1) + love.graphics.print('<< Main Menu ', corner[1] + 10, corner[2] + 8, 0, 0.5, 0.5) end settingsMenu.update = function() From e9f07ba4104d3198c7e0d304d39410434f2d3b10 Mon Sep 17 00:00:00 2001 From: Trevor Corcoran Date: Mon, 7 Mar 2022 21:44:51 -0500 Subject: [PATCH 8/9] Simplified menu key mapping; every menu has its own key_map now. --- main.lua | 4 +- menu/menu.lua | 67 ++++++------------ menu/settingsMenu.lua | 157 +++++++++++++++++++++--------------------- menu/shipMenu.lua | 46 ++++++++----- 4 files changed, 129 insertions(+), 145 deletions(-) diff --git a/main.lua b/main.lua index cb696af..8853d5f 100644 --- a/main.lua +++ b/main.lua @@ -33,9 +33,7 @@ end -- Game time love.keypressed = function(pressed_key) if State.paused then - if menu.key_map[pressed_key] then - menu.key_map[pressed_key]() - end + menu.current_menu_keys(pressed_key) else if keyboard.key_map[pressed_key] then keyboard.key_map[pressed_key]() diff --git a/menu/menu.lua b/menu/menu.lua index 9cde540..84d0f4d 100644 --- a/menu/menu.lua +++ b/menu/menu.lua @@ -117,16 +117,21 @@ menu.unload = function() settingsMenu.unload() end +menu.current_menu_keys = function(pressed_key) + -- Prioritize current menu's key_map, otherwise fall back on main menu key_map + if State.menu.state == 'ship_select' and shipMenu.key_map[pressed_key] then + shipMenu.key_map[pressed_key]() + elseif State.menu.state == 'settings' and settingsMenu.key_map[pressed_key] then + settingsMenu.key_map[pressed_key]() + elseif menu.key_map[pressed_key] then + menu.key_map[pressed_key]() + end +end + menu.key_map = { escape = function() - if State.menu.state == 'map_select' then - save.write() - love.event.quit() - elseif State.menu.state == 'ship_select' then - State.menu.state = 'map_select' - elseif State.menu.state == 'settings' then - settingsMenu.escape() - end + save.write() + love.event.quit() end, o = function() -- Become Mr. Krabs and get all the money @@ -145,52 +150,24 @@ menu.key_map = { end end, up = function() - if State.menu.state == 'map_select' then - menu.up() - elseif State.menu.state == 'settings' then - settingsMenu.up() - end + menu.up() end, down = function() - if State.menu.state == 'map_select' then - menu.down() - elseif State.menu.state == 'settings' then - settingsMenu.down() - end - end, - left = function() - if State.menu.state == 'ship_select' then - shipMenu.left() - elseif State.menu.state == 'settings' then - settingsMenu.left() - end + menu.down() end, right = function() - if State.menu.state == 'map_select' then - State.menu.state = 'settings' - love.audio.stop(sounds.menu_click) - love.audio.play(sounds.menu_click) - elseif State.menu.state == 'ship_select' then - shipMenu.right() - elseif State.menu.state == 'settings' then - settingsMenu.right() - end - end, - backspace = function() - if State.menu.state == 'ship_select' then - State.menu.state = 'map_select' - end + State.menu.state = 'settings' + love.audio.stop(sounds.menu_click) + love.audio.play(sounds.menu_click) end, ['return'] = function() - if State.menu.state == 'map_select' then - State.menu.state = 'ship_select' - elseif State.menu.state == 'ship_select' then + if State.menu.state == 'ship_select' then shipMenu.load_ship() menu.load_map() - elseif State.menu.state == 'settings' then - settingsMenu.enter() + else + State.menu.state = 'ship_select' end - end, + end } menu.load_map = function() diff --git a/menu/settingsMenu.lua b/menu/settingsMenu.lua index a2364c1..79b5368 100644 --- a/menu/settingsMenu.lua +++ b/menu/settingsMenu.lua @@ -7,91 +7,86 @@ local settingsMenu = {} -- Next section: Actions -settingsMenu.up = function() - -- Loop up the list of settings - settingsMenu.selection = settingsMenu.selection + 1 - if settingsMenu.selection > #settingsMenu.options then - settingsMenu.selection = 1 - end - - settingsMenu.ready = false - - love.audio.stop(sounds.boop) - love.audio.play(sounds.boop) -end - -settingsMenu.down = function() - -- Loop down the list of settings - settingsMenu.selection = settingsMenu.selection - 1 - if settingsMenu.selection < 1 then - settingsMenu.selection = #settingsMenu.options - end - - settingsMenu.ready = false - - love.audio.stop(sounds.boop) - love.audio.play(sounds.boop) -end - -settingsMenu.left = function() - -- Decrement settings value, else if player is not entering values leave the settings menu. - - -- If setting a setting, set the setting with the setting set - if settingsMenu.ready then - -- Change value and take a sanity check - local setting = settingsMenu.options[settingsMenu.selection] - setting.value = setting.value - setting.increment - if setting.value < setting.min then - setting.value = setting.min +settingsMenu.key_map = { + up = function() + -- Loop up the list of settings + settingsMenu.selection = settingsMenu.selection + 1 + if settingsMenu.selection > #settingsMenu.options then + settingsMenu.selection = 1 end - - -- Play essential sound effects + + settingsMenu.ready = false + love.audio.stop(sounds.boop) love.audio.play(sounds.boop) - else - -- If not setting a setting, leave - love.audio.stop(sounds.menu_click) - love.audio.play(sounds.menu_click) - State.menu.state = 'map_select' - save.write() - end -end - -settingsMenu.right = function() - -- If player is entering values, increment settings value - if settingsMenu.ready then - local setting = settingsMenu.options[settingsMenu.selection] - setting.value = setting.value + setting.increment - if setting.value > setting.max then - setting.value = setting.max + end, + down = function() + -- Loop down the list of settings + settingsMenu.selection = settingsMenu.selection - 1 + if settingsMenu.selection < 1 then + settingsMenu.selection = #settingsMenu.options end - + + settingsMenu.ready = false + love.audio.stop(sounds.boop) love.audio.play(sounds.boop) + end, + left = function() + -- Decrement settings value, else if player is not entering values leave the settings menu. + + -- If setting a setting, set the setting with the setting set + if settingsMenu.ready then + -- Change value and take a sanity check + local setting = settingsMenu.options[settingsMenu.selection] + setting.value = setting.value - setting.increment + if setting.value < setting.min then + setting.value = setting.min + end + + -- Play essential sound effects + love.audio.stop(sounds.boop) + love.audio.play(sounds.boop) + else + -- If not setting a setting, leave + settingsMenu.backToMainMenu() + end + end, + right = function() + -- If player is entering values, increment settings value + if settingsMenu.ready then + local setting = settingsMenu.options[settingsMenu.selection] + setting.value = setting.value + setting.increment + if setting.value > setting.max then + setting.value = setting.max + end + + love.audio.stop(sounds.boop) + love.audio.play(sounds.boop) + end + end, + escape = function() + -- Alternate way of unreadying/leaving settings menu + if settingsMenu.ready == true then + settingsMenu.ready = false + settingsMenu.updateSettings() + elseif settingsMenu.ready == false then + settingsMenu.backToMainMenu() + end + end, + backspace = function() + -- Another alternate way to leave settings menu + settingsMenu.key_map.escape() + end, + ['return'] = function() + -- Player must press enter to enable setting changes + settingsMenu.ready = not settingsMenu.ready + + if settingsMenu.ready == false then + settingsMenu.updateSettings() + end end -end - -settingsMenu.enter = function() - -- Player must press enter to enable setting changes - settingsMenu.ready = not settingsMenu.ready - - if settingsMenu.ready == false then - settingsMenu.updateSettings() - end -end - -settingsMenu.escape = function() - -- Alternate way of unreadying/leaving settings menu - if settingsMenu.ready == true then - settingsMenu.ready = false - settingsMenu.updateSettings() - elseif settingsMenu.ready == false then - love.audio.stop(sounds.menu_click) - love.audio.play(sounds.menu_click) - State.menu.state = 'map_select' - save.write() - end -end +} settingsMenu.updateSettings = function() if settingsMenu.options[1].value ~= State.camera.scale_x then @@ -106,6 +101,12 @@ settingsMenu.updateSettings = function() settingsMenu.ready = false -- Don't ask end +settingsMenu.backToMainMenu = function() + love.audio.stop(sounds.menu_click) + love.audio.play(sounds.menu_click) + State.menu.state = 'map_select' + save.write() +end -- Next section: Loading diff --git a/menu/shipMenu.lua b/menu/shipMenu.lua index 9be1218..b4ab561 100644 --- a/menu/shipMenu.lua +++ b/menu/shipMenu.lua @@ -33,26 +33,34 @@ local function get_right() return shipList[right_index] end -ship_menu.right = function() - - if ship_menu.shipSelect >= #shipList then - ship_menu.shipSelect = 1 - else - ship_menu.shipSelect = ship_menu.shipSelect + 1 - end - love.audio.stop() - love.audio.play(sounds.menu_click) -end - -ship_menu.left = function() - if ship_menu.shipSelect <= 1 then - ship_menu.shipSelect = #shipList - else - ship_menu.shipSelect = ship_menu.shipSelect - 1 +ship_menu.key_map = { + escape = function() + -- Go back to main menu + State.menu.state = 'map_select' + end, + backspace = function() + -- See above + State.menu.state = 'map_select' + end, + right = function() + if ship_menu.shipSelect >= #shipList then + ship_menu.shipSelect = 1 + else + ship_menu.shipSelect = ship_menu.shipSelect + 1 + end + love.audio.stop() + love.audio.play(sounds.menu_click) + end, + left = function() + if ship_menu.shipSelect <= 1 then + ship_menu.shipSelect = #shipList + else + ship_menu.shipSelect = ship_menu.shipSelect - 1 + end + love.audio.stop() + love.audio.play(sounds.menu_click) end - love.audio.stop() - love.audio.play(sounds.menu_click) -end +} ship_menu.load = function() -- Yes, these are global variables. They will be unloaded when the ship_menu is dismissed. From 61c86636da6ab01718a455da5d3d40004edc2ba0 Mon Sep 17 00:00:00 2001 From: Trevor Corcoran Date: Mon, 7 Mar 2022 21:47:51 -0500 Subject: [PATCH 9/9] Almighty luacheck has received its tribute --- menu/settingsMenu.lua | 8 -------- 1 file changed, 8 deletions(-) diff --git a/menu/settingsMenu.lua b/menu/settingsMenu.lua index 79b5368..7076f50 100644 --- a/menu/settingsMenu.lua +++ b/menu/settingsMenu.lua @@ -14,9 +14,7 @@ settingsMenu.key_map = { if settingsMenu.selection > #settingsMenu.options then settingsMenu.selection = 1 end - settingsMenu.ready = false - love.audio.stop(sounds.boop) love.audio.play(sounds.boop) end, @@ -26,15 +24,12 @@ settingsMenu.key_map = { if settingsMenu.selection < 1 then settingsMenu.selection = #settingsMenu.options end - settingsMenu.ready = false - love.audio.stop(sounds.boop) love.audio.play(sounds.boop) end, left = function() -- Decrement settings value, else if player is not entering values leave the settings menu. - -- If setting a setting, set the setting with the setting set if settingsMenu.ready then -- Change value and take a sanity check @@ -43,7 +38,6 @@ settingsMenu.key_map = { if setting.value < setting.min then setting.value = setting.min end - -- Play essential sound effects love.audio.stop(sounds.boop) love.audio.play(sounds.boop) @@ -60,7 +54,6 @@ settingsMenu.key_map = { if setting.value > setting.max then setting.value = setting.max end - love.audio.stop(sounds.boop) love.audio.play(sounds.boop) end @@ -81,7 +74,6 @@ settingsMenu.key_map = { ['return'] = function() -- Player must press enter to enable setting changes settingsMenu.ready = not settingsMenu.ready - if settingsMenu.ready == false then settingsMenu.updateSettings() end