From 339d2ffd6e7dc5ece6f7691c2c6f7ed4170a28c9 Mon Sep 17 00:00:00 2001 From: zefad Date: Wed, 16 Sep 2026 19:27:27 +0200 Subject: [PATCH] Collision logic --- src/collision.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/collision.rs diff --git a/src/collision.rs b/src/collision.rs new file mode 100644 index 0000000..b734a85 --- /dev/null +++ b/src/collision.rs @@ -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>, + obstacle: Query<(&Transform, &Collider), With>, + mut has_collided: Local, +) { + 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 +}