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,
}
}
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),
}
}
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)
}
_x: f32,
_y: f32,
) {
- if !self.current_scene.is_empty() {
- self.scene_next().unwrap();
- }
}
fn key_down_event(
_keymods: KeyMods,
_repeat: bool,
) {
- if !self.current_scene.is_empty() {
- self.scene_next().unwrap();
- }
}
}
-use crate::subeventhandler::SubEventHandler;
+use ggez::event::EventHandler;
use ggez::{Context, GameResult};
+use super::Scene;
+
pub struct GameStartScene {}
impl GameStartScene {
}
}
-impl SubEventHandler for GameStartScene {
+impl EventHandler for GameStartScene {
fn update(&mut self, _ctx: &mut Context) -> GameResult<()> {
Ok(())
}
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
}
}