menu improvements

This commit is contained in:
Alula 2020-09-22 00:33:16 +02:00
parent 2b9bcd4fbb
commit dd9ac33185
No known key found for this signature in database
GPG Key ID: 3E00485503A1D8BA
2 changed files with 100 additions and 27 deletions

View File

@ -5,12 +5,13 @@ use crate::shared_game_state::SharedGameState;
pub enum MenuEntry {
Active(String),
Disabled(String),
Toggle(String, bool),
}
pub enum MenuSelectionResult<'a> {
None,
Canceled,
Selected(usize, &'a MenuEntry),
Selected(usize, &'a mut MenuEntry),
}
pub struct Menu {
@ -147,8 +148,7 @@ impl Menu {
batch.add_rect(self.x as f32,
self.y as f32 + 2.0 + (self.selected as f32 * 14.0),
&rect,
);
&rect);
batch.draw(ctx)?;
@ -161,6 +161,14 @@ impl Menu {
MenuEntry::Disabled(name) => {
state.font.draw_text(name.chars(), self.x as f32 + 20.0, y, &state.constants, &mut state.texture_set, ctx)?;
}
MenuEntry::Toggle(name, value) => {
let value_text = if *value { "ON" } else { "OFF" };
let val_text_len = state.font.text_width(value_text.chars(), &state.constants);
state.font.draw_text(name.chars(), self.x as f32 + 20.0, y, &state.constants, &mut state.texture_set, ctx)?;
state.font.draw_text(value_text.chars(), self.x as f32 + self.width as f32 - val_text_len, y, &state.constants, &mut state.texture_set, ctx)?;
}
}
y += 14.0;
@ -195,6 +203,7 @@ impl Menu {
if let Some(entry) = self.entries.get(self.selected) {
match entry {
MenuEntry::Active(_) => { break; }
MenuEntry::Toggle(_, _) => { break; }
_ => {}
}
} else {
@ -204,9 +213,9 @@ impl Menu {
}
if state.key_trigger.jump() && !self.entries.is_empty() {
if let Some(entry) = self.entries.get(self.selected) {
if let Some(entry) = self.entries.get_mut(self.selected) {
match entry {
MenuEntry::Active(_) => {
MenuEntry::Active(_) | MenuEntry::Toggle(_, _) => {
state.sound_manager.play_sfx(18);
return MenuSelectionResult::Selected(self.selected, entry);
}

View File

@ -1,27 +1,38 @@
use crate::common::{FadeState, Rect};
use crate::ggez::{Context, GameResult};
use crate::ggez::{Context, GameResult, graphics};
use crate::ggez::graphics::Color;
use crate::menu::{Menu, MenuEntry, MenuSelectionResult};
use crate::scene::game_scene::GameScene;
use crate::scene::Scene;
use crate::shared_game_state::SharedGameState;
use crate::text_script::TextScriptExecutionState;
#[derive(PartialEq, Eq, Copy, Clone)]
#[repr(u8)]
enum CurrentMenu {
MainMenu,
OptionMenu,
StartGame,
}
pub struct TitleScene {
tick: usize,
title_menu: Menu,
current_menu: CurrentMenu,
main_menu: Menu,
option_menu: Menu,
}
impl TitleScene {
pub fn new() -> Self {
Self {
tick: 0,
title_menu: Menu::new(0, 0, 100, 78),
current_menu: CurrentMenu::MainMenu,
main_menu: Menu::new(0, 0, 100, 5 * 14 + 6),
option_menu: Menu::new(0, 0, 140, 3 * 14 + 6),
}
}
fn new_game(&self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
state.reset();
fn start_game(&self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
let mut next_scene = GameScene::new(state, ctx, 13)?;
next_scene.player.x = 10 * 16 * 0x200;
next_scene.player.y = 8 * 16 * 0x200;
@ -84,27 +95,71 @@ impl Scene for TitleScene {
fn tick(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
if self.tick == 0 {
state.sound_manager.play_song(24, &state.constants, ctx)?;
self.title_menu.push_entry(MenuEntry::Active("Load game".to_string()));
self.title_menu.push_entry(MenuEntry::Active("New game".to_string()));
self.title_menu.push_entry(MenuEntry::Disabled("Options".to_string()));
self.title_menu.push_entry(MenuEntry::Disabled("Editor".to_string()));
self.title_menu.push_entry(MenuEntry::Active("Quit".to_string()));
self.main_menu.push_entry(MenuEntry::Active("Load game".to_string()));
self.main_menu.push_entry(MenuEntry::Active("New game".to_string()));
self.main_menu.push_entry(MenuEntry::Active("Options".to_string()));
self.main_menu.push_entry(MenuEntry::Disabled("Editor".to_string()));
self.main_menu.push_entry(MenuEntry::Active("Quit".to_string()));
self.option_menu.push_entry(MenuEntry::Toggle("Test toggle".to_string(), false));
self.option_menu.push_entry(MenuEntry::Toggle("2x Speed hack".to_string(), false));
self.option_menu.push_entry(MenuEntry::Active("Back".to_string()));
}
self.title_menu.x = ((state.canvas_size.0 - self.title_menu.width as f32) / 2.0).floor() as isize;
self.title_menu.y = ((state.canvas_size.1 + 70.0 - self.title_menu.height as f32) / 2.0).floor() as isize;
self.main_menu.x = ((state.canvas_size.0 - self.main_menu.width as f32) / 2.0).floor() as isize;
self.main_menu.y = ((state.canvas_size.1 + 70.0 - self.main_menu.height as f32) / 2.0).floor() as isize;
match self.title_menu.tick(state) {
MenuSelectionResult::Selected(0, _) => {
self.new_game(state, ctx)?;
self.option_menu.x = ((state.canvas_size.0 - self.option_menu.width as f32) / 2.0).floor() as isize;
self.option_menu.y = ((state.canvas_size.1 + 70.0 - self.option_menu.height as f32) / 2.0).floor() as isize;
match self.current_menu {
CurrentMenu::MainMenu => {
match self.main_menu.tick(state) {
MenuSelectionResult::Selected(0, _) => {
state.reset();
state.sound_manager.play_song(0, &state.constants, ctx)?;
self.tick = 1;
self.current_menu = CurrentMenu::StartGame;
}
MenuSelectionResult::Selected(1, _) => {
state.reset();
state.sound_manager.play_song(0, &state.constants, ctx)?;
self.tick = 1;
self.current_menu = CurrentMenu::StartGame;
}
MenuSelectionResult::Selected(2, _) => {
self.current_menu = CurrentMenu::OptionMenu;
}
MenuSelectionResult::Selected(4, _) => {
state.shutdown();
}
_ => {}
}
}
MenuSelectionResult::Selected(1, _) => {
self.new_game(state, ctx)?;
CurrentMenu::OptionMenu => {
match self.option_menu.tick(state) {
MenuSelectionResult::Selected(0, toggle) => {
if let MenuEntry::Toggle(_, value) = toggle {
*value = !(*value);
}
}
MenuSelectionResult::Selected(1, toggle) => {
if let MenuEntry::Toggle(_, value) = toggle {
*value = !(*value);
state.set_speed_hack(*value);
}
}
MenuSelectionResult::Selected(2, _) | MenuSelectionResult::Canceled => {
self.current_menu = CurrentMenu::MainMenu;
}
_ => {}
}
}
MenuSelectionResult::Selected(4, _) => {
state.shutdown();
CurrentMenu::StartGame => {
if self.tick == 30 {
self.start_game(state, ctx)?;
}
}
_ => {}
}
self.tick += 1;
@ -113,6 +168,11 @@ impl Scene for TitleScene {
}
fn draw(&self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
if self.current_menu == CurrentMenu::StartGame {
graphics::clear(ctx, Color::from_rgb(0, 0, 0));
return Ok(());
}
self.draw_background(state, ctx)?;
{
@ -132,7 +192,11 @@ impl Scene for TitleScene {
self.draw_text_centered(COPYRIGHT_PIXEL, state.canvas_size.1 - 30.0, state, ctx)?;
}
self.title_menu.draw(state, ctx)?;
match self.current_menu {
CurrentMenu::MainMenu => { self.main_menu.draw(state, ctx)?; }
CurrentMenu::OptionMenu => { self.option_menu.draw(state, ctx)?; }
CurrentMenu::StartGame => {}
}
Ok(())
}