collectables per wave
All checks were successful
Build Bevy Game (Linux + Windows) / build-windows (push) Successful in 18m1s
Build Bevy Game (Linux + Windows) / build-linux (push) Successful in 18m38s

This commit is contained in:
Crizomb 2026-01-04 14:54:10 +01:00
parent 002ad4a162
commit 69fe717b22
3 changed files with 31 additions and 19 deletions

View file

@ -21,12 +21,11 @@ pub enum CollectableType {
#[require(SphereCollider, Sprite, DispawnOnGameOver)]
pub struct Collectable(CollectableType);
// Not a system.
pub fn collectable_spawn(
commands: &mut Commands,
asset_server: &Res<AssetServer>,
collectable_type: CollectableType,
pos: Vec3,
pos: Vec2,
) {
let asset_name = ASSETS_NAME[collectable_type as usize];
let asset_path = Path::new("sprites").join(asset_name);
@ -34,16 +33,11 @@ pub fn collectable_spawn(
commands.spawn((
Collectable(collectable_type),
SphereCollider::new(COLLECTABLE_COLLIDER_RADIUS),
Transform::from_translation(pos).with_scale(Vec3::splat(5.0)),
Transform::from_translation(pos.extend(0.0)).with_scale(Vec3::splat(2.5)),
sprite,
));
}
pub struct CollectableSpawner;
pub fn collectable_spawner_init(mut commands: Commands, asset_server: Res<AssetServer>) {
collectable_spawn(&mut commands, &asset_server, CollectableType::NewKirby, Vec3::new(250.0, 250.0, 0.0));
}
pub fn collectable_actions_system(
mut commands: Commands,
mut kirby_query: Query<(&mut Kirby, &SphereCollider, &Transform)>,
@ -110,8 +104,6 @@ pub struct CollectablePlugin;
impl Plugin for CollectablePlugin {
fn build(&self, app: &mut App) {
app.add_systems(OnEnter(GameState::Starting), collectable_spawner_init.in_set(GameStartupSet))
.add_systems(FixedUpdate, collectable_actions_system)
.add_systems(Update, kirby_spawn_timer);
app.add_systems(FixedUpdate, collectable_actions_system).add_systems(Update, kirby_spawn_timer);
}
}

View file

@ -3,12 +3,12 @@ use bevy::{ecs::system::SystemParam, prelude::*};
use crate::core::{kirby::Kirby, wave::BubbleWaves};
#[derive(Event)]
struct EndGameEvent {
pub struct EndGameEvent {
pub reason: EndGameReason,
}
#[derive(Clone, Copy, Debug)]
enum EndGameReason {
pub enum EndGameReason {
Die,
Victory,
}

View file

@ -6,7 +6,8 @@ use rand::distr::slice::Empty;
use crate::{
core::{
bubble::{Bubble, bubble_spawn_wave},
game_state::Resetable,
collectible::{CollectableType, collectable_spawn},
game_state::{EndGameEvent, EndGameReason, Resetable},
kirby::Kirby,
life::Life,
},
@ -56,11 +57,12 @@ const GREEN_BUBBLE: BubbleType = BubbleType {
#[derive(Resource)]
pub struct BubbleWaves {
waves: Vec<Vec<BubbleSplash>>,
collectables: Vec<Vec<(CollectableType, Vec2)>>,
pub current_wave: usize,
}
fn get_bubble_waves() -> BubbleWaves {
BubbleWaves {
let return_thing = BubbleWaves {
waves: vec![
vec![BubbleSplash::new(NORMAL_BUBBLE, RIGHT, 10.0, 10)],
vec![BubbleSplash::new(NORMAL_BUBBLE, RIGHT, 10.0, 10), BubbleSplash::new(NORMAL_BUBBLE, TOP, 10.0, 10)],
@ -76,8 +78,17 @@ fn get_bubble_waves() -> BubbleWaves {
BubbleSplash::new(RED_BUBBLE, LEFT, 10.0, 100),
],
],
collectables: vec![
vec![],
vec![(CollectableType::NewKirby, LEFT)],
vec![(CollectableType::SpeedBoost, BOTTOM)],
vec![(CollectableType::ShieldBoost, BOTTOM)],
vec![],
],
current_wave: 0,
}
};
assert!(return_thing.waves.len() == return_thing.collectables.len());
return return_thing;
}
impl Resetable for BubbleWaves {
@ -92,11 +103,20 @@ fn no_ennemy_left(bubble_query: Query<(), With<Bubble>>) -> bool {
fn change_wave(mut bubble_wave: ResMut<BubbleWaves>, mut commands: Commands, asset_server: Res<AssetServer>) {
let max_bubble_wave = bubble_wave.waves.len();
bubble_wave.current_wave += 1;
if bubble_wave.current_wave >= max_bubble_wave {
panic!("GG you win");
commands.trigger(EndGameEvent { reason: EndGameReason::Victory });
return;
}
bubble_spawn_wave(&mut commands, &asset_server, bubble_wave.waves[bubble_wave.current_wave].as_slice());
let wave = &bubble_wave.waves[bubble_wave.current_wave];
let collectables = &bubble_wave.collectables[bubble_wave.current_wave];
bubble_spawn_wave(&mut commands, &asset_server, wave.as_slice());
for (collectable_type, collectable_pos) in collectables {
collectable_spawn(&mut commands, &asset_server, *collectable_type, *collectable_pos);
}
bubble_wave.current_wave += 1;
}
fn heal_kirby(query: Query<&mut Life, With<Kirby>>) {