Collision logic

This commit is contained in:
2026-09-17 19:42:58 +02:00
parent bd32d79e22
commit 50f1135c1e
+14 -6
View File
@@ -1,6 +1,9 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::{obstacle::Obstacle, player::Player}; use crate::{
obstacle::Obstacle,
player::{Player, move_player},
};
// Hitbox // Hitbox
#[derive(Component)] #[derive(Component)]
@@ -8,18 +11,22 @@ pub struct Collider {
pub size: Vec2, pub size: Vec2,
} }
#[derive(Resource, Default)]
pub struct HasCollided(pub bool);
// Check collision with Player // Check collision with Player
fn check_collision( fn check_collision(
mut player: Single<(&Transform, &Collider, &mut Sprite), With<Player>>, mut player: Single<(&Transform, &Collider, &mut Sprite), With<Player>>,
obstacle: Query<(&Transform, &Collider), With<Obstacle>>, obstacle: Query<(&Transform, &Collider), With<Obstacle>>,
mut has_collided: Local<bool>, mut has_collided: ResMut<HasCollided>,
) { ) {
if *has_collided { if has_collided.0 {
return; return;
} }
let (player_transform, player_collider, mut player_sprite) = player.into_inner(); let (player_transform, player_collider, mut player_sprite) = player.into_inner();
// Check whether or not each obstacles overlap the player
for (collider_transform, collider_collider) in obstacle { for (collider_transform, collider_collider) in obstacle {
if overlap( if overlap(
player_transform.translation.truncate(), player_transform.translation.truncate(),
@@ -27,9 +34,9 @@ fn check_collision(
collider_transform.translation.truncate(), collider_transform.translation.truncate(),
collider_collider.size / 2.0, collider_collider.size / 2.0,
) { ) {
println!("Collision!!!!!!!"); // println!("Collision!!!!!!!");
player_sprite.color = Color::srgb(1.0, 0.0, 0.0); player_sprite.color = Color::srgb(1.0, 0.0, 0.0);
*has_collided = true; has_collided.0 = true;
break; break;
} }
} }
@@ -46,6 +53,7 @@ pub struct CollisionPlugin;
impl Plugin for CollisionPlugin { impl Plugin for CollisionPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_systems(Update, check_collision); app.init_resource::<HasCollided>()
.add_systems(Update, check_collision.after(move_player));
} }
} }