Files
down_into_the_void/src/collision.rs
T
2026-09-17 19:42:58 +02:00

60 lines
1.6 KiB
Rust

use bevy::prelude::*;
use crate::{
obstacle::Obstacle,
player::{Player, move_player},
};
// Hitbox
#[derive(Component)]
pub struct Collider {
pub size: Vec2,
}
#[derive(Resource, Default)]
pub struct HasCollided(pub bool);
// Check collision with Player
fn check_collision(
mut player: Single<(&Transform, &Collider, &mut Sprite), With<Player>>,
obstacle: Query<(&Transform, &Collider), With<Obstacle>>,
mut has_collided: ResMut<HasCollided>,
) {
if has_collided.0 {
return;
}
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 {
if overlap(
player_transform.translation.truncate(),
player_collider.size / 2.0,
collider_transform.translation.truncate(),
collider_collider.size / 2.0,
) {
// println!("Collision!!!!!!!");
player_sprite.color = Color::srgb(1.0, 0.0, 0.0);
has_collided.0 = true;
break;
}
}
}
// Test if there is an overlap between 2 boxes
fn overlap(a_center: Vec2, a_half: Vec2, b_center: Vec2, b_half: Vec2) -> bool {
let overlap_x = (a_center.x - b_center.x).abs() < (a_half.x + b_half.x);
let overlap_y = (a_center.y - b_center.y).abs() < (a_half.y + b_half.y);
overlap_x && overlap_y
}
pub struct CollisionPlugin;
impl Plugin for CollisionPlugin {
fn build(&self, app: &mut App) {
app.init_resource::<HasCollided>()
.add_systems(Update, check_collision.after(move_player));
}
}