Files
snake-game/src/collision.rs
2025-10-17 00:08:17 +02:00

89 lines
2.4 KiB
Rust

use bevy::prelude::*;
/*
on enumere les differents type de collision (il en existe un nombre fini de type)
et on implement une fonction pour creer une variable capable de stocker un type de collision
*/
enum Collision {
No,
Food,
Body,
Border,
}
impl Collision {
fn new() -> Self {
Collision::No
}
}
/*
Systeme de collision entre les differentes entites
*/
fn collision_checker(
head_query: Query<&GridPosition, With<Head>>,
body_query: Query<&GridPosition, With<Body>>,
food_query: Query<&GridPosition, With<Food>>,
) -> Collision {
let mut collision_type = Collision::new();
if food_collision(head_query, food_query) {
collision_type = Collision::Food;
}
if body_collision(head_query, body_query) {
collision_type = Collision::Body;
}
if border_collision(head_query) {
collision_type = Collision::Border;
}
collision_type
}
fn food_collision(
head_query: Query<&GridPosition, With<Head>>,
food_query: Query<&GridPosition, With<Food>>,
) -> bool {
// on balaie parmis les entites qui possedent le composant food (ici un seul) pour tester la collision
for food in &food_query {
for head in &head_query {
if head.x == food.x && head.y == food.y {
return true;
}
}
}
}
fn body_collision(
head_query: Query<&GridPosition, With<Head>>,
body_query: Query<&GridPosition, With<Body>>,
) -> bool {
// on balaie parmis les entites qui possedent le composant body pour tester la collision
for body in &body_query {
for head in &head_query {
if body.x == head.x && body.y == head.y {
// on modifie la valeur retournee par la fonction pour correspondre au type d'entite rencontree
return true;
}
}
}
}
fn border_collision(head_query: Query<&GridPosition, With<Head>>) -> bool {
// teste la position du composant head pour voir si celui-ci sort de la grille
for head in &head_query {
if head.x > 190 || head.x < -190 {
// on modifie la valeur retournee par la fonction pour correspondre au type de collision rencontree
return true;
}
if head.y > 190 || head.y < -190 {
// on modifie la valeur retournee par la fonction pour correspondre au type de collision rencontree
return true;
}
}
}