Bonjour à tous,
Je débute en SDL et j'ai entrepris la création d'un Pacman comme premier projet.
La gestion des collisions marche impeccable mais est malheuresement trop "rigide". Le joueur doit être placé pil poil au pixel près pour pouvoir se déplacer, pas vraiment pratique si l'on doit tourner en vitesse car on n'est poursuivi par les fantômes. J'aimerai donc donner une meilleure "flexibilité" au joueur. Comment puis-je m'y prendre ?
Voici mes 2 classes principales et la méthodes main.
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 ... Labyrinthe lab1... ... switch(event.key.keysym.sym){ case SDLK_ESCAPE : boucleJeu = false; break; case SDLK_UP : if((lab1.gestionCollision(posPacman.x, posPacman.y,HAUT))==false){ cout << "collisionHaut" << endl; } else{ posPacman.y-=2; } break; case SDLK_DOWN : if((lab1.gestionCollision(posPacman.x, posPacman.y,BAS))==false){ cout << "collisionBas" << endl; } else{ posPacman.y+=2; } break; case SDLK_LEFT : if((lab1.gestionCollision(posPacman.x, posPacman.y,GAUCHE))==false){ cout << "collisionGauche" << endl; } else{ posPacman.x-=2; } break; case SDLK_RIGHT : if((lab1.gestionCollision(posPacman.x, posPacman.y,DROITE))==false){ cout << "collisionDroite" << endl; } else{ posPacman.x+=2; } break; } break; }
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 bool Labyrinth::gestionCollision(int i, int j, Direction direction) { char caractere1 = ' '; char caractere2 = ' '; int caseSuivante=1; if((direction==GAUCHE)||(direction==DROITE)){ // Si on est à la bonne hauteur if(j%TAILLE_BLOC==0){ if(i%TAILLE_BLOC==0){ caractere1 =getElement(i/TAILLE_BLOC, j/TAILLE_BLOC,direction); } } // caractere1 : Mise à la bonne hauteur // caractere2 : Verification de la case en dessous else{ if(i%TAILLE_BLOC==0){ j = j - j%TAILLE_BLOC; caractere1 =getElement(i/TAILLE_BLOC, j/TAILLE_BLOC, direction); caractere2 =getElement(i/TAILLE_BLOC, j/TAILLE_BLOC+caseSuivante, direction); } } } if((direction==BAS)||(direction==HAUT)){ // Si on est à la bonne largeur if(i%TAILLE_BLOC>=0){//&&(i%TAILLE_BLOC<=4)){ // Un peu de "jus" à Pacman if(j%TAILLE_BLOC==0){ caractere1 =getElement(i/TAILLE_BLOC, j/TAILLE_BLOC,direction); } } // caractere1 : Mise à la bonne hauteur // caractere2 : Verification de la case en dessous else{ if(j%TAILLE_BLOC==0){ i = i - i%TAILLE_BLOC; caractere1 =getElement(i/TAILLE_BLOC, j/TAILLE_BLOC, direction); caractere2 =getElement(i/TAILLE_BLOC+caseSuivante, j/TAILLE_BLOC, direction); } } } // Le switch prend en compte si Pacman est entre deux blocs switch(caractere2){ case ' ' : // Si pastille if(caractere1==' '){ return true; // Si vide }else if(caractere1=='0'){ return true; }else { return false; } } return false; }
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 char Labyrinth::getElement(int i, int j, Direction direction) { int dimX = dimensionX / TAILLE_BLOC; int dimY = dimensionY / TAILLE_BLOC; if((i <= dimX)&&(j <= dimY)) // On vérifie si l'élément est bien dans la map { int emplacement; // positionCourante, haut, bas, gauche, droite int dx[]={ 0, 0, 0, -1, 1 }; int dy[]={ 0, -1, 1, 0, 0 }; int x=i+dx[direction], y=j+dy[direction]; // par rapport à l'autre méthode, on intervient en amont emplacement = y*dimX+x; return map.at(emplacement); // Afficher un seul élément d'un string } return '?'; }
Partager