1

salut à tous ! je suis en train de me prendre la tête avec les palettes de la GP je travaille ne 8bits et j'aimerai faire un effet tout con de rotation de palette (genre une rivière qui coule en >> les couleurs bleus par exemple) mais je galère sad si kk'1 à une idée ou une piste à me donner ça m'aiderai bien smile
avatar
space reporter

2

essai de faire varier les couleurs de ta palette à intervalle regulier, puis reviens a la couleur d'origine quant tu a atteint la couleur limite (ou inverse le sens de la variation)

par contre tu va devoir attendre le vblank avant de changer les couleurs, sinon ca se vera (koi que peut etre pas si c pour 3 ou 4 couleurs :-)

apres je l'ai jamais fait grin ptet c pas comme ca ^^

tu devrais demander a JyCet smile
et la le mec il le pécho par le bras et il lui dit '

3

Explication pour tt le monde de comment faire une rotation de palette en mode 8Bits avec la GP32.
Si un modo veut le mettre en post-it ça pourra peut etre aider d'autre personne smile

1- la palette 8Bit (256 couleurs) est TOUJOURS localisé a cette adresse memoire 0x14a00400
2- comme l'a dit rov il faut definir 1 ou X index dans la palette que l'ont va simplement modifier directement là ou le LCD va chercher ses billes.
3- faire un petit tableau des couleurs qui devoir etre utilisées.

concretement:

long *pal = (long *)0x14a00400; // pointeur qui donne acces directement a la palette 8bit a mettre en debut de gpmain.c
#define ROTATION 254 // la couleur index 254 sera celle qui aura une rotation
[4]static unsigned int rotation_palette = {0xFFC1, 0xFBC1, 0xF801, 0xFBC1}; // tableau des couleurs a appliquer consecutivement sur l'index 254
unsigned char rotation_pal; // petite variable qui va se balader dans le tableau rotation_palette

au depart avant un boucle il faut biensur initialiser rotation_pal donc :
rotation_pal=0;
ensuite dans la boucle ou la rotation doit se faire il faut simplement faire ceci:
pal[ROTATION]=rotation_palette[rotation_pal]; // changement directement la couleur index 254 du LCD avec celle de rotation_palette[rotation_pal]
++rotation_pal; // qui dit rotation dit obligatoirement changement de valeur quelque part bin c'est ici smile
rotation_pal&=3; // histoire de boucler la boucle smile, dés que rotation_pal=4 il revient a 0 avec ça operateur binaire je crois que ça s'appelle


C'est fini!

4

ok merci Jycet , j'avias bien compris le principe mais je bloquais quelque part , en fait dans ma fonction je choisissais un champ de couleur à modifier et ça n'allais pas , là grace à ton code je comprends mieux , je vais finir ma fonction et je la post ici smile
avatar
space reporter

5

Oui mais là si j'ai bien compris tu ne modifie qu'une couleur de la palette (la 254).. faudrait faire ça avec plusieurs index non ?

6

Bon voici mon petit code smile

#define Pindcol 6 //premier indice couleur à modifier #define Findcol 9 //dernier indice couleur à modifier //déclaration dans Gpmain int a,nbcol,rotpal,nTick; long *pal = (long *)0x14a00400; nbcol=(Findcol-Pindcol)+1; //nbcol : nombre de couleur de la palette à tourner unsigned int tabcol[nbcol];  for(i=0;i<=nbcol;i++) //boucle qui va sauvegarder le segment de couleur à faire tourner dans le tableau tabcol     {       tabcol[i]=pal[Pindcol+i];     }              rotpal=0; //                //dans le while(1)     //rotate couleur :)  for (a=0;a<=nbcol;apal++)     {         nTick = GpTickCountGet(); //pour tester j'ai ralenti la gp avec gptickcount          pal[Pindcol+apal]=tabcol[rotpal]; // changement des valeurs directement dans la palette          ++rotpal;          if (rotpal==nbcol) rotpal=0;         while ((GpTickCountGet() - nTick) < 30);      }   

je me base sur deux indice Pindcol et Findcol , on choisi les 2 couleurs de la palette à tourner (dans les 256 possible) smile

il fonctionne bien ,reste plus qu'a ralentir la variation de couleur sans ralentir tout le programme : là j'ai utilisé GPtickcount pour tester mais je vais encore optimiser pour en faire une fonction à appeller pour rouler plusieurs couleur smile



EDIT: bon en fait c foireux j'ai une couelur en trop dans mon champ sad
avatar
space reporter

7

il y a plus simple et sous forme de fonction:

long *palette = (long *)0x14a00400;

void rotate_pal(byte start, byte end)
{
byte i;
long pal_temp;
pal_temp=palette[end];
for (i=0;i<(end-start);i++) palette[end-i]=palette[end-i-1];
palette[start]=pal_temp;
}

j'ai pas testé mais l'idée est là.

8

bon Coderman tu porte bien ton nom ! Ta fonction est nickel elle marche bien , merci wink

avatar
space reporter

9

Apparemment JimSifu avait un pb de vitesse, il a du ralentir ac gptickcountget, mais toi j'ai beau cherché je vois pas de "limitation de vitesse", ça devrait être trop rapide non ? (flemme de tester tongue)

10

jimsifu: de rien ;-)
marc: pourquoi limité ou ralentir la vitesse? suffit juste d'utilisé cette routine à la fin du chaque traitement d'image. Si ton jeu tourne sans cette effet à 50 images par seconde, cela veut dire que ta palette va tourné 50 fois pas seconde. c simple, si c'est trop rapide, suffit d'apeller cette routine 1 fois tous les 2 images, ou une fois tout les 3 images, ca dépend de l'utilisation.

11

ouais c clair niveau vitesse si ya juste un sprite ou un BG à afficher avec la fontion c hyper rapide, suffit de faire comme coderman le dit, moi j'avais rajouter gptick juste pour tester smile
avatar
space reporter

12

si tu peux eviter d'utiliser les xxTICK alors evites smile
preferes les bons vieux compteurs . sache que au maxi tu auras +52 a ton compteur pour chaque seconde ecoulé
moi j'utilise les TICK uniquement si je veux faire un affichage approximatif des FPS sinon compteur smile

13

ouais c'est ce que je compte faire wink merci du conseil pour le 52 , c'est parfait maintenant
avatar
space reporter