add enemy spawners
This commit is contained in:
parent
103ff0d514
commit
cd19c1c321
6 changed files with 213 additions and 3 deletions
94
src/enemy.rs
Normal file
94
src/enemy.rs
Normal file
|
@ -0,0 +1,94 @@
|
|||
use bevy::prelude::*;
|
||||
use bevy_rand::{prelude::WyRand, resource::GlobalEntropy};
|
||||
use rand::Rng;
|
||||
|
||||
use crate::METER;
|
||||
|
||||
#[derive(Debug, Event)]
|
||||
pub struct SpawnEvent {
|
||||
pos: (f32, f32),
|
||||
spawner: Entity,
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Spawner {
|
||||
pos: (f32, f32),
|
||||
size: (f32, f32),
|
||||
spawn_cooldown: Timer,
|
||||
cur_enemies: u8,
|
||||
max_enemies: u8,
|
||||
amount_range: std::ops::Range<u8>,
|
||||
}
|
||||
|
||||
pub fn enemies_plugin(app: &mut App) {
|
||||
app.add_event::<SpawnEvent>()
|
||||
.add_systems(Startup, setup_spawners)
|
||||
.add_systems(Update, (spawn_enemies, do_spawn));
|
||||
}
|
||||
|
||||
pub fn setup_spawners(mut commands: Commands) {
|
||||
commands.spawn(Spawner {
|
||||
pos: (-6.5 * METER, 5.5 * METER),
|
||||
size: (14. * METER, 1.5 * METER),
|
||||
spawn_cooldown: Timer::from_seconds(5., TimerMode::Repeating),
|
||||
cur_enemies: 0,
|
||||
max_enemies: 10,
|
||||
amount_range: 2..4,
|
||||
});
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Enemy;
|
||||
|
||||
// TODO: waves n stuff
|
||||
// and gamestate lolz
|
||||
pub fn spawn_enemies(
|
||||
mut ev_spawn: EventWriter<SpawnEvent>,
|
||||
mut rng: ResMut<GlobalEntropy<WyRand>>,
|
||||
mut query: Query<(Entity, &mut Spawner)>,
|
||||
time: Res<Time>,
|
||||
) {
|
||||
for (entity, mut spawner) in query.iter_mut() {
|
||||
if spawner.spawn_cooldown.tick(time.delta()).finished()
|
||||
&& spawner.cur_enemies <= spawner.max_enemies
|
||||
{
|
||||
// TODO: randomness
|
||||
(0..rng.gen_range(spawner.amount_range.clone())).for_each(|_| {
|
||||
if spawner.cur_enemies < spawner.max_enemies {
|
||||
spawner.cur_enemies += 1;
|
||||
ev_spawn.send(SpawnEvent {
|
||||
pos: (
|
||||
rng.gen_range(
|
||||
(spawner.pos.0 + 0.5 * METER)
|
||||
..((spawner.pos.0) + (spawner.size.0 - 0.5 * METER)),
|
||||
),
|
||||
rng.gen_range(
|
||||
(spawner.pos.1 + 0.5 * METER)
|
||||
..((spawner.pos.1) + (spawner.size.1 - 0.5 * METER)),
|
||||
),
|
||||
),
|
||||
spawner: entity,
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn do_spawn(
|
||||
mut ev_spawn: EventReader<SpawnEvent>,
|
||||
mut commands: Commands,
|
||||
asset_server: Res<AssetServer>,
|
||||
) {
|
||||
for ev in ev_spawn.read() {
|
||||
println!("spawn!: {} {}", ev.pos.0 / METER, ev.pos.1 / METER);
|
||||
commands.spawn((
|
||||
Enemy,
|
||||
SpriteBundle {
|
||||
texture: asset_server.load("sprites/enemy.png"),
|
||||
transform: Transform::from_xyz(ev.pos.0, ev.pos.1, 1.),
|
||||
..default()
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
10
src/main.rs
10
src/main.rs
|
@ -1,19 +1,27 @@
|
|||
use bevy::prelude::*;
|
||||
use bevy_rand::{plugin::EntropyPlugin, prelude::WyRand};
|
||||
use bevy_rapier2d::prelude::*;
|
||||
use enemy::enemies_plugin;
|
||||
use player::{add_player, move_player};
|
||||
use rand::SeedableRng;
|
||||
use some_bevy_tools::{camera_2d::Camera2DPlugin, controller_2d::SimpleTopDownControllerPlugin};
|
||||
const METER: f32 = 64.;
|
||||
|
||||
mod enemy;
|
||||
mod player;
|
||||
mod scene;
|
||||
|
||||
fn main() {
|
||||
let r = rand::rngs::SmallRng::from_seed(*b"Meow UwU nyaaa~ mrrrp~ meew miau");
|
||||
App::new()
|
||||
.insert_resource(RapierConfiguration {
|
||||
gravity: Vec2::new(0.0, 0.0),
|
||||
..Default::default()
|
||||
})
|
||||
.add_plugins(EntropyPlugin::<WyRand>::default())
|
||||
.add_plugins(enemies_plugin)
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(64.0))
|
||||
.add_plugins(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(METER))
|
||||
.add_plugins(RapierDebugRenderPlugin::default())
|
||||
.add_plugins(Camera2DPlugin)
|
||||
.add_plugins(SimpleTopDownControllerPlugin)
|
||||
|
|
|
@ -3,7 +3,11 @@ use bevy::{
|
|||
sprite::{MaterialMesh2dBundle, Mesh2dHandle},
|
||||
};
|
||||
use bevy_rapier2d::prelude::*;
|
||||
const METER: f32 = 64.;
|
||||
|
||||
use crate::METER;
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Wall;
|
||||
|
||||
pub fn setup_scene(
|
||||
mut commands: Commands,
|
||||
|
@ -24,7 +28,8 @@ pub fn setup_scene(
|
|||
for (shape_, pos) in scene_objs {
|
||||
let shape = Mesh2dHandle(meshes.add(shape_));
|
||||
commands
|
||||
.spawn(MaterialMesh2dBundle {
|
||||
.spawn(Wall)
|
||||
.insert(MaterialMesh2dBundle {
|
||||
mesh: shape,
|
||||
material: materials.add(Color::rgb(1., 0., 0.)),
|
||||
transform: Transform::from_xyz(pos.0, pos.1, 1.),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue