diff --git a/Cargo.lock b/Cargo.lock index 5f11b37..b65ec0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4092,6 +4092,7 @@ name = "spacorium" version = "0.1.0" dependencies = [ "bevy", + "rand", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index e57ae1e..c4aeaac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,4 @@ edition = "2024" [dependencies] bevy = "0.17.2" +rand = "0.9.2" diff --git a/assets/asteroid2.png b/assets/asteroid2.png new file mode 100644 index 0000000..b7f114a Binary files /dev/null and b/assets/asteroid2.png differ diff --git a/assets/enemy_projectile.png b/assets/enemy_projectile.png new file mode 100644 index 0000000..5c91542 Binary files /dev/null and b/assets/enemy_projectile.png differ diff --git a/assets/tileset.png b/assets/tileset.png index 7ebc17c..ba0e6b1 100644 Binary files a/assets/tileset.png and b/assets/tileset.png differ diff --git a/src/asteroid.rs b/src/asteroid.rs new file mode 100644 index 0000000..be65918 --- /dev/null +++ b/src/asteroid.rs @@ -0,0 +1,96 @@ +use bevy::prelude::*; +use rand::{prelude::*, rng}; + +use crate::{ + FIRST_CORNER_X, FIRST_CORNER_Y, SECOND_CORNER_X, SECOND_CORNER_Y, + collision::{Collided, Collider}, + damagable::Damagable, + projectile::Projectile, + velocity::Velocity, +}; + +const ASTEROID_BUMP_STRENGTH: f32 = 10.0; + +pub struct AsteroidPlugin; + +impl Plugin for AsteroidPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Startup, setup_asteroids) + .add_systems(FixedUpdate, rotate_asteroid); + } +} + +#[derive(Component)] +pub struct Asteroid(f32); + +pub fn setup_asteroids(mut commands: Commands, asset_server: Res) { + let sprite1: Handle = asset_server.load("asteroid.png"); + let sprite2: Handle = asset_server.load("asteroid2.png"); + let mut random = rng(); + + for _ in 0..50 { + let position = Vec3::new( + random.random_range(FIRST_CORNER_X..SECOND_CORNER_X), + random.random_range(FIRST_CORNER_Y..SECOND_CORNER_Y), + 0., + ); + let sprite = if random.random_bool(0.5) { + sprite1.clone() + } else { + sprite2.clone() + }; + let tau = f64::to_radians(360.); + let rotation = random.random_range((-tau)..tau) as f32; + + commands + .spawn(( + Asteroid(rotation), + Sprite::from(sprite), + Transform::from_translation(position), + Collider::new(8.), + Damagable::new(20), + )) + .observe(bump); + } +} + +pub fn rotate_asteroid(time: Res