Add collisions between players

This commit is contained in:
Mylloon 2022-01-01 21:18:23 +01:00
parent 4566a92d09
commit bbb8995e99
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -33,7 +33,11 @@ static float _cubeSize = 4.f;
/* Variable d'état pour activer/désactiver la synchronisation verticale */ /* Variable d'état pour activer/désactiver la synchronisation verticale */
static int _use_vsync = 1; static int _use_vsync = 1;
/* Grille de positions où il y aura des cubes */ /* Grille de positions où il y aura des cubes
* 0 -> Vide
* 1 -> Mur
* 2 (valeur reservée) -> Joueur A (défini automatiquement par le programme)
* 3 (valeur reservée) -> Joueur B (défini automatiquement par le programme) */
static int _grille[] = { static int _grille[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1,
@ -161,6 +165,7 @@ void idle(void) {
float xA = (float)((_herosA.x + _cubeSize * _grilleW / 2) / _cubeSize); // colonne - longueur float xA = (float)((_herosA.x + _cubeSize * _grilleW / 2) / _cubeSize); // colonne - longueur
/* Coordonnées joueur A */ /* Coordonnées joueur A */
int coorJoueurA = round(zA) * _grilleH + round(xA);
int coorDroiteA = round(zA) * _grilleH + ceil(xA); int coorDroiteA = round(zA) * _grilleH + ceil(xA);
int coorHautA = floor(zA) * _grilleH + round(xA); int coorHautA = floor(zA) * _grilleH + round(xA);
int coorGaucheA = round(zA) * _grilleH + floor(xA); int coorGaucheA = round(zA) * _grilleH + floor(xA);
@ -170,28 +175,41 @@ void idle(void) {
float decalageLargeurA = zA - floor(zA); float decalageLargeurA = zA - floor(zA);
float decalageLongueurA = xA - floor(xA); float decalageLongueurA = xA - floor(xA);
/* Déplacement */
if(_vkeyboard[VK_RIGHT]) if(_vkeyboard[VK_RIGHT])
if(_grille[coorDroiteA] == 0 && (decalageLargeurA < decalageGB || decalageLargeurA > decalageDH)) // collision à droite du plateau if((_grille[coorDroiteA] == 0 || _grille[coorDroiteA] == 2) && (decalageLargeurA < decalageGB || decalageLargeurA > decalageDH)) // collision à droite du plateau
_herosA.x += vitesse * dt; _herosA.x += vitesse * dt;
if(_vkeyboard[VK_UP]) if(_vkeyboard[VK_UP])
if(_grille[coorHautA] == 0 && (decalageLongueurA < decalageGB || decalageLongueurA > decalageDH)) // collision en haut plateau if((_grille[coorHautA] == 0 || _grille[coorHautA] == 2) && (decalageLongueurA < decalageGB || decalageLongueurA > decalageDH)) // collision en haut plateau
_herosA.z -= vitesse * dt; _herosA.z -= vitesse * dt;
if(_vkeyboard[VK_LEFT]) if(_vkeyboard[VK_LEFT])
if(_grille[coorGaucheA] == 0 && (decalageLargeurA < decalageGB || decalageLargeurA > decalageDH)) // collision à gauche du plateau if((_grille[coorGaucheA] == 0 || _grille[coorGaucheA] == 2) && (decalageLargeurA < decalageGB || decalageLargeurA > decalageDH)) // collision à gauche du plateau
_herosA.x -= vitesse * dt; _herosA.x -= vitesse * dt;
if(_vkeyboard[VK_DOWN]) if(_vkeyboard[VK_DOWN])
if(_grille[coorBasA] == 0 && (decalageLongueurA < decalageGB || decalageLongueurA > decalageDH)) // collision en bas du plateau if((_grille[coorBasA] == 0 || _grille[coorBasA] == 2) && (decalageLongueurA < decalageGB || decalageLongueurA > decalageDH)) // collision en bas du plateau
_herosA.z += vitesse * dt; _herosA.z += vitesse * dt;
printf("\n==== Héros A ====\n li = %d, col = %d\n", (int)(zA + .5f), (int)(xA + .5f));
/* Affichage Debug */
printf("\n==== Héros A ====\n li = %d, col = %d, pos = %d\n", (int)(zA + .5f), (int)(xA + .5f), _herosA.position);
printf("zA=%f xA=%f\n", zA, xA); printf("zA=%f xA=%f\n", zA, xA);
printf("d=%d h=%d g=%d b=%d\n", coorDroiteA, coorHautA, coorGaucheA, coorBasA); printf("d=%d h=%d g=%d b=%d\n", coorDroiteA, coorHautA, coorGaucheA, coorBasA);
/* Anti-collision entre joueurs */
if(_herosA.position != coorJoueurA) {
if(_herosA.position != -1)
_grille[_herosA.position] = 0;
_herosA.position = coorJoueurA;
_grille[coorJoueurA] = 2;
}
/* Mouvements du héros B */ /* Mouvements du héros B */
/* Coordonées x, z */ /* Coordonées x, z */
float zB = (float)((_herosB.z + _cubeSize * _grilleH / 2) / _cubeSize); // ligne - hauteur float zB = (float)((_herosB.z + _cubeSize * _grilleH / 2) / _cubeSize); // ligne - hauteur
float xB = (float)((_herosB.x + _cubeSize * _grilleW / 2) / _cubeSize); // colonne - longueur float xB = (float)((_herosB.x + _cubeSize * _grilleW / 2) / _cubeSize); // colonne - longueur
/* Coordonnées joueur A */ /* Coordonnées joueur A */
int coorJoueurB = round(zB) * _grilleH + round(xB);
int coorDroiteB = round(zB) * _grilleH + ceil(xB); int coorDroiteB = round(zB) * _grilleH + ceil(xB);
int coorHautB = floor(zB) * _grilleH + round(xB); int coorHautB = floor(zB) * _grilleH + round(xB);
int coorGaucheB = round(zB) * _grilleH + floor(xB); int coorGaucheB = round(zB) * _grilleH + floor(xB);
@ -201,21 +219,32 @@ void idle(void) {
float decalageLargeurB = zB - floor(zB); float decalageLargeurB = zB - floor(zB);
float decalageLongueurB = xB - floor(xB); float decalageLongueurB = xB - floor(xB);
/* Déplacement */
if(_vkeyboard[VK_d]) if(_vkeyboard[VK_d])
if(_grille[coorDroiteB] == 0 && (decalageLargeurB < decalageGB || decalageLargeurB > decalageDH)) // collision à droite du plateau if((_grille[coorDroiteB] == 0 || _grille[coorDroiteB] == 3) && (decalageLargeurB < decalageGB || decalageLargeurB > decalageDH)) // collision à droite du plateau
_herosB.x += vitesse * dt; _herosB.x += vitesse * dt;
if(_vkeyboard[VK_z]) if(_vkeyboard[VK_z])
if(_grille[coorHautB] == 0 && (decalageLongueurB < decalageGB || decalageLongueurB > decalageDH)) // collision en haut plateau if((_grille[coorHautB] == 0 || _grille[coorHautB] == 3) && (decalageLongueurB < decalageGB || decalageLongueurB > decalageDH)) // collision en haut plateau
_herosB.z -= vitesse * dt; _herosB.z -= vitesse * dt;
if(_vkeyboard[VK_q]) if(_vkeyboard[VK_q])
if(_grille[coorGaucheB] == 0 && (decalageLargeurB < decalageGB || decalageLargeurB > decalageDH)) // collision à gauche du plateau if((_grille[coorGaucheB] == 0 || _grille[coorGaucheB] == 3) && (decalageLargeurB < decalageGB || decalageLargeurB > decalageDH)) // collision à gauche du plateau
_herosB.x -= vitesse * dt; _herosB.x -= vitesse * dt;
if(_vkeyboard[VK_s]) if(_vkeyboard[VK_s])
if(_grille[coorBasB] == 0 && (decalageLongueurB < decalageGB || decalageLongueurB > decalageDH)) // collision en bas du plateau if((_grille[coorBasB] == 0 || _grille[coorBasB] == 3) && (decalageLongueurB < decalageGB || decalageLongueurB > decalageDH)) // collision en bas du plateau
_herosB.z += vitesse * dt; _herosB.z += vitesse * dt;
printf("==== Héros B ====\n li = %d, col = %d\n=================\n", (int)(zB + .5f), (int)(xB + .5f));
/* Affichage Debug */
printf("==== Héros B ====\n li = %d, col = %d, pos = %d\n=================\n", (int)(zB + .5f), (int)(xB + .5f), _herosB.position);
printf("zA=%f xA=%f\n", zB, xB); printf("zA=%f xA=%f\n", zB, xB);
printf("d=%d h=%d g=%d b=%d\n", coorDroiteB, coorHautB, coorGaucheB, coorBasB); printf("d=%d h=%d g=%d b=%d\n", coorDroiteB, coorHautB, coorGaucheB, coorBasB);
/* Anti-collision entre joueurs */
if(_herosB.position != coorJoueurB) {
if(_herosB.position != -1)
_grille[_herosB.position] = 0;
_herosB.position = coorJoueurB;
_grille[coorJoueurB] = 3;
}
} }
/*!\brief Fonction appelée à chaque display. */ /*!\brief Fonction appelée à chaque display. */