89 lines
2.4 KiB
Rust
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;
|
|
}
|
|
}
|
|
}
|