Use a more lenient asteroid spawning strategy
Two large asteroids are created to start. New asteroids are only created when the total asteroid area is below 12. Large asteroids have 4 area, medium asteroids have 2, and small asteroids have 1. Asteroid true sizes are based on multiples of a base number.
This commit is contained in:
parent
154517654e
commit
36da3483ae
|
@ -1,6 +1,6 @@
|
|||
use crate::{HEIGHT, WIDTH};
|
||||
use macroquad::{prelude::*, rand::gen_range};
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, PartialEq, Eq)]
|
||||
pub enum AsteroidSize {
|
||||
Large,
|
||||
Medium,
|
||||
|
@ -19,12 +19,14 @@ pub struct Asteroid {
|
|||
pub alive: bool,
|
||||
}
|
||||
|
||||
const BASE_SIZE: f32 = 20.;
|
||||
|
||||
impl Asteroid {
|
||||
pub fn new(size: AsteroidSize) -> Self {
|
||||
let (sides, radius) = match size {
|
||||
AsteroidSize::Large => (gen_range(6, 10), gen_range(50., 65.)),
|
||||
AsteroidSize::Medium => (gen_range(5, 6), gen_range(35., 50.)),
|
||||
AsteroidSize::Small => (gen_range(3, 5), 25.),
|
||||
AsteroidSize::Large => (gen_range(6, 10), BASE_SIZE * 4.),
|
||||
AsteroidSize::Medium => (gen_range(5, 6), BASE_SIZE * 2.),
|
||||
AsteroidSize::Small => (gen_range(3, 5), BASE_SIZE),
|
||||
};
|
||||
let mut r = vec2(
|
||||
if gen_range(0., 1.) > 0.5 { -1. } else { 1. },
|
||||
|
|
24
src/world.rs
24
src/world.rs
|
@ -29,9 +29,6 @@ impl World {
|
|||
asteroids: vec![
|
||||
Asteroid::new_to(vec2(0., 0.), 1.5, AsteroidSize::Large),
|
||||
Asteroid::new(AsteroidSize::Large),
|
||||
Asteroid::new(AsteroidSize::Large),
|
||||
Asteroid::new(AsteroidSize::Large),
|
||||
Asteroid::new(AsteroidSize::Large),
|
||||
],
|
||||
..Default::default()
|
||||
}
|
||||
|
@ -115,7 +112,26 @@ impl World {
|
|||
// }) < self.max_asteroids
|
||||
// || self.player.lifespan % 200 == 0
|
||||
// {
|
||||
if self.player.lifespan % 200 == 0 {
|
||||
let num_small: usize = self
|
||||
.asteroids
|
||||
.iter()
|
||||
.filter(|a| a.size == AsteroidSize::Small)
|
||||
.map(|_| 1)
|
||||
.sum();
|
||||
let num_medium: usize = self
|
||||
.asteroids
|
||||
.iter()
|
||||
.filter(|a| a.size == AsteroidSize::Medium)
|
||||
.map(|_| 1)
|
||||
.sum();
|
||||
let num_large: usize = self
|
||||
.asteroids
|
||||
.iter()
|
||||
.filter(|a| a.size == AsteroidSize::Large)
|
||||
.map(|_| 1)
|
||||
.sum();
|
||||
let area = num_small + num_medium * 2 + num_large * 4;
|
||||
if self.player.lifespan % 200 == 0 && area < 12 {
|
||||
self.asteroids
|
||||
.push(Asteroid::new_to(self.player.pos, 1.5, AsteroidSize::Large));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue