Moved out objects from game module
[kaka/rust-sdl-test.git] / src / core / game.rs
CommitLineData
79914631 1use AppState;
eb253fcc 2use core::app::StateChange;
bf7b5671 3use core::controller::ControllerManager;
5d7eff9e
TW
4use core::level::{Level, LevelGenerator};
5use core::object::{Object, Objects, ObjectState};
6use core::object::character::Character;
6566d7e5 7use core::render::Renderer;
b0566120 8use sdl2::event::Event;
a6b57e45 9use sdl2::keyboard::Keycode;
bf7b5671 10use sprites::SpriteManager;
953b4c96 11use teststate::TestState;
902b2b31 12use time::Duration;
b0566120
TW
13
14////////// GAMESTATE ///////////////////////////////////////////////////////////
15
16#[derive(Default)]
17pub struct GameState {
18 world: World,
79914631 19 lvlgen: LevelGenerator,
7b724ff3 20 debug_mode: bool,
b0566120
TW
21}
22
23impl GameState {
24 pub fn new() -> Self {
9a6d1261 25 let lvlgen = LevelGenerator::new(0);
b0566120 26 GameState {
79914631
TW
27 world: World::new(lvlgen.generate()),
28 lvlgen,
7b724ff3 29 ..Default::default()
b0566120
TW
30 }
31 }
32}
33
34impl AppState for GameState {
a82a4d23 35 fn enter(&mut self, ctrl_man: &ControllerManager) {
3fd8761b
TW
36 for (_k, v) in ctrl_man.controllers.iter() {
37 self.world.add(Box::new(Character::new(v.clone())));
b0566120
TW
38 }
39 }
40
41 fn leave(&mut self) {}
42
eb253fcc 43 fn update(&mut self, dt: Duration) -> Option<StateChange> {
b0566120 44 self.world.update(dt);
eb253fcc 45 None
b0566120
TW
46 }
47
6566d7e5 48 fn render(&mut self, renderer: &mut Renderer, sprites: &SpriteManager) {
7b724ff3 49 self.world.render(renderer, sprites, self.debug_mode);
b0566120
TW
50 }
51
eb253fcc 52 fn handle_event(&mut self, event: Event) -> Option<StateChange> {
a6b57e45 53 match event {
eb253fcc
TW
54 Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
55 return Some(StateChange::Pop)
56 }
57 Event::KeyDown { keycode: Some(Keycode::Return), .. } => {
b0137bb6 58 return Some(StateChange::Push(Box::new(TestState::new())))
eb253fcc 59 }
7b724ff3
TW
60 Event::KeyDown { keycode: Some(Keycode::KpEnter), .. } => {
61 self.debug_mode = !self.debug_mode;
62 }
a6b57e45 63 Event::KeyDown { keycode: Some(Keycode::Space), .. } => {
79914631
TW
64 self.lvlgen.seed = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs() as u32;
65 self.world.level = self.lvlgen.generate();
a6b57e45
TW
66 }
67 Event::KeyDown { keycode: Some(Keycode::KpPlus), .. } => {
79914631 68 self.lvlgen.iterations += 1;
79914631 69 self.world.level = self.lvlgen.generate();
a6b57e45
TW
70 }
71 Event::KeyDown { keycode: Some(Keycode::KpMinus), .. } => {
9768e2bb
TW
72 if self.lvlgen.iterations > 0 {
73 self.lvlgen.iterations -= 1;
9a6d1261
TW
74 self.world.level = self.lvlgen.generate();
75 }
76 }
77 Event::KeyDown { keycode: Some(Keycode::KpMultiply), .. } => {
78 self.lvlgen.wall_smooth_radius += 1;
79 self.world.level = self.lvlgen.generate();
80 }
81 Event::KeyDown { keycode: Some(Keycode::KpDivide), .. } => {
82 if self.lvlgen.wall_smooth_radius > 0 {
83 self.lvlgen.wall_smooth_radius -= 1;
9768e2bb
TW
84 self.world.level = self.lvlgen.generate();
85 }
c80ba7f7 86 }
a6b57e45
TW
87 _ => {}
88 }
eb253fcc 89 None
a6b57e45 90 }
b0566120
TW
91}
92
93////////// WORLD ///////////////////////////////////////////////////////////////
94
95#[derive(Default)]
96pub struct World {
97 level: Level,
3583c453 98 objects: Objects,
b0566120
TW
99}
100
101impl World {
79914631 102 pub fn new(level: Level) -> Self {
b0566120 103 World {
79914631 104 level,
b0566120
TW
105 ..Default::default()
106 }
107 }
108
902b2b31 109 pub fn update(&mut self, dt: Duration) {
3583c453
TW
110 let mut breeding_ground = vec!();
111
112 for i in (0..self.objects.len()).rev() {
5d7eff9e 113 if self.objects[i].update(&mut breeding_ground, &self.level, dt) == ObjectState::Dead {
3583c453
TW
114 self.objects.remove(i); // swap_remove is more efficient, but changes the order of the array
115 }
116 }
117
118 for o in breeding_ground {
119 self.add(o);
b0566120 120 }
3fd8761b
TW
121
122 println!("\x1b[Kobject count: {}\x1b[1A", self.objects.len()); // clear line, print, move cursor up
b0566120
TW
123 }
124
7b724ff3
TW
125 pub fn render(&mut self, renderer: &mut Renderer, sprites: &SpriteManager, debug_mode: bool) {
126 self.level.render(renderer, sprites, debug_mode);
b0566120 127 for o in &mut self.objects {
6566d7e5 128 o.render(renderer, sprites);
b0566120
TW
129 }
130 }
131
132 pub fn add(&mut self, object: Box<dyn Object>) {
133 self.objects.push(object);
134 }
135}