From 811ad38e68e54a185fa7c83f97f6ab342e5b6212 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Sat, 3 Oct 2020 12:16:15 +0900 Subject: [PATCH] Rework scenes --- src/game.rs | 52 +++++++++-------------------------------- src/main.rs | 1 - src/scenes/gamestart.rs | 12 ++++++---- src/scenes/mod.rs | 10 ++++++++ src/subeventhandler.rs | 8 ------- 5 files changed, 28 insertions(+), 55 deletions(-) delete mode 100644 src/subeventhandler.rs diff --git a/src/game.rs b/src/game.rs index 0330507..188e109 100644 --- a/src/game.rs +++ b/src/game.rs @@ -5,10 +5,10 @@ use ggez::input::mouse::MouseButton; use ggez::{Context, GameResult}; use crate::scenes::gamestart::GameStartScene; -use crate::subeventhandler::SubEventHandler; +use crate::scenes::Scene; pub struct Game { - current_scene: Vec>, + current_scene: Box, state: GameState, } @@ -18,13 +18,10 @@ enum GameState { } impl GameState { - fn set_scene(&self, ctx: &mut Context, current_scene: &mut Vec>) { - current_scene.clear(); + fn get_scene(&self, ctx: &mut Context) -> Box { match self { - GameState::GameStart => { - current_scene.push(GameStartScene::new_boxed(ctx)); - } - GameState::Opening => {} + GameState::GameStart => GameStartScene::new_boxed(ctx), + GameState::Opening => GameStartScene::new_boxed(ctx), } } @@ -39,49 +36,28 @@ impl GameState { impl Game { pub fn new(ctx: &mut Context) -> Game { let mut game = Game { - current_scene: Vec::new(), + current_scene: GameStartScene::new_boxed(ctx), state: GameState::GameStart, }; - game.state.set_scene(ctx, &mut game.current_scene); - game } - - fn scene_next(&mut self) -> GameResult<()> { - for scene in &mut self.current_scene { - scene.next(); - } - Ok(()) - } } impl EventHandler for Game { fn update(&mut self, ctx: &mut Context) -> GameResult<()> { - if !self.current_scene.is_empty() { - let mut finished = true; - for scene in &mut self.current_scene { - scene.update(ctx)?; - if !scene.finished() { - finished = false; - } - } - if finished { - self.state = self.state.get_next_state(); - self.state.set_scene(ctx, &mut self.current_scene); - } - } else { + self.current_scene.update(ctx)?; + if self.current_scene.finished() { + self.state = self.state.get_next_state(); + self.current_scene = self.state.get_scene(ctx); } - Ok(()) } fn draw(&mut self, ctx: &mut Context) -> GameResult<()> { graphics::clear(ctx, graphics::WHITE); - for scene in &mut self.current_scene { - scene.draw(ctx)?; - } + self.current_scene.draw(ctx)?; graphics::present(ctx) } @@ -93,9 +69,6 @@ impl EventHandler for Game { _x: f32, _y: f32, ) { - if !self.current_scene.is_empty() { - self.scene_next().unwrap(); - } } fn key_down_event( @@ -105,8 +78,5 @@ impl EventHandler for Game { _keymods: KeyMods, _repeat: bool, ) { - if !self.current_scene.is_empty() { - self.scene_next().unwrap(); - } } } diff --git a/src/main.rs b/src/main.rs index ef44fc4..b57b134 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ mod game; mod scenes; -mod subeventhandler; use ggez::event; use ggez::ContextBuilder; diff --git a/src/scenes/gamestart.rs b/src/scenes/gamestart.rs index 0f7d476..b30b277 100644 --- a/src/scenes/gamestart.rs +++ b/src/scenes/gamestart.rs @@ -1,6 +1,8 @@ -use crate::subeventhandler::SubEventHandler; +use ggez::event::EventHandler; use ggez::{Context, GameResult}; +use super::Scene; + pub struct GameStartScene {} impl GameStartScene { @@ -13,7 +15,7 @@ impl GameStartScene { } } -impl SubEventHandler for GameStartScene { +impl EventHandler for GameStartScene { fn update(&mut self, _ctx: &mut Context) -> GameResult<()> { Ok(()) } @@ -21,10 +23,10 @@ impl SubEventHandler for GameStartScene { fn draw(&mut self, _ctx: &mut Context) -> GameResult<()> { Ok(()) } +} - fn next(&mut self) {} - - fn finished(&mut self) -> bool { +impl Scene for GameStartScene { + fn finished(&self) -> bool { false } } diff --git a/src/scenes/mod.rs b/src/scenes/mod.rs index 6f36287..805b012 100644 --- a/src/scenes/mod.rs +++ b/src/scenes/mod.rs @@ -1 +1,11 @@ pub mod gamestart; + +use ggez::event::EventHandler; + +pub trait Scene: EventHandler { + fn finished(&self) -> bool; +} + +pub trait SubEventHandler: Scene { + fn next(&mut self); +} diff --git a/src/subeventhandler.rs b/src/subeventhandler.rs deleted file mode 100644 index 8841262..0000000 --- a/src/subeventhandler.rs +++ /dev/null @@ -1,8 +0,0 @@ -use ggez::{Context, GameResult}; - -pub trait SubEventHandler { - fn update(&mut self, ctx: &mut Context) -> GameResult<()>; - fn draw(&mut self, ctx: &mut Context) -> GameResult<()>; - fn next(&mut self); - fn finished(&mut self) -> bool; -} -- 2.49.0