diff options
| author | Raymond Hogenson <rhogenson@posteo.net> | 2018-08-19 00:45:11 -0400 |
|---|---|---|
| committer | Raymond Hogenson <rhogenson@posteo.net> | 2018-08-19 00:45:11 -0400 |
| commit | 5846773a84b629765b6a7236bb6363bc4e34ab94 (patch) | |
| tree | 1d0df0ee8d99f91b78b4adca6086ee09255502d3 /src/main.rs | |
| parent | 4206ccc4d824da2a02caf8d8b6f1130c2d1f8ba3 (diff) | |
| download | stallman-shooter-5846773a84b629765b6a7236bb6363bc4e34ab94.tar.zst | |
Move some code around and improve abstraction
This doesn't change the functionality of the game at all (ideally), but
makes it easier to refactor and to add new enemies and new stages, which
is really the end-goal of this whole thing.
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/src/main.rs b/src/main.rs index ca1bdd8..6e1322a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,9 +3,11 @@ extern crate sdl2; mod state; mod player; mod constants; +mod gates; use state::Positioned; use state::Drawable; +use state::Bullet; enum Result { Win, @@ -20,15 +22,7 @@ struct Textures<'a> { ebullet: sdl2::render::Texture<'a>, } -fn spawn(count: u64) -> Vec<state::Enemy> { - if count == 0 { - vec![state::Enemy::new()] - } else { - Vec::new() - } -} - -fn frame(canvas: &mut sdl2::render::WindowCanvas, state: &mut state::State, events: &mut sdl2::event::EventPollIterator, textures: &Textures) -> Result { +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) -> Result { let mut new_bullets = Vec::new(); let count = state.count; for enemy in state.enemies.iter_mut() { @@ -51,16 +45,16 @@ fn frame(canvas: &mut sdl2::render::WindowCanvas, state: &mut state::State, even for bullet in state.player_bullets.iter_mut() { if enemy.overlaps(bullet) { bullet.delete(); - enemy.health -= 1; + let health = enemy.health(); + enemy.set_health(health - state::PBullet::damage()); } } } - state.enemies.retain(|enemy| state::Enemy::health(enemy) > 0); - state.enemies.append(&mut spawn(count)); + state.enemies.retain(|enemy| state::Enemy::health(enemy) > 0.); if state.enemies.len() == 0 { return Result::Win; } - state.bullets.retain(|bullet| !state::EBullet::outside(bullet)); + state.bullets.retain(|bullet| !U::outside(bullet)); state.bullets.append(&mut new_bullets); state.player_bullets.retain(|bullet| !state::PBullet::outside(bullet)); for bullet in state.player_bullets.iter() { @@ -74,7 +68,7 @@ fn frame(canvas: &mut sdl2::render::WindowCanvas, state: &mut state::State, even 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 as f64 / state::STARTING_HEALTH as f64 * 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; Result::Nothing } @@ -93,7 +87,7 @@ fn main() { let start = std::time::Instant::now(); let frame_duration = std::time::Duration::new(0, 1_000_000_000u32 / 60); let mut frame_count = 0; - let mut state = state::State::new(); + let mut state: state::State<gates::Gates, gates::GatesBullet> = state::State::new(); let mut won = false; let player_surface: sdl2::surface::Surface = sdl2::image::LoadSurface::from_file("assets/stallman.png").unwrap(); let enemy_surface: sdl2::surface::Surface = sdl2::image::LoadSurface::from_file("assets/gates.png").unwrap(); |
