]> git.seodisparate.com - LudumDare47_StuckInALoop/commitdiff
Rework scenes
authorStephen Seo <seo.disparate@gmail.com>
Sat, 3 Oct 2020 03:16:15 +0000 (12:16 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Sat, 3 Oct 2020 03:16:15 +0000 (12:16 +0900)
src/game.rs
src/main.rs
src/scenes/gamestart.rs
src/scenes/mod.rs
src/subeventhandler.rs [deleted file]

index 0330507eb250cf76be4be99e1a6052937fd79e16..188e1096c32c3f05b6fbc64c6b3e93942f642c08 100644 (file)
@@ -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<Box<dyn SubEventHandler>>,
+    current_scene: Box<dyn Scene>,
     state: GameState,
 }
 
@@ -18,13 +18,10 @@ enum GameState {
 }
 
 impl GameState {
-    fn set_scene(&self, ctx: &mut Context, current_scene: &mut Vec<Box<dyn SubEventHandler>>) {
-        current_scene.clear();
+    fn get_scene(&self, ctx: &mut Context) -> Box<dyn Scene> {
         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();
-        }
     }
 }
index ef44fc401aa7c7402c519d94035028b34d280826..b57b134d82054d35908d825cf35ce64c0e70fecd 100644 (file)
@@ -1,6 +1,5 @@
 mod game;
 mod scenes;
-mod subeventhandler;
 
 use ggez::event;
 use ggez::ContextBuilder;
index 0f7d476ce8e175d25e9875b76b5d7ffb6a1f2315..b30b2776ef2fc0b22a6370515eccce1c20a486f2 100644 (file)
@@ -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
     }
 }
index 6f36287e586361098e39d0e8369bc30d72a1a130..805b0124f54cad3ca3a9e382923c14b231bae202 100644 (file)
@@ -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 (file)
index 8841262..0000000
+++ /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;
-}