Développement SNES > PVSnesLib section Française

Sprites, adresse mémoire et gfxoffset

(1/4) > >>

ccc:
Bonjour,

Je vous soumets un nouveau probl?me sur lequel je bute en ce moment.
J'ai 3 sprites pour l'instant, un monstre, un ours et une "boulette". Je charge donc 3 images bmp, chacune des images contenant 9 étapes d'animation différentes (exactement comme dans l'exemple AnimatedSprite).

Donc pour charger mes sprites je fais la chose suivante

--- Code: ---char sprTiles[9]={0,2,4, 6,8,10, 12,14,32};  // Remeber that sprites are interleave with 128 pix width,
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, 0, 0x4000, OBJ_SIZE16);
oamInitGfxSet(&gfxpours, (&gfxpours_end-&gfxpours), &palours, 1, 0x4000+(&gfxpsrite_end-&gfxpsrite), OBJ_SIZE16);
oamInitGfxSet(&gfxpboulette, (&gfxpboulette_end-&gfxpboulette), &palboulette, 2, 0x4000+(&gfxpsrite_end-&gfxpsrite)+(&gfxpours_end-&gfxpours), OBJ_SIZE16);

--- Fin du code ---

Je fais donc 3 oamInitGfxSet, chacun ? son propre id de palette, et je commence ? les rentrer en 0x4000 puis le prochain sera en 0x4000+la taille des précédent sprites.

Et ensuite pour les afficher je fais :


--- Code: ---monster.gfx_frame = sprTiles[monster.anim_frame + monster.state*FRAMES_PER_ANIMATION ];
monster2.gfx_frame = 64+sprTiles[monster2.anim_frame + monster2.state*FRAMES_PER_ANIMATION ];
boulette.gfx_frame = 128+sprTiles[boulette.anim_frame + boulette.state*FRAMES_PER_ANIMATION ];
oamSet(0,  monster.x, monster.y, 3, monster.flipx, 0, monster.gfx_frame, 0);
oamSet(4,  monster2.x, monster2.y, 3, monster2.flipx, 0, monster2.gfx_frame, 1);
oamSet(8,  boulette.x, boulette.y, 3, boulette.flipx, 0, boulette.gfx_frame, 2);

--- Fin du code ---

Je décale donc de 64 pour le 2eme sprite, et de 128 pour le 3eme. Ce qui fait que la quatri?me étape d'animation du 1er sprite sera en 6, en 70 pour le 2?me et en 134 pour le 3?me.

