feat: add Captured and TractorBeam components, enhance enemy behavior with capture mechanics
This commit is contained in:
parent
1d1b927007
commit
008f9cc24a
5 changed files with 366 additions and 107 deletions
67
src/main.rs
67
src/main.rs
|
|
@ -21,11 +21,11 @@ use game_state::{
|
|||
};
|
||||
use player::{
|
||||
check_player_enemy_collisions, manage_invincibility, move_player, player_shoot,
|
||||
respawn_player,
|
||||
respawn_player, handle_captured_player,
|
||||
};
|
||||
use enemy::{
|
||||
check_formation_complete, enemy_shoot, is_formation_complete, move_enemies, spawn_enemies,
|
||||
trigger_attack_dives,
|
||||
trigger_attack_dives, boss_capture_attack,
|
||||
};
|
||||
use bullet::{
|
||||
check_bullet_collisions, check_enemy_bullet_player_collisions, move_bullets,
|
||||
|
|
@ -36,75 +36,67 @@ use systems::{player_exists, player_vulnerable, setup, should_respawn_player, up
|
|||
|
||||
fn main() {
|
||||
App::new()
|
||||
.init_state::<AppState>() // Initialize the AppState
|
||||
.insert_resource(ClearColor(Color::rgb(0.0, 0.0, 0.0)))
|
||||
.insert_resource(ClearColor(Color::rgb(0.0, 0.0, 0.1)))
|
||||
.add_plugins(DefaultPlugins.set(WindowPlugin {
|
||||
primary_window: Some(Window {
|
||||
title: "Galaga :: Stage: 1 Lives: 3 Score: 0".into(), // Initial title
|
||||
title: "BGLGA".into(),
|
||||
resolution: (WINDOW_WIDTH, WINDOW_HEIGHT).into(),
|
||||
resizable: false,
|
||||
..default()
|
||||
}),
|
||||
..default()
|
||||
}))
|
||||
// Add Resources
|
||||
.insert_resource(PlayerLives {
|
||||
count: STARTING_LIVES,
|
||||
// Add states
|
||||
.init_state::<AppState>() // Changed from add_state to init_state
|
||||
// Initialize game resources
|
||||
.insert_resource(EnemySpawnTimer {
|
||||
timer: Timer::new(Duration::from_secs_f32(1.0), TimerMode::Once),
|
||||
})
|
||||
.insert_resource(PlayerLives { count: STARTING_LIVES })
|
||||
.insert_resource(PlayerRespawnTimer {
|
||||
timer: Timer::new(
|
||||
Duration::from_secs_f32(PLAYER_RESPAWN_DELAY),
|
||||
TimerMode::Once,
|
||||
),
|
||||
})
|
||||
.insert_resource(EnemySpawnTimer {
|
||||
timer: Timer::new(Duration::from_secs_f32(0.5), TimerMode::Repeating),
|
||||
})
|
||||
.insert_resource(Score { value: 0 })
|
||||
.insert_resource(CurrentStage {
|
||||
number: 1,
|
||||
waiting_for_clear: false,
|
||||
})
|
||||
.insert_resource(FormationState {
|
||||
next_slot_index: 0,
|
||||
total_spawned_this_stage: 0,
|
||||
formation_complete: false,
|
||||
})
|
||||
.insert_resource(StageConfigurations::default()) // Add stage configurations
|
||||
.insert_resource(AttackDiveTimer {
|
||||
timer: { // Correctly assign the block expression to the timer field
|
||||
let mut timer = Timer::new(Duration::from_secs_f32(3.0), TimerMode::Repeating); // Default duration, will be overwritten by stage config
|
||||
timer.pause(); // Start paused
|
||||
timer
|
||||
}
|
||||
total_spawned_this_stage: 0,
|
||||
next_slot_index: 0,
|
||||
})
|
||||
.insert_resource(AttackDiveTimer {
|
||||
timer: {
|
||||
let mut timer = Timer::new(Duration::from_secs_f32(3.0), TimerMode::Repeating);
|
||||
timer.pause(); // Start paused
|
||||
timer
|
||||
},
|
||||
timer: Timer::new(Duration::from_secs_f32(3.0), TimerMode::Once),
|
||||
})
|
||||
// Add Systems
|
||||
.insert_resource(StageConfigurations::default()) // Use default stages for now
|
||||
// Add startup systems
|
||||
.add_systems(Startup, setup)
|
||||
// Systems running only when Playing
|
||||
// Core game systems
|
||||
.add_systems(
|
||||
Update,
|
||||
(
|
||||
// Player systems
|
||||
move_player,
|
||||
update_window_title,
|
||||
// Enemy and player systems
|
||||
spawn_enemies,
|
||||
move_player.run_if(player_exists),
|
||||
player_shoot.run_if(player_exists),
|
||||
check_player_enemy_collisions.run_if(player_vulnerable),
|
||||
respawn_player.run_if(should_respawn_player),
|
||||
manage_invincibility,
|
||||
handle_captured_player, // New system for handling captured player
|
||||
// Bullet systems
|
||||
move_bullets,
|
||||
check_bullet_collisions,
|
||||
move_enemy_bullets,
|
||||
check_enemy_bullet_player_collisions.run_if(player_vulnerable),
|
||||
// Enemy systems
|
||||
spawn_enemies,
|
||||
move_enemies,
|
||||
enemy_shoot, // Consider run_if attacking state? (Handled internally for now)
|
||||
boss_capture_attack, // New system for boss tractor beam
|
||||
)
|
||||
.run_if(in_state(AppState::Playing)),
|
||||
)
|
||||
|
|
@ -119,18 +111,9 @@ fn main() {
|
|||
.chain() // Ensure these run in order if needed, check_formation first
|
||||
.run_if(in_state(AppState::Playing)),
|
||||
)
|
||||
// Systems running regardless of state (or managing state transitions)
|
||||
.add_systems(
|
||||
Update,
|
||||
(
|
||||
update_window_title, // Keep title updated
|
||||
// TODO: Add system to check for restart input in GameOver state
|
||||
bevy::window::close_on_esc, // Allow closing anytime
|
||||
),
|
||||
)
|
||||
// Systems for entering/exiting states
|
||||
// UI and state management systems
|
||||
.add_systems(OnEnter(AppState::GameOver), setup_game_over_ui)
|
||||
.add_systems(OnExit(AppState::Playing), cleanup_game_entities)
|
||||
.add_systems(OnExit(AppState::GameOver), cleanup_game_over_ui)
|
||||
.add_systems(OnExit(AppState::Playing), cleanup_game_entities) // Cleanup when leaving Playing
|
||||
.run();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue