rust-sokoban/src/main.rs

126 lines
3.1 KiB
Rust
Raw Normal View History

2020-07-23 15:42:35 -04:00
use ggez;
2020-07-23 18:12:52 -04:00
use ggez::event::KeyCode;
use ggez::event::KeyMods;
2020-07-24 18:56:48 -04:00
use ggez::{conf, event, timer, Context, GameResult};
2020-07-23 18:12:52 -04:00
use specs::{RunNow, World, WorldExt};
2020-07-27 14:30:34 -04:00
use std::fs::File;
use std::io::prelude::*;
2020-07-23 11:55:36 -04:00
use std::path;
2020-07-27 09:59:14 -04:00
mod audio;
2020-07-23 18:12:52 -04:00
mod components;
mod constants;
mod entities;
2020-07-27 09:59:14 -04:00
mod events;
2020-07-23 18:12:52 -04:00
mod map;
mod resources;
mod systems;
2020-07-23 11:55:36 -04:00
2020-07-27 09:59:14 -04:00
use crate::audio::initialize_sounds;
2020-07-23 18:12:52 -04:00
use crate::components::*;
use crate::map::*;
use crate::resources::*;
use crate::systems::*;
2020-07-23 15:42:35 -04:00
2020-07-23 11:55:36 -04:00
// All the game state
struct Game {
world: World,
}
impl event::EventHandler for Game {
2020-07-24 18:56:48 -04:00
fn update(&mut self, context: &mut Context) -> GameResult {
2020-07-23 15:42:35 -04:00
// Run input system
{
let mut is = InputSystem {};
is.run_now(&self.world);
}
2020-07-24 11:35:21 -04:00
// Run gameplay state system
{
let mut gss = GameplayStateSystem {};
gss.run_now(&self.world);
}
2020-07-24 18:56:48 -04:00
// Get an update time resource
{
let mut time = self.world.write_resource::<Time>();
time.delta += timer::delta(context);
}
2020-07-27 10:13:52 -04:00
// Run event system
{
let mut es = EventSystem {};
es.run_now(&self.world);
}
2020-07-23 11:55:36 -04:00
Ok(())
}
fn draw(&mut self, context: &mut Context) -> GameResult {
// Render gaem entities
{
let mut rs = RenderingSystem { context };
rs.run_now(&self.world);
}
Ok(())
}
2020-07-23 15:42:35 -04:00
fn key_down_event(
&mut self,
context: &mut Context,
2020-07-23 15:42:35 -04:00
keycode: KeyCode,
keymod: KeyMods,
2020-07-23 15:42:35 -04:00
_repeat: bool,
) {
// println!("Key pressed: {:?}, {:?}", keycode, _keymod);
match (keycode, keymod) {
// Map common keys to quit
(KeyCode::Escape, KeyMods::NONE)
| (KeyCode::Q, KeyMods::CTRL)
| (KeyCode::Q, KeyMods::LOGO) => ggez::event::quit(context),
_ => {
let mut input_queue = self.world.write_resource::<InputQueue>();
input_queue.keys_pressed.push(keycode);
}
}
2020-07-23 15:42:35 -04:00
}
2020-07-23 11:55:36 -04:00
}
2020-07-27 14:30:34 -04:00
pub fn initialize_level(world: &mut World, level: u32) {
let map_file = format!("resources/maps/{:02}.txt", level);
let mut file = File::open(&map_file).expect("Failed to open map file");
let mut map = String::new();
file.read_to_string(&mut map)
.expect("failed to read map file");
2020-07-27 14:30:34 -04:00
load_map(world, map);
2020-07-23 11:55:36 -04:00
}
pub fn main() -> GameResult {
let mut world = World::new();
register_components(&mut world);
2020-07-23 15:42:35 -04:00
register_resources(&mut world);
2020-07-27 12:09:55 -04:00
// @TODO multiple levels
2020-07-27 14:30:34 -04:00
initialize_level(&mut world, 1);
2020-07-23 11:55:36 -04:00
// Create a game context and event loop
let context_builder = ggez::ContextBuilder::new("rust_sokoban", "Timothy J. Warren")
.window_setup(conf::WindowSetup::default().title("Rust Sokoban!"))
.window_mode(conf::WindowMode::default().dimensions(800.0, 600.0))
.add_resource_path(path::PathBuf::from("./resources"));
let (context, event_loop) = &mut context_builder.build()?;
2020-07-27 09:59:14 -04:00
initialize_sounds(&mut world, context);
2020-07-23 11:55:36 -04:00
// Create the game state
let game = &mut Game { world };
// Run the main event loop
event::run(context, event_loop, game)
}