135 lines
3.9 KiB
Rust
135 lines
3.9 KiB
Rust
use game::{Controllable, Game, Tickable};
|
|
use graphics::COLOR_BACKGROUND;
|
|
use log::{debug, info, trace};
|
|
use sdl2::event::Event;
|
|
use sdl2::keyboard::Keycode;
|
|
use sdl2::{render::Canvas, video::Window};
|
|
use simple_logger;
|
|
use std::time::Duration;
|
|
use tokio::time::interval;
|
|
|
|
mod game;
|
|
mod graphics;
|
|
mod playfield;
|
|
mod random;
|
|
mod srs;
|
|
mod tetromino;
|
|
|
|
const TICKS_PER_SECOND: usize = 60;
|
|
|
|
pub trait Renderable {
|
|
fn render(&self, canvas: &mut Canvas<Window>) -> Result<(), String>;
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
simple_logger::init()?;
|
|
let sdl_context = sdl2::init()?;
|
|
let video_subsystem = sdl_context.video()?;
|
|
let window = video_subsystem
|
|
.window("retris", 800, 800)
|
|
.position_centered()
|
|
.build()?;
|
|
let mut canvas = window.into_canvas().build()?;
|
|
let mut event_pump = sdl_context.event_pump()?;
|
|
let mut game = Game::default();
|
|
let mut interval = interval(Duration::from_millis(1000 / TICKS_PER_SECOND as u64));
|
|
|
|
'running: loop {
|
|
match game.is_game_over() {
|
|
Some(e) => {
|
|
println!("Lost due to: {:?}", e);
|
|
break;
|
|
}
|
|
None => (),
|
|
}
|
|
|
|
for event in event_pump.poll_iter() {
|
|
match event {
|
|
Event::Quit { .. }
|
|
| Event::KeyDown {
|
|
keycode: Some(Keycode::Escape),
|
|
..
|
|
} => {
|
|
debug!("Escape registered");
|
|
break 'running;
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(Keycode::Left),
|
|
..
|
|
} => {
|
|
debug!("Move left registered");
|
|
game.move_left();
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(Keycode::Right),
|
|
..
|
|
} => {
|
|
debug!("Move right registered");
|
|
game.move_right();
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(Keycode::Down),
|
|
..
|
|
} => {
|
|
debug!("Soft drop registered");
|
|
game.move_down();
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(Keycode::Z),
|
|
..
|
|
} => {
|
|
debug!("Rotate left registered");
|
|
game.rotate_left();
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(Keycode::X),
|
|
..
|
|
} => {
|
|
debug!("Rotate right registered");
|
|
game.rotate_right();
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(Keycode::Space),
|
|
..
|
|
}
|
|
| Event::KeyDown {
|
|
keycode: Some(Keycode::Up),
|
|
..
|
|
} => {
|
|
debug!("Hard drop registered");
|
|
game.hard_drop();
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(Keycode::LShift),
|
|
..
|
|
} => {
|
|
debug!("Hold registered");
|
|
game.hold();
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(Keycode::R),
|
|
..
|
|
} => {
|
|
info!("Restarting game");
|
|
game = Game::default();
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(e), ..
|
|
} => trace!("Ignoring keycode {}", e),
|
|
_ => (),
|
|
}
|
|
}
|
|
game.tick();
|
|
canvas.set_draw_color(COLOR_BACKGROUND);
|
|
canvas.clear();
|
|
game.render(&mut canvas)?;
|
|
canvas.present();
|
|
interval.tick().await;
|
|
}
|
|
|
|
dbg!(game);
|
|
|
|
Ok(())
|
|
}
|