Ca fonctionne au poil sous zsnes, sous bsnes j'ai un carré zébré ? la place de mon sprite de boulette, et sous no$snes le sprite de la boulette ne s'affiche pas du tout. 3 émulateurs différents et 3 rendus différents, je dois faire quelque chose de mal  :(
Sous les 3 émulateurs par contre les 2 permiers sprites s'affichent sans probl?me.
 
Je s?che complétement, j'ai relu 15 fois la partie "Sprite un vram" du wiki (http://www.portabledev.com/wiki/doku.php?id=sprites_en#sprites_in_vram) et il y a quelque chose qui m'échappe c'est certain  ???

Avec mes sprites de 16*16 je devrais ?tre dans ce cas l? :

--- Citer ---Similarly, when using 16×16 sprites, there will be 8 sprites interleaved, and the ninth sprite will have to start after them at offset 1024
--- Fin de citation ---
C'est pour ça qu'on passe de 14 ? 32 dans le tableau des offset j'imagine :
char sprTiles[9]={0,2,4, 6,8,10, 12,14,32};

J'ai essayé avec des tas d'offset différents, avec des adresses mémoires différentes, et le meilleur rendu que j'ai obtenu c'est avec le code indiqué plus haut, malheureusement il n'y a que zsnes qui semble en vouloir   :-\

Merci d'avance pour votre aide !

alekmaul:
Je dirais que déj?, oamInitGfxSet doit ?tre unique, ensuite utilise directement dmaCopyVRam, sinon tu va changer l'adresse de base (cf le code source de la lib).
Pour les palettes, idem et ensuite oamSet te permettra de jongler avec les bonnes palettes, comme tu as fait en passe de 0 ? 1 puis 2.
Enfin, faut pas ouliber une chose ultra importante sur SNES, la copie vers la vram doit ?tre utilisée juste apr?s une VBL, donc, juste avant linit, commence par un WaitForVBlank() et SetBrightness(0) pour forcer la VBL.

Enfin, bonne idée de tester sous bsnes, c'est le seul qui est vraiment SNES compliant. Perso, je debug avec no$sns mais la validation finale est toujours avec bsnes avant de passer sur console.

ccc:
Merci pour ton aide ! Mais j'ai peur d'avoir encore plein de questions  :-[

Si oamInitGfxSet n'est appelé qu'une seule fois je dois mettre tous mes sprites dans la m?me image j'imagine. Est-ce qu'il y une r?gle particuli?re pour construire cette image ?

En fait je peux peut-?tre m'inspirer du code de likemario.c pour le découpage :

--- Code: --- // Init Map to address 0x1000 and Copy Map to VRAM
    bgSetMapPtr(1, 0x1000, SC_64x32);
    for (i=0;i<31;i++) { // 128 pixel height -> 128/8 = 16 2400 / 8 = 300
        u8 *ptrMap  = &map + 300*i*2; // 300 = map size x *2 because each entry is 16bits length
        if (i>=16) ptrMap  = &map + 300*5*2; // Init anything else with white line
        u16 ptrVRAM = 0x1000+i*32; // screen begin to 0x1000
        dmaCopyVram(ptrMap, ptrVRAM, 32*2); // copy row to VRAM
        dmaCopyVram((ptrMap+32*2), (ptrVRAM+32*32), 32*2); // copy row to VRAM
    }
--- Fin du code ---
La c'est pour la map mais le m?me principe doit ?tre le m?me non ?

Bon je vais essayer de digérer tout ça  ;)

alekmaul:
non, non, tu mets pas tout dans la m?me images, il suffit que tu copie au bon endroit avec dmaCopyVRam.
Par exemple , si tu as 2 bitmaps, s1 et s2, voil? ce que tu peux faire :

--- Code: ---dmaCopyVram(adrgfx_s1, adrenvramcopie, sizeof(s1gfx));
dmaCopyVram(adrgfx_s1 adrenvramcopie+sizeof(s1gfx),sizeof(s2gfx));

--- Fin du code ---
Ainsi, tu copie ? la suite du premier.
Tu peux aussi fixer l'adresse vram "en dur" mais attention ensuite pour bien adresser le bon numéro de gfxset pour les sprites.
Et en copiant comme ça, tu peux faire plein de sprites en 16 couleurs différentes en adressant ensuite avec oamSet la bonne palette :).

ccc:
:'( J'y arrive toujours pas. Je suis un boulet je crois bien  :-[
Voil? ce que je fais :

--- Code: --- u16 adrenvramcopie=0x4000;
unsigned char palEntry;
WaitForVBlank();
setBrightness(0);
dmaCopyVram(&gfxpsrite, adrenvramcopie, sizeof(gfxpsrite));
dmaCopyVram(&gfxpours, adrenvramcopie+sizeof(gfxpsrite),sizeof(gfxpours));
dmaCopyVram(&gfxpboulette, adrenvramcopie+sizeof(gfxpsrite)+sizeof(gfxpours),sizeof(gfxpboulette));
palEntry = (128+0*16);
dmaCopyCGram(&palsprite, palEntry, OBJ_SIZE16);
palEntry = (128+1*16);
dmaCopyCGram(&palours, palEntry, OBJ_SIZE16);
palEntry = (128+2*16);
dmaCopyCGram(&palboulette, palEntry, OBJ_SIZE16);
--- Fin du code ---

Il n'y a plus d'oamInitGfxSet.
Maintenant mes sprites sont remplacés par des polices de caract?res  ;D
Par contre les palettes des sprites sont bien initilialisées je les retrouve dans no$sns.
Je garde bon espoir de comprendre un jour ceci dit  :)

Navigation

[0] Index des messages

[#] Page suivante

Sortir du mode mobile