PDA

Voir la version complète : [GBA][Aide] Problème d'affichage de sprite


zoom*
06/09/2006, 14h36
Bonjour à tous. Je suis nouveau en programmation sur GBA et j'ai décidé d'utiliser VHAM pour un peut plus de simplicité :rolleyes:. Mais voilà, j'ai un souci pour l'affichage de mes sprites. Comme je fais un jeu de plateau avec des cases pouvant etre de couleurs differentes et positionnés aléatoirement j'ai décidé de les faire avec des sprites. Je charge donc des sprites models dans la OAM puis les reutilisent après. Pour les couleurs je charge une palette de 16 couleurs. Mais lorsque j'affiche le tout mes sprites sont comme compressé ou avec des bandes noires une fois sur deux. >(

Voilà le code:

ham_LoadObjPal16(&caisse_sol_16_Palette,1);

for(y=0;y<9;y++)
{
for(x=0;x<9;x++)
{
if (map[x][y]==0)
{
mysprites_sol[i] = ham_CreateObjFromGfxSlot(ham_CreateObjGfx(&caisse_sol_16_Bitmap,0,1,0),0,1,OBJ_MODE_NORMAL,0, 1,0,0,0,3,0,16*x,16*y);
i = i+1;
}
}
}

// Loop
while(TRUE)
{
// It's a new frame?
if(g_NewFrame)
{

i=0;
for(y=0;y<9;y++)
{
for(x=0;x<9;x++)
{
ham_SetObjXY(mysprites_sol[i],16*x,16*y);
i=i+1;
}
}

// Frames isn't new anymore
g_NewFrame=FALSE;
}
ham_FlipBGBuffer();
}

return 0;
}

Merci d'avance.

omg
06/09/2006, 15h07
Hum... comment defini tu tes sprites? et ta palette?
Montre moi tes fichiers de definitions de tes sprites ou tiles et je vais regarder.

zoom*
06/09/2006, 15h07
Je ne sais pas si ça peut aider mais j'ai mis un ham_SetBGMode(4) et j'effectue un ham_FlipBGBuffer à chaque cycle.

zoom*
06/09/2006, 15h15
Okay. Alors voici la palette:

const unsigned short caisse_sol_16_Palette[256] = {
0x08cd, 0x112f, 0x1951, 0x1573, 0x1d92, 0x1994, 0x29b2, 0x31d3,
0x21b4, 0x21d5, 0x2dd4, 0x25f6, 0x31f5, 0x3617, 0x2a18, 0x46dd,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
};


Et voici le sprite:

//
// caisse_sol_16 (256 uncompressed bytes)
//
const unsigned char caisse_sol_16_Bitmap[256] = {
0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c,
0x0d, 0x0a, 0x0a, 0x0c, 0x0c, 0x0b, 0x0b, 0x0d, 0x0c, 0x0a, 0x0c, 0x0a, 0x06, 0x02, 0x0c, 0x0c,
0x0d, 0x06, 0x06, 0x0d, 0x0c, 0x0c, 0x07, 0x07, 0x0a, 0x06, 0x0c, 0x07, 0x06, 0x02, 0x0c, 0x0d,
0x0d, 0x0a, 0x06, 0x0d, 0x0c, 0x0c, 0x0c, 0x07, 0x07, 0x0a, 0x0c, 0x0d, 0x06, 0x02, 0x0c, 0x0d,
0x0d, 0x07, 0x06, 0x0d, 0x07, 0x0d, 0x0c, 0x0a, 0x0c, 0x06, 0x0c, 0x0d, 0x07, 0x01, 0x0e, 0x0d,
0x0d, 0x0a, 0x06, 0x0d, 0x0a, 0x0e, 0x0c, 0x0a, 0x0c, 0x04, 0x0a, 0x0d, 0x06, 0x02, 0x0b, 0x0d,
0x0d, 0x06, 0x02, 0x0b, 0x05, 0x0b, 0x09, 0x08, 0x0b, 0x04, 0x0a, 0x0d, 0x08, 0x02, 0x09, 0x0c,
0x0d, 0x0a, 0x03, 0x0b, 0x05, 0x0b, 0x09, 0x05, 0x05, 0x03, 0x05, 0x0b, 0x09, 0x02, 0x08, 0x0b,
0x0e, 0x09, 0x03, 0x09, 0x01, 0x05, 0x03, 0x03, 0x05, 0x03, 0x05, 0x0d, 0x05, 0x02, 0x08, 0x0e,
0x0e, 0x05, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x0c, 0x05, 0x01, 0x09, 0x0e,
0x0e, 0x05, 0x03, 0x03, 0x00, 0x05, 0x05, 0x04, 0x05, 0x02, 0x04, 0x09, 0x03, 0x01, 0x09, 0x0e,
0x0e, 0x09, 0x01, 0x02, 0x01, 0x05, 0x03, 0x02, 0x02, 0x01, 0x02, 0x08, 0x02, 0x00, 0x08, 0x0e,
0x0e, 0x09, 0x00, 0x01, 0x00, 0x04, 0x02, 0x01, 0x01, 0x01, 0x01, 0x04, 0x02, 0x00, 0x06, 0x0d,
0x0e, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x04, 0x0d,
0x0e, 0x0e, 0x09, 0x09, 0x08, 0x0b, 0x0a, 0x08, 0x09, 0x08, 0x04, 0x04, 0x04, 0x02, 0x0a, 0x0b,
0x08, 0x0e, 0x0e, 0x0b, 0x0b, 0x0e, 0x0e, 0x0b, 0x0b, 0x0e, 0x0e, 0x0b, 0x09, 0x09, 0x09, 0x08
};


