summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs24
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();