use a modal menu for tutorial mode

This commit is contained in:
Dustin Carlino 2019-05-01 11:31:53 -07:00
parent c904e9cdcf
commit b2b7d0767c
3 changed files with 26 additions and 36 deletions

View File

@ -16,7 +16,6 @@
- big vertical road. some neighborhoods off to the side. everyone trying to go nrth or south. one driving, one parkign lane. a bus that makes a loop. some horizontal roads connected to borders that force the vertical road to not be fast. just make a dedicated bus lane! oops,except some of the bus stops are at narrow places, so traffic has to slow down anyway for the bus. maybe there's a bypass road through a neighborhood?
- introduce elements gradually... fix a silly traffic signal with just cars, then add peds and bikes...
- use a modalish menu to display instructions and also give the 'escape' option
- spawn cars somewhere
- run sim, pause, change speed, reset

View File

@ -207,6 +207,7 @@ impl GUI for GameState {
"A/B Test Editor",
vec![(Key::Escape, "quit"), (Key::R, "run A/B test")],
),
ModalMenu::new("Tutorial", vec![(Key::Escape, "quit")]),
]
}

View File

@ -1,9 +1,7 @@
use crate::game::{GameState, Mode};
use crate::render::DrawOptions;
use crate::ui::ShowEverything;
use ezgui::{
EventCtx, EventLoopMode, GfxCtx, HorizontalAlignment, Key, Text, VerticalAlignment, Wizard,
};
use ezgui::{Color, EventCtx, EventLoopMode, GfxCtx, Key, Text, Wizard};
use geom::Pt2D;
// Does CommonState make sense?
@ -16,24 +14,40 @@ impl TutorialMode {
pub fn event(state: &mut GameState, ctx: &mut EventCtx) -> EventLoopMode {
ctx.canvas.handle_event(ctx.input);
let mut txt = Text::new();
txt.add_styled_line("Tutorial".to_string(), None, Some(Color::BLUE), None);
match state.mode {
Mode::Tutorial(TutorialMode::Part1(orig_center)) => {
txt.add_line("Click and drag to pan around".to_string());
// TODO Zooming also changes this. :(
if ctx.canvas.center_to_map_pt() != orig_center
&& ctx.input.key_pressed(Key::Enter, "next step of tutorial")
{
state.mode = Mode::Tutorial(TutorialMode::Part2(ctx.canvas.cam_zoom));
if ctx.canvas.center_to_map_pt() != orig_center {
txt.add_line("".to_string());
txt.add_line("Great! Press ENTER to continue.".to_string());
if ctx.input.key_pressed(Key::Enter, "next step of tutorial") {
state.mode = Mode::Tutorial(TutorialMode::Part2(ctx.canvas.cam_zoom));
}
}
}
Mode::Tutorial(TutorialMode::Part2(orig_cam_zoom)) => {
if ctx.canvas.cam_zoom != orig_cam_zoom
&& ctx.input.key_pressed(Key::Enter, "next step of tutorial")
{
state.mode = Mode::SplashScreen(Wizard::new(), None);
txt.add_line("Use your mouse wheel or touchpad to zoom in and out".to_string());
if ctx.canvas.cam_zoom != orig_cam_zoom {
txt.add_line("".to_string());
txt.add_line("Great! Press ENTER to continue.".to_string());
if ctx.input.key_pressed(Key::Enter, "next step of tutorial") {
state.mode = Mode::SplashScreen(Wizard::new(), None);
}
}
}
_ => unreachable!(),
}
ctx.input
.set_mode_with_new_prompt("Tutorial", txt, ctx.canvas);
if ctx.input.modal_action("quit") {
state.mode = Mode::SplashScreen(Wizard::new(), None);
}
EventLoopMode::InputOnly
}
@ -45,29 +59,5 @@ impl TutorialMode {
&state.ui.primary.sim,
&ShowEverything::new(),
);
let mut txt = Text::new();
match state.mode {
Mode::Tutorial(TutorialMode::Part1(orig_center)) => {
txt.add_line("Click and drag to pan around".to_string());
if g.canvas.center_to_map_pt() != orig_center {
txt.add_line("".to_string());
txt.add_line("Great! Press ENTER to continue.".to_string());
}
}
Mode::Tutorial(TutorialMode::Part2(orig_cam_zoom)) => {
txt.add_line("Use your mouse wheel or touchpad to zoom in and out".to_string());
if g.canvas.cam_zoom != orig_cam_zoom {
txt.add_line("".to_string());
txt.add_line("Great! Press ENTER to continue.".to_string());
}
}
_ => unreachable!(),
}
// TODO Get rid of top menu and OSD and then put this somewhere more sensible. :)
g.draw_blocking_text(
&txt,
(HorizontalAlignment::Right, VerticalAlignment::Center),
);
}
}