Starting the Boids impl. Dot explosion
The Boids entities are spawned and given a velocity that takes them away from each other. Now to do the actual Bird-oids algorithm so that they flock.
This commit is contained in:
87
src/birdoids_plugin.rs
Normal file
87
src/birdoids_plugin.rs
Normal file
@@ -0,0 +1,87 @@
|
||||
|
||||
use bevy::{prelude::*, sprite::MaterialMesh2dBundle};
|
||||
|
||||
const BACKGROUND_COLOR: Color = Color::srgb(0.4, 0.4, 0.4);
|
||||
|
||||
pub struct BoidsPlugin;
|
||||
|
||||
impl Plugin for BoidsPlugin{
|
||||
fn build(&self, app: &mut App) {
|
||||
app
|
||||
.insert_resource(ClearColor(BACKGROUND_COLOR))
|
||||
.add_systems(Startup, (spawn_camera, spawn_boids))
|
||||
.add_systems(FixedUpdate, apply_velocity);
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
struct Boid;
|
||||
|
||||
#[derive(Component, Deref)]
|
||||
struct Velocity(Vec3);
|
||||
|
||||
#[derive(Bundle)]
|
||||
struct BoidBundle {
|
||||
boid: Boid,
|
||||
velocity: Velocity,
|
||||
}
|
||||
|
||||
impl BoidBundle {
|
||||
fn new(vel: Vec3) -> Self {
|
||||
Self {
|
||||
boid: Boid,
|
||||
velocity: Velocity(vel),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn spawn_camera(mut commands: Commands) {
|
||||
commands.spawn(Camera2dBundle::default());
|
||||
}
|
||||
|
||||
fn spawn_boids(
|
||||
mut commands: Commands,
|
||||
mut meshes: ResMut<Assets<Mesh>>,
|
||||
mut materials: ResMut<Assets<ColorMaterial>>,
|
||||
) {
|
||||
let num_boids = 1000;
|
||||
for i in 0..num_boids {
|
||||
let frac = 2.0 * std::f32::consts::PI / (num_boids as f32) * (i as f32);
|
||||
let vel = Vec3::new(
|
||||
frac.cos() * 10.0,
|
||||
frac.sin() * 10.0,
|
||||
0.0,
|
||||
);
|
||||
commands.spawn((
|
||||
BoidBundle::new(vel),
|
||||
MaterialMesh2dBundle {
|
||||
mesh: meshes.add(Circle::default()).into(),
|
||||
material: materials.add(Color::srgb(1.0, 1.0, 1.0)),
|
||||
..default()
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
commands.spawn((
|
||||
SpriteBundle {
|
||||
transform: Transform {
|
||||
translation: Vec3::new(0.0, 10.0, 0.0),
|
||||
scale: Vec3::new(1.0, 1.0, 1.0),
|
||||
..default()
|
||||
},
|
||||
sprite: Sprite {
|
||||
color: Color::srgb(1.0, 0.0, 0.0),
|
||||
..default()
|
||||
},
|
||||
..default()
|
||||
},
|
||||
Boid
|
||||
));
|
||||
}
|
||||
|
||||
fn apply_velocity(mut query: Query<(&mut Transform, &Velocity)>, time: Res<Time>) {
|
||||
for (mut transform, velocity) in &mut query {
|
||||
let delta_position = **velocity * time.delta_seconds();
|
||||
transform.translation += delta_position;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user