Collision logic
This commit is contained in:
@@ -0,0 +1,43 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
use crate::{obstacle::Obstacle, player::Player};
|
||||||
|
|
||||||
|
// Hitbox
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct Collider {
|
||||||
|
pub size: Vec2,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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: Local<bool>,
|
||||||
|
) {
|
||||||
|
if *has_collided {
|
||||||
|
println!("Collision!!!!!!!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let (player_transform, player_collider, mut player_sprite) = player.into_inner();
|
||||||
|
|
||||||
|
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,
|
||||||
|
) {
|
||||||
|
player_sprite.color = Color::srgb(1.0, 0.0, 0.0);
|
||||||
|
*has_collided = 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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user