PDA

Voir la version complète : [NDS][Aide] probleme de sprite


zeb
26/09/2006, 18h00
Bonjour, étant nouveau je vais commencer par me présenter
Donc moi c zeb, je commence dans le developpement DS : je me suis pour l'instant contenté de faire un pong (et oui faut bien commencer par le plus simple lol), pas de PAlib, je me suis inscrit ici car cette communauté a l'air d'etre active et voila je crois que c'est tout.

Mon probleme est le suivant :

Quand je veux mettre juste 1 sprite depuis un .pcx (64x64, 256 couleurs) ca marche tres bien
voila le code utilisé :

-------------------------------
SpriteEntry sprite[128];

sImage img;
loadPCX((u8*)img_pcx, &img);
imageTileData(&img);

int i;
for(i = 0; i < 32*64; i++)
SPRITE_GFX_SUB[i] = img.data16[i];
for(i = 0; i < 256; i++)
SPRITE_PALETTE_SUB[i] = img.palette[i];

sprite[0].attribute[0] = ATTR0_COLOR_256 | ATTR0_SQUARE | 0;
sprite[0].attribute[1] = ATTR1_SIZE_64 | 0;
sprite[0].attribute[2] = 0;
sprite[0].attribute[3] = 0;
-------------------------------

Par contre pour en mettre un deuxieme j'ai un souci. Plus précisément au niveau de la palette.
Pour SPRITE_GFX_SUB il suffit lors de la boucle for d'écrire SPRITE_GFX_SUB[i+32*64] = ...
et de donner comme valeur : sprite[1].attribute[2] = 128;
(et évidemment de ne pas superposer les 2 donc changer la valeur de x ou y)
Ca, ca marche.

ca nous donne donc comme code :

-------------------------------
sImage img1;
loadPCX((u8*)img1_pcx, &img1);
imageTileData(&img1);

int i;
for(i = 0; i < 32*64; i++)
SPRITE_GFX_SUB[i+32*64] = img1.data16[i];
for(i = 0; i < 256; i++)
SPRITE_PALETTE_SUB[i] = img1.palette[i];

sprite[0].attribute[0] = ATTR0_COLOR_256 | ATTR0_SQUARE | 100; //changement de valeur pour y
sprite[0].attribute[1] = ATTR1_SIZE_64 | 0;
sprite[0].attribute[2] = 128;
sprite[0].attribute[3] = 0;
-------------------------------


J'ai donc essayer de calquer ce que je faisais avec SPRITE_GFX_SUB pour SPRITE_PALETTE_SUB mais ca ne marche pas, ca met bien une image de la bonne taille au bon endroit mais pour les couleurs c'est n'importe quoi.

Donc si qqun a une réponse a mon probleme, j'en serais tres heureux :)

Pitt
26/09/2006, 19h27
Salut ! Tiens un codeur qui n'utilise pas PAlib ! Ca devient rare ;) !
Je pense que ton problème vient du fait que tu écrases ta 1ère palette avec la 2ème ; donne-nous le code complet pour qu'on y voit plus clair.

EDIT : dans le code qui est au dessus, tu as utilisé des "sprite [0]" !? Il faut utiliser un autre sprite sinon ça va pas fonctionner ...

zeb
26/09/2006, 20h07
Je pense que ton problème vient du fait que tu écrases ta 1ère palette avec la 2ème ; donne-nous le code complet pour qu'on y voit plus clair.

oui je pense aussi que ca l'ecrase c'est pour ca que j'avais essayer d'ecrire :

for(i = 0; i < 256; i++)
SPRITE_PALETTE_SUB[i+256] = img1.palette[i];

