Voir la version complète : [GBA][Aide] Plotter un pixel en mode 4 bits
J'en peux plus c'est plus possible je viens d'y passer ma soirée je vais casser mon pc je vais pas pouvoir dormir cette nuit. >( >( >(
Bon ... hum ... salut à tous ! :whst:
J'ai un peu honte, mais j'aimerai que quelqu'un me file une fonction de plottage pour bg 4 bits sur Gba, qui fonctionne avec DevkitArm r19b (j'en viens à penser que ca viens du compilo). :)
J'en ai bien une qui théoriquement est bonne, qui marche sur DS, mais impossible de la faire fonctionner sur Gba, le compilateur faisant n'importe quoi avec les "ou binaires" et transformant des valeurs 16 bits en 32 bits... <_<
Merci (beaucoup) d'avance. ^^
en mode 4 bit ou en mode 4 ? Le second me "parle" mais pas le premier :p
Mode 4 bits, ou mode "16 couleurs".
Alekmaul
18/09/2006, 09h38
OK, mais comme dis DJP, en mode tile ou bitmap 16 couleurs ?
Le mode bitmap 16 couleurs n'existe pas il me semble... enfin, oui, c'est en mode tiles.
Pour plotter un pixel en mode 0 tu n'as pas d'autre choix que de plotter la tile qui lui correspond.
Le problème c'est que si cette tiles n'est pas unique, tu te retrouverais avec ce pixel modifié sur toutes les autres...
C'est ce que j'ai fait pour Picross Advance (même si c'était en Dragon Basic)
Ben tu peux ripper le code de PAlib, j'ai un mode 4bit pour afficher du texte :)
Sinon, poste le code ici pour voir
DJP : suffit d'avoir que des tiles différentes et tu plottes sans soucis ;)
Ben tu peux ripper le code de PAlib, j'ai un mode 4bit pour afficher du texte :)
Sinon, poste le code ici pour voir
DJP : suffit d'avoir que des tiles différentes et tu plottes sans soucis ;)
Tu peux m'indiquer où dans Palib, je n'ai pas trouvé ... :D
Sinon voilà ma fonction:
void PlotOnTiles4(u8 *buf, u16 x, u16 y, u16 w, u8 color)
{
u16 pixaddr;
u16 *pixels;
u16 padding;
pixaddr = (((y / 8) * (w / 8) + (x / 8)) * 64 / 2) + (((y % 8) * 8 + x % 8) / 2);
pixels = (u16*)(buf + pixaddr);
padding = (x % 4) << 2;
*pixels &= ~(0xF << padding);
*pixels |= color << padding;
}
Je suis embarrassé, en fait je viens de regarder, et... je viens de voir que je n'avais pas mis la fonction pour plotter un seul pixel (mais je l'avais faite quand j'avais testé :/)
Par contre, les fonctions pour initialiser les tiles, et pour plotter 8 pixels (donc savoir à quel endroit plotter) y sont, ca peut toujours servir...
Fichier PA_16c.h
Merci, mais le problème a bien l'air d'être dans la lecture depuis la Vram du pixel, et dans le | binaire... Je vais "essayer" de faire la fonction en assembleur...
Ben la lecture est pas bien méchante quand tu as le bon emplacement... en 16bit, ca te fait lire 4 pixels d'un coup...
donc ca doit etre du genre
decal = (pixel&3)*4; // combien-t-ième pixel sur les 4
u16 pixels = vram[slot]&(~(15<<decal)); // on efface le pixel, donc on garde tout le reste
vram[slot] = pixels|(couleur<<decal); // on rajoute la couleur...
En gros, non ? Et si tu veux en 32 bit, tu fais &7 pour la position sur 8, et u32 pixels...
Ben non ca ne marche toujours pas, ca me fait des lignes (plot réussi, plot réussi, remise à 0, remise à 0 : || || || || ...)
J'y comprends vraiment rien là ... Ton "pixel" c'est quoi ? l'adresse du pixel, sa valeur X, ..?
pixel : valeur X du pixel (pas clair mon truc ^^)
Donc ca ne marche pas... Et pourtant ca marche sur DS. Problème de Devkitpro alors ?
bizarre ca :/ je ne vois pas trop pourquoi devkitpro poserait problème en fait
Pour plotter un pixel en mode 4 bits, il faut lire 16 bits, supprimer le pixel en question, le remettre, puis réécrire 16 bits.
Or, à chaque fois que l'adresse est impaire, la fonction lit une valeur bizarre (style 0xff0000ff) qui ne fait meme pas 16 bits...
Edit: bon ben voilà je me suis donné la solution tout seul, une adresse 16 bits ne peut pas être impaire, donc j'ai ajouté un & ~1 à la fin du calcul de l'adresse et ca marche. :| Merci quand meme de ton aide Mollusk ! :)
vBulletin® v.3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org