summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
authorRaymond Hogenson <rhogenson@posteo.net>2018-08-19 00:45:11 -0400
committerRaymond Hogenson <rhogenson@posteo.net>2018-08-19 00:45:11 -0400
commit5846773a84b629765b6a7236bb6363bc4e34ab94 (patch)
tree1d0df0ee8d99f91b78b4adca6086ee09255502d3 /src/main.rs
parent4206ccc4d824da2a02caf8d8b6f1130c2d1f8ba3 (diff)
downloadstallman-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.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();