Il faudrait que la palette ne fasse que 16 au lieu de 256?

Dr.Vince
06/09/2006, 15h15
le mode est pas important vu que tu utilises les spirtes

par contre comment génère tu tes gfx ???

[EDIT] oui 16 au lieu de 256, exactement !!!!

zoom*
06/09/2006, 15h19
C'est-à-dire comment je gère mes gfx? Je ne vois pas comment avoir qu'une palette de 16 à moins d'éditer le fichier et de dégagé moi-même les zones vides.

Dr.Vince
06/09/2006, 15h23
C'est-à-dire comment je gère mes gfx? Je ne vois pas comment avoir qu'une palette de 16 à moins d'éditer le fichier et de dégagé moi-même les zones vides.

génère....

comment tu passe de tes fichiers bmp aux fichiers .c ???

zoom*
06/09/2006, 15h24
Oups j'ai mal lu c'est "génère"! Alors je les faits sous photoshop, je les enregistre en gif 256 couleurs puisque qu'il le fait tres bien (contrairement a mspaint) puis j'ouvre mspaint pour enregistré em bmp 256 couleurs. Ensuite j'ouvre startham.exe et je tape gfx2gba -fsrc -pma_palette mon_image.bmp

Dr.Vince
06/09/2006, 15h33
bon alors déjà photoshop te permet d'enregistrer directement en bmp 256.

ensuite ta commande gfx2gba n'est pas correct, essaye :


gfx2gba -align -c16 -D -fsrc -t8 -pma_palette.pal mon_image.bmp


et sinon tu te fais un joli .bat pour que ce soit plus pratique :


path = "C:\HAM\vham\bin"
gfx2gba -align -c16 -D -fsrc -t8 -pma_palette.pal mon_image.bmp
pause


ha oui, et si tu veux comprendre quelque chose aux options que j'ai mis : http://www.aaronrogers.com/ham/gfx2gba_readme.php

zoom*
06/09/2006, 16h16
Merci ça fonctionne, par contre je ne vois pas trop à quoi servent -align et -D? J'ai lu ce que le lien que tu m'as donné: a quoi ça sert de ne pas sauvegardé les donnés de la carte?

Brunni
06/09/2006, 16h38
Au passage, GBA Graphics gère lui-même la réduction de couleurs. Tu peux donc directement utiliser des PNG ou bitmaps 24 bits sans avoir à passer par photoshop ^^

Dr.Vince
06/09/2006, 17h04
Merci ça fonctionne, par contre je ne vois pas trop à quoi servent -align et -D? J'ai lu ce que le lien que tu m'as donné: a quoi ça sert de ne pas sauvegardé les donnés de la carte?

bah -align c'est pour aligner les données en mémoire, car il se peut que parfois tes données ne soit pas alignés et alors tes gfx sont pas affichés proprement. C'est une sécurité, je te conseille fortement de le mettre.

et -D bah.... pour des sprites y a pas de map v_v

Mollusk
06/09/2006, 17h08
Pareil avec PAGfx, mais on s'en fout ^^

-align, tu devrais le mettre, ca align les données de tes sprites et ca évite certains bugs qui peuvent apparaitre un peu aléatoirement avec des sprites décallés (pas si aléatoires, mais quand on comprend pas ca en a l'air ^^). En gros, te pose pas de question, c'est mieux avec ca et ca change rien pour toi ^^

Sinon, sur le .txt :
-D will disable map output at all
Comme tu fais des sprites, tu n'as pas besoin de map (plan/carte), qui n'est que pour les fonds... Donc en gros -D pour faire des sprites, on pourrait dire ^^ (corrigez-moi si erreur, ca fait une éternité que je n'ai pas utilisé gfx2gba :s)


En pratique, je te conseillerais d'utiliser GBA Graphics, PAGfx, ou Gfx2gba Frontend, parce que le gfx2gba de base c'est quand même un peu violent je trouve :/

edit : bon ben grillé Dr Vince, sauf que son message à lui il est plus court et plus clair, donc je m'écrase ^^

Brunni
06/09/2006, 17h56
Au passage, pour l'alignement (pour éviter les problèmes que Dr. Vince t'as cités), depuis GBA Graphics il faut cliquer sur "Plus..." (ou depuis "Fichier", "Plateformes", "Game Boy Advance") et cocher la case "__attribute((aligned(4)))" ^^

Dr.Vince
06/09/2006, 18h13
je sais pas si vous avez remarqué mais c'est quoi tout ces messages de spam pour gbagraphics ???:lol: :lol:

nan sans déconner, gfx2gba c'est plus mieux que vos logiciels que vous avez fait vous mêmes :p :p

mais où s'arrêtera le troll sur ce forum ???