Bonjour à tous !
Je m'occupe actuellement de la création d'un jeu en SDL. Pour gérer les collisions personnage/décor, j'ai recours à un tableau bidimensionnel, en int, dont les cellules vont prendre la valeur 0 en absence de sprite (zone walkable) et 1 en cas de sprite (zone non walkable).
Mes collisions fonctionnent bien, très bien ... à tel point qu'il y en a quand il n'en faut pas.
J'ai cherché l'origine du problème, et je me rends compte que lors du chargement de la map (par lecture de fichier) et par la même occasion lors du changement des valeurs du tableau ... certaines cellules du tableau prennent la valeur 1 alors qu'elles ne correspondent pas à une sprite (ni à l'affichage, ni dans le fichier ...).
J'ai donc testé le tableau avant l'affichage de la map, et tout était bien initialisé à 0. J'en ai donc conclu que le problème venait de mon algo qui permet de détecter sur quelle(s) cellule(s) se trouvent les sprites.
(Je précise que la taille des sprites est un multiple de la taille de chaque "bloc")
Voici mon code, qui pourtant me semble juste, mais qui semble poser problème :
Je précise que l'affichage des sprites ne pose aucun problème, et que les collisions avec les sprites non plus ... le problème est qu'il y a aussi des collisions dans le vide ^^.
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 void affichageMap(SDL_Surface *ecran, SDL_Surface *background, FILE* map, SDL_Surface *spriteChoisi[], int carte[][NB_BLOCS_H]) { //---- Déclaration des variables ----------------------------------------------- SDL_Rect position; int choixSprite = 0, position_x = 0, position_y = 0, largeur_sprite = 0, hauteur_sprite = 0; int l,h; //------------------------------------------------------------------------------ SDL_BlitSurface(background, NULL, ecran, NULL); //---- On lit le contenu du fichier & on affiche les sprites ------------------- if(map == NULL) { exit(EXIT_FAILURE); } while(!feof(map)) { fscanf(map, "%d %d %d %d %d\n", &choixSprite, &position_x, &position_y, &largeur_sprite, &hauteur_sprite); position.x = position_x; position.y = position_y; SDL_BlitSurface(spriteChoisi[choixSprite], NULL, ecran, &position); for(l = 0 ; l < (largeur_sprite / LARGEUR_BLOC) ; l++) { for(h = 0 ; h < (hauteur_sprite / HAUTEUR_BLOC) ; h++) { carte[(position.y / HAUTEUR_BLOC) + h][(position.x / LARGEUR_BLOC) + l] = 1; } } } fclose(map); }
Pour illustrer le problème :
Voilà un exemple d'affichage des sprites :
Affichage
Voilà les valeurs du tableau correspondant ... je ne comprends vraiment pas :
Valeurs du tableau
Gloups ?
Merci d'avance pour votre aide !
PS : si c'est pas clair, dites-le, je sais pas si c'est très compréhensible ^^
Partager