Bonsoir à tous,
Tout d'abord, je dois avouer que mon titre est quelque peu obscur.
Dans le cadre d'un projet de Bomberman, je cherche à vérifier les collisions entre le joueur et les éléments fixes de la carte. Ces éléments sont stockés dans un tableau d'entiers à deux dimensions, et occupent chacun une case.
En revanche, les coordonnées de mon joueur qui se balade sont flottantes. Je dois donc faire interagir ici entiers et flottants.
Pour cela, je considère mon joueur comme une hitbox et je vérifie si chaque coin rentre dans une case. Pour plus de clarté, voici mon code :
Les messages d'erreurs envoyées à la console sont là pour le débug.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 /* bool checkCollisions(int x, int y, int offsetTable) Check collisions between an entity and the map offsetTable contain all offset (UP, DOWN, left, right) Return true if there is a collision, false either */ bool CMap::checkCollisions(float x, float y, float offsetTable[]) { // Init var for table int tableX = 0; int tableY = 0; // Init pos vars float posX = 0.f; float posY = 0.f; // UP left => x + offset left, y + offset UP posX = x + offsetTable[LEFT]; posY = y + offsetTable[UP]; // Table UP left tableX = (int)floor(posX); tableY = (int)floor(posY); // Check if (posX >= (float)tableX && posX <= (float)(tableX + 1) && posY >= (float)tableY && posY <= (float)(tableY + 1) && m_mapTable[tableY][tableX] != FREE) { cerr << "****************************************" << endl; cerr << "Collision top left" << endl; cerr << "posX : " << posX << " posY : " << posY << endl; cerr << "tableX : " << tableX << " tableY " << tableY << endl; cerr << "tableX + 1 : " << tableX + 1 << " tableY + 1 : " << tableY + 1 << endl; cerr << "****************************************" << endl; return true; } // UP right posX = x + 1.f - offsetTable[RIGHT]; posY = y + offsetTable[UP]; // Table UP right tableX = (int)floor(posX); tableY = (int)floor(posY); // Check if (posX >= (float)tableX && posX <= (float)(tableX + 1) && posY >= (float)tableY && posY <= (float)(tableY + 1) && m_mapTable[tableY][tableX] != FREE) { cerr << "****************************************" << endl; cerr << "Collision top right" << endl; cerr << "posX : " << posX << " posY : " << posY << endl; cerr << "tableX : " << tableX << " tableY " << tableY << endl; cerr << "tableX + 1 : " << tableX + 1 << " tableY + 1 : " << tableY + 1 << endl; cerr << "****************************************" << endl; return true; } // DOWN left posX = x + offsetTable[LEFT]; posY = y + 1.f - offsetTable[DOWN]; // Table bottom left tableX = (int)floor(posX); tableY = (int)floor(posY); // Check if (posX >= (float)tableX && posX <= (float)(tableX + 1) && posY >= (float)tableY && posY <= (float)(tableY + 1) && m_mapTable[tableY][tableX] != FREE) { cerr << "****************************************" << endl; cerr << "Collision bottom left" << endl; cerr << "posX : " << posX << " posY : " << posY << endl; cerr << "tableX : " << tableX << " tableY " << tableY << endl; cerr << "tableX + 1 : " << tableX + 1 << " tableY + 1 : " << tableY + 1 << endl; cerr << "****************************************" << endl; return true; } // DOWN right posX = x + 1.f - offsetTable[RIGHT]; posY = y + 1.f - offsetTable[DOWN]; // Table bottom right tableX = (int)floor(posX); tableY = (int)floor(posY); // Check if (posX >= (float)tableX && posX <= (float)(tableX + 1) && posY >= (float)tableY && posY <= (float)(tableY + 1) && m_mapTable[tableY][tableX] != FREE) { cerr << "****************************************" << endl; cerr << "Collision bottom right" << endl; cerr << "posX : " << posX << " posY : " << posY << endl; cerr << "tableX : " << tableX << " tableY " << tableY << endl; cerr << "tableX + 1 : " << tableX + 1 << " tableY + 1 : " << tableY + 1 << endl; cerr << "****************************************" << endl; return true; } return false; }
Ma fonction fonctionne presque, mais il a y un problème ( et il est de taille ) : parfois mon bomberman se coince juste après une collision et je ne peux le faire ressortir car chaque vérification suivante se heurte à la collision. Seulement, ça devrait être impossible de se coincer étant donné que ma fonction devrait retourner false lors de la vérification (donc à t-1, avant le mouvement) et le mouvement ne devrait pas se faire...
Voyez-vous des incohérences dans mon code ?.
Merci d'avance
EDIT : Bouarf, honte à moi ; lors de mon déplacement effectif dans ma classe joueur, je rajoutais un facteur de vitesse... Qui n'était pas pris en compte pour la vérification des collisions ! Résolu
Partager