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>, body_query: Query<&GridPosition, With>, food_query: Query<&GridPosition, With>, ) -> 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>, food_query: Query<&GridPosition, With>, ) -> 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>, body_query: Query<&GridPosition, With>, ) -> 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>) -> 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; } } }