Collision logic
This commit is contained in:
+14
-6
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user