Bonjour.
Il semblerait que j'ai un problème d'arrondi dans l'un de mes codes.
Voici les lignes en cause (toutes les variables sont de type long) :
Ce code sert à calculer à partir d'un numéro d'index des coordonnées dans un sprite. L'image est découpée en plusieurs cases en hauteur et largeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 long tileX = spriteTile % (sprite->info.Width / sprite->tile.x); long tileY = spriteTile / (sprite->info.Width / sprite->tile.y);
A priori, il me semble que tileX et tileY contiennent strictement une valeur entière.
spriteTile = numéro d'index.
sprite->info.Width = largeur du sprite en pixel, dans le cas présenté plus bas, 216 pixels.
sprite->tile.x = largeur d'une case.
sprite->tile.y = hauteur d'une case.
L'indexation est de ce type (exemple) :
00 - 01 - 02 - 03
04 - 05 - 06 - 07
08 - 09 - 10 - 11
12 - 13 - 14 - 15
Le 00 renvoie les coordonnées (0,0), le 09 (1,2), le 15 (3,3), etc...
Ces coordonnées sont ensuite traitées pour un affichage de sprite qui ne pose pas de problème.
Lorsque je laisse les calculs de tileX et tileY tels que présentés plus haut, ça bugue :/ .Visuellement, ce problème cause ceci :
Voici le sprite original, de taille 216x48 :
Voici les images affichées pour sprite->tile.x = 24 et sprite->tile.y = 48, et spriteTile de 0 à 8 (le noir n'est pas le fond d'écran, mais ce qui m'est affiché par le sprite) :
Image affichée pour sprite->tile.x = 24 et sprite->tile.y = 30 et spriteTile de 0 à 8
Lorsque je remplace ceci :
par cela, ou autres valeurs, tout fonctionne correctement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 long tileX = spriteTile % (sprite->info.Width / sprite->tile.x); long tileY = spriteTile / (sprite->info.Width / sprite->tile.y);
Et avec tileX de 0 à 8, j'obtiens :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 long tileX = 5; long tileY = 0;
Soit le sprite correctement affiché. D'où vient le problème ?
La fonction complète :
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 // On affiche une tile du sprite. // sprite = Pointeur vers les données du sprite. // spriteTile = Numéro de la tile à afficher. // positionX = Abscisse pour l'affichage de la tile. // positionY = Ordonnée pour l'affichage de la tile. void DXS_DrawSpriteTile(M2ESPRITE* sprite, long spriteTile, float positionX, float positionY) { RECT tile = {0}; spriteTile -= 1; long tileX = spriteTile % (sprite->info.Width / sprite->tile.x); long tileY = spriteTile / (sprite->info.Width / sprite->tile.y); tile.left = tileX * sprite->tile.x; tile.top = tileY * sprite->tile.y; tile.right = (tileX + 1) * sprite->tile.x; tile.bottom = (tileY + 1) * sprite->tile.y; // Mise à jour de la position du sprite pour l'affichage. sprite->position.x = positionX / sprite->scale.x; sprite->position.y = positionY / sprite->scale.y; // Affichage du sprite. sprite->sprite->Draw( sprite->texture, // Données sur la texture du sprite. &tile, // Rectangle source sur la texture. &sprite->center, // Position du centre du sprite, par rapport à // son bord haut gauche. &sprite->position, // Position du sprite. D3DCOLOR_ARGB( sprite->alpha, // Génère la couleur de diffusion et d'alpha. sprite->rouge, sprite->vert, sprite->bleu)); }
Partager