menu improvements
This commit is contained in:
parent
2b9bcd4fbb
commit
dd9ac33185
19
src/menu.rs
19
src/menu.rs
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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(())
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue