summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs196
1 files changed, 140 insertions, 56 deletions
diff --git a/src/main.rs b/src/main.rs
index eccef92..59913c0 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,14 +1,11 @@
-extern crate sdl2;
-extern crate sdl2_sys;
-
-mod state;
-mod player;
mod constants;
mod gates;
+mod player;
+mod state;
-use state::Positioned;
-use state::Drawable;
use state::Bullet;
+use state::Drawable;
+use state::Positioned;
enum FResult {
Win,
@@ -26,7 +23,12 @@ struct Textures<'a> {
const DURATION: u32 = 1_000_000_000u32 / 60;
-fn frame<T: state::Enemy<U>, U: state::Bullet>(canvas: &mut sdl2::render::WindowCanvas, state: &mut state::State<T, U>, events: &mut sdl2::event::EventPollIterator, textures: &Textures) -> FResult {
+fn frame<T: state::Enemy<U>, U: state::Bullet>(
+ canvas: &mut sdl2::render::WindowCanvas,
+ state: &mut state::State<T, U>,
+ events: &mut sdl2::event::EventPollIterator,
+ textures: &Textures,
+) -> FResult {
let mut new_bullets = Vec::new();
let count = state.count;
for enemy in state.enemies.iter_mut() {
@@ -42,12 +44,24 @@ fn frame<T: state::Enemy<U>, U: state::Bullet>(canvas: &mut sdl2::render::Window
Err(_) => {
return FResult::Exit;
}
- Ok(_) => { }
+ Ok(_) => {}
}
if count % state.player.fire_rate as u64 == 0 {
- state.player_bullets.push(state::PBullet::new(state.player.x, 0., state.player.y, -3.5));
+ state.player_bullets.push(state::PBullet::new(
+ state.player.x,
+ 0.,
+ state.player.y,
+ -3.5,
+ ));
}
- if state.bullets.iter().any(|bullet| state.player.overlaps(bullet)) || new_bullets.iter().any(|bullet| state.player.overlaps(bullet)) {
+ if state
+ .bullets
+ .iter()
+ .any(|bullet| state.player.overlaps(bullet))
+ || new_bullets
+ .iter()
+ .any(|bullet| state.player.overlaps(bullet))
+ {
return FResult::Loss;
}
for enemy in state.enemies.iter_mut() {
@@ -58,13 +72,17 @@ fn frame<T: state::Enemy<U>, U: state::Bullet>(canvas: &mut sdl2::render::Window
}
}
}
- state.enemies.retain(|enemy| state::Enemy::health(enemy) > 0.);
+ state
+ .enemies
+ .retain(|enemy| state::Enemy::health(enemy) > 0.);
if state.enemies.len() == 0 {
return FResult::Win;
}
state.bullets.retain(|bullet| !U::outside(bullet));
state.bullets.append(&mut new_bullets);
- state.player_bullets.retain(|bullet| !state::PBullet::outside(bullet));
+ state
+ .player_bullets
+ .retain(|bullet| !state::PBullet::outside(bullet));
for bullet in state.player_bullets.iter() {
bullet.draw(canvas, &textures.pbullet);
}
@@ -76,22 +94,32 @@ fn frame<T: state::Enemy<U>, U: state::Bullet>(canvas: &mut sdl2::render::Window
bullet.draw(canvas, &textures.ebullet);
}
canvas.set_draw_color(sdl2::pixels::Color::RGB(255, 0, 0));
- canvas.draw_rect(sdl2::rect::Rect::new(0, 0, (state.enemies[0].health() * constants::X_DIM as f64).round() as u32, 20)).unwrap();
+ canvas
+ .draw_rect(sdl2::rect::Rect::new(
+ 0,
+ 0,
+ (state.enemies[0].health() * constants::X_DIM as f64).round() as u32,
+ 20,
+ ))
+ .unwrap();
state.count += 1;
FResult::Nothing
}
-/* Why tf do I not need a lifetime here? */
fn get_surface(bytes: &[u8]) -> sdl2::surface::Surface {
(unsafe {
- let rw = sdl2_sys::SDL_RWFromMem(bytes.as_ptr() as *mut std::os::raw::c_void, bytes.len() as i32);
+ let rw = sdl2_sys::SDL_RWFromMem(
+ bytes.as_ptr() as *mut std::os::raw::c_void,
+ bytes.len() as i32,
+ );
let raw = sdl2_sys::image::IMG_Load_RW(rw, 1);
if (raw as *mut ()).is_null() {
Err("Returned null")
} else {
Ok(sdl2::surface::Surface::from_ll(raw))
}
- }).unwrap()
+ })
+ .unwrap()
}
fn get_player_surface() -> sdl2::surface::Surface<'static> {
@@ -110,10 +138,18 @@ fn get_pbullet_surface() -> sdl2::surface::Surface<'static> {
get_surface(include_bytes!("assets/player_pepp.png"))
}
-fn generic_message(canvas: &mut sdl2::render::WindowCanvas, event_pump: &mut sdl2::EventPump, image: &[u8], okay: sdl2::keyboard::Keycode, error: sdl2::keyboard::Keycode) -> Result<(), ()> {
+fn generic_message(
+ canvas: &mut sdl2::render::WindowCanvas,
+ event_pump: &mut sdl2::EventPump,
+ image: &[u8],
+ okay: sdl2::keyboard::Keycode,
+ error: sdl2::keyboard::Keycode,
+) -> Result<(), ()> {
let surface = get_surface(image);
let texture_creator = canvas.texture_creator();
- let texture = texture_creator.create_texture_from_surface(surface).unwrap();
+ let texture = texture_creator
+ .create_texture_from_surface(surface)
+ .unwrap();
let frame_duration = std::time::Duration::new(0, DURATION);
loop {
let start = std::time::Instant::now();
@@ -121,7 +157,10 @@ fn generic_message(canvas: &mut sdl2::render::WindowCanvas, event_pump: &mut sdl
canvas.present();
for event in event_pump.poll_iter() {
match event {
- sdl2::event::Event::KeyDown { keycode: Some(keycode), .. } => {
+ sdl2::event::Event::KeyDown {
+ keycode: Some(keycode),
+ ..
+ } => {
if keycode == okay {
return Ok(());
}
@@ -129,10 +168,10 @@ fn generic_message(canvas: &mut sdl2::render::WindowCanvas, event_pump: &mut sdl
return Err(());
}
}
- sdl2::event::Event::Quit {..} => {
+ sdl2::event::Event::Quit { .. } => {
return Err(());
}
- _ => { }
+ _ => {}
}
}
match frame_duration.checked_sub(start.elapsed()) {
@@ -142,28 +181,59 @@ fn generic_message(canvas: &mut sdl2::render::WindowCanvas, event_pump: &mut sdl
}
}
-fn introduction(canvas: &mut sdl2::render::WindowCanvas, event_pump: &mut sdl2::EventPump) -> Result<(), ()> {
- return generic_message(canvas, event_pump, include_bytes!("assets/introduction.png"), sdl2::keyboard::Keycode::Return, sdl2::keyboard::Keycode::Escape);
+fn introduction(
+ canvas: &mut sdl2::render::WindowCanvas,
+ event_pump: &mut sdl2::EventPump,
+) -> Result<(), ()> {
+ return generic_message(
+ canvas,
+ event_pump,
+ include_bytes!("assets/introduction.png"),
+ sdl2::keyboard::Keycode::Return,
+ sdl2::keyboard::Keycode::Escape,
+ );
}
-fn loss(canvas: &mut sdl2::render::WindowCanvas, event_pump: &mut sdl2::EventPump) -> Result<(), ()> {
- return generic_message(canvas, event_pump, include_bytes!("assets/loss.png"), sdl2::keyboard::Keycode::R, sdl2::keyboard::Keycode::Escape);
+fn loss(
+ canvas: &mut sdl2::render::WindowCanvas,
+ event_pump: &mut sdl2::EventPump,
+) -> Result<(), ()> {
+ return generic_message(
+ canvas,
+ event_pump,
+ include_bytes!("assets/loss.png"),
+ sdl2::keyboard::Keycode::R,
+ sdl2::keyboard::Keycode::Escape,
+ );
}
-fn victory(canvas: &mut sdl2::render::WindowCanvas, event_pump: &mut sdl2::EventPump) -> Result<(), ()> {
- return generic_message(canvas, event_pump, include_bytes!("assets/victory.png"), sdl2::keyboard::Keycode::R, sdl2::keyboard::Keycode::Escape);
+fn victory(
+ canvas: &mut sdl2::render::WindowCanvas,
+ event_pump: &mut sdl2::EventPump,
+) -> Result<(), ()> {
+ return generic_message(
+ canvas,
+ event_pump,
+ include_bytes!("assets/victory.png"),
+ sdl2::keyboard::Keycode::R,
+ sdl2::keyboard::Keycode::Escape,
+ );
}
fn main() {
let sdl_context = sdl2::init().unwrap();
let video_subsystem = sdl_context.video().unwrap();
- let window = video_subsystem.window("rust-sdl2 demo", constants::X_DIM, constants::Y_DIM).position_centered().build().unwrap();
+ let window = video_subsystem
+ .window("rust-sdl2 demo", constants::X_DIM, constants::Y_DIM)
+ .position_centered()
+ .build()
+ .unwrap();
let mut canvas = window.into_canvas().build().unwrap();
let mut event_pump = sdl_context.event_pump().unwrap();
-
+
match introduction(&mut canvas, &mut event_pump) {
- Ok(_) => { }
+ Ok(_) => {}
Err(_) => {
return;
}
@@ -176,37 +246,51 @@ fn main() {
let ebullet_surface = get_ebullet_surface();
let pbullet_surface = get_pbullet_surface();
let texture_creator = canvas.texture_creator();
- let player_texture = texture_creator.create_texture_from_surface(player_surface).unwrap();
- let enemy_texture = texture_creator.create_texture_from_surface(enemy_surface).unwrap();
- let ebullet_texture = texture_creator.create_texture_from_surface(ebullet_surface).unwrap();
- let pbullet_texture = texture_creator.create_texture_from_surface(pbullet_surface).unwrap();
- let surfaces = Textures { player: player_texture, enemy: enemy_texture, pbullet: pbullet_texture, ebullet: ebullet_texture };
+ let player_texture = texture_creator
+ .create_texture_from_surface(player_surface)
+ .unwrap();
+ let enemy_texture = texture_creator
+ .create_texture_from_surface(enemy_surface)
+ .unwrap();
+ let ebullet_texture = texture_creator
+ .create_texture_from_surface(ebullet_surface)
+ .unwrap();
+ let pbullet_texture = texture_creator
+ .create_texture_from_surface(pbullet_surface)
+ .unwrap();
+ let surfaces = Textures {
+ player: player_texture,
+ enemy: enemy_texture,
+ pbullet: pbullet_texture,
+ ebullet: ebullet_texture,
+ };
let frame_duration = std::time::Duration::new(0, DURATION);
- 'running: loop {
+ loop {
let start = std::time::Instant::now();
canvas.set_draw_color(sdl2::pixels::Color::RGB(255, 255, 255));
canvas.clear();
- match frame(&mut canvas, &mut state, &mut event_pump.poll_iter(), &surfaces) {
- FResult::Loss => {
- match loss(&mut canvas, &mut event_pump) {
- Ok(_) => {
- break;
- }
- Err(_) => {
- break 'retry;
- }
+ match frame(
+ &mut canvas,
+ &mut state,
+ &mut event_pump.poll_iter(),
+ &surfaces,
+ ) {
+ FResult::Loss => match loss(&mut canvas, &mut event_pump) {
+ Ok(_) => {
+ break;
}
- }
- FResult::Win => {
- match victory(&mut canvas, &mut event_pump) {
- Ok(_) => {
- break;
- }
- Err(_) => {
- break 'retry;
- }
+ Err(_) => {
+ break 'retry;
}
- }
+ },
+ FResult::Win => match victory(&mut canvas, &mut event_pump) {
+ Ok(_) => {
+ break;
+ }
+ Err(_) => {
+ break 'retry;
+ }
+ },
FResult::Exit => {
break 'retry;
}