En faisant ca, ca n'ecrasais pas la palette de la premiere image (sprite[0]) qui s'affichait donc correctement mais je ne sais pas comment "dire" a la 2e image (sprite[1]) qu'il faut utiliser la palette allant de SPRITE_PALETTE_SUB[256] a SPRITE_PALETTE_SUB[256*2].
(a moins qu'il faille faire autrement)

dans le code qui est au dessus, tu as utilisé des "sprite [0]" !? Il faut utiliser un autre sprite sinon ça va pas fonctionner ...

Non jme suis trompé, pour aller plus vite j'ai fait un copier/coller a partir du 1er exemple et puis j'ai oublié de changer le nom du sprite. Donc en fait pour "img1" il faut mettre sprite[1] a la place de sprite[0].

Bref ca donne sans erreur (pour y voir plus clair) :

-------------------------------
SpriteEntry sprite[128];

sImage img;
loadPCX((u8*)img_pcx, &img);
imageTileData(&img);

int i;
for(i = 0; i < 32*64; i++)
SPRITE_GFX_SUB[i] = img.data16[i];
for(i = 0; i < 256; i++)
SPRITE_PALETTE_SUB[i] = img.palette[i];

sprite[0].attribute[0] = ATTR0_COLOR_256 | ATTR0_SQUARE | 0;
sprite[0].attribute[1] = ATTR1_SIZE_64 | 0;
sprite[0].attribute[2] = 0;
sprite[0].attribute[3] = 0;

sImage img1;
loadPCX((u8*)img1_pcx, &img1);
imageTileData(&img1);

int i;
for(i = 0; i < 32*64; i++)
SPRITE_GFX_SUB[i+32*64] = img1.data16[i];
for(i = 0; i < 256; i++)
SPRITE_PALETTE_SUB[i] = img1.palette[i]; // -> avec ca:c'est la 1ere image qui foire
/* ou bien SPRITE_PALETTE_SUB[i+256] = ... -> avec ca:c'est la 2e*/

sprite[1].attribute[0] = ATTR0_COLOR_256 | ATTR0_SQUARE | 100; //changement de valeur pour y
sprite[1].attribute[1] = ATTR1_SIZE_64 | 0;
sprite[1].attribute[2] = 128;
sprite[1].attribute[3] = 0;
-------------------------------

Mollusk
26/09/2006, 20h11
Par défaut, tu n'as qu'une palette pour tous les sprites d'un écran donné... Donc il faut que tes sprites utilisent la meme palette, ce qui implique (il me semble) un pré-formattage/pré-conversion avant d'inclure dans ta rom...

Si tu veux convertir du format PCX à un format DS-friendly (pour ainsi dire), il faudra te rabattre sur gfx2gba (qui ne fait pas que de la gba...), GBAGraphics (qui porte mal son nom, en fait, lui aussi ^^), ou PAGfx (qui n'est pas fait que pour PAlib)...

Si tu veux conserver tes fichiers PCX, comme je n'ai jamais utilisé ce format je ne saurai pas te conseiller, désolé !

Après, il existe une méthode pour avoir en fait 16 palettes de 256 couleurs (le mode palettes étendues), mais là tout de suite de tete je vais avoir du mal à te refiler du code :s

Salut ! Tiens un codeur qui n'utilise pas PAlib ! Ca devient rare ! C'est clair :) Mais il en faut aussi, courage ;)

Pitt
26/09/2006, 20h16
Bon bah j'ai été grillé ^^ Utilise GBAGraphics : ça te simplifiera bien la vie !
Bonne prog !

zeb
27/09/2006, 00h41
ok merci beaucoup je vais essayer tout ca :D

zeb
27/09/2006, 14h46
Tout ca a encore soulevé une ou deux interrogations :

- avec GBA Graphics, ca me crée les 3 fichiers pour la map, les tiles et la palette, mais je les utilise comment? En cherchant, j'ai vu que y'avait un prog (all.exe) qui les compilaient en un .h mais le lien ne marche pas :(
(et a propos de gbagraphics, pour 'type de map' il faut choisir 8/16/32 bits?)

- sinon j'ai essayé avec le mode palette étendue, donc pour ca j'ai ajouté une vram (a savoir VRAM_I_SUB_SPRITE_EXT_PALETTE), un flag dans SUB_DISPLAY_CR (qui est : DISPLAY_SPR_EXT_PALETTE) et mit dans sprite.attribute[2] le flag ATTR2_PALETTE(n) ou j'ai essayé toutes les valeurs de n possibles (donc 0 a 15) sans succes non plus lol

Donc si qqun pouvait m'aider, que j'en finisse avec ces problemes de sprite et que je puisse m'attaquer a des choses plus interressantes! lol
merci

[EDIT] bah pour ce qui est de GBAgraphics, probleme résolu (d'ailleurs c'est tellement simple a utiliser que je ne comprends pas pourquoi j'ai pas trouvé tout de suite :/ )
pour les palettes étendues, je peux faire sans mais bon par curiosité ... :)