PDA

Voir la version complète : [GBA][Aide] Sprite et tableau


Neumann
25/04/2007, 15h21
Bonjour à tous !

EDIT: Voir plus bas...

Neumann
25/04/2007, 20h17
Face au nombre impressionant de réponses, j'ai décidé de re-re-faire mon code depuis le début, et ca y est ca fonctionne.

Cependant je laisse ce topic pour mes futurs problèmes dans l'élaboration de mon premier projet !

Pitt
25/04/2007, 20h43
Oh ! En 5 heures, en plein milieux de la semaine, et en plein milieux de l'après-midi, personne ne répond ?! Etrange !
:hmm: Peut-être qu'ils travaillent ! Ou bien qu'ils sont en vacances ! Ou bien qu'ils n'ont pas la réponse à ta question ! [...] Ou bien que tu n'as même pas filé ton code dans la question ! :hmm:

Neumann
25/04/2007, 21h14
Ma remarque n'était pas un reproche envers la communauté de PA, je me doute qu'ils ne sont pas connectés 24/24.

Pour ce qui est du code, je prefere ne pas rebuter les eventuelles aides en mettant l'intégralité de mon programme, j'ai donc mis la partie du code qui à mes yeux posait problème.

Mais à l'avenir pas de souci je mettrai tout mon code.


:D

Neumann
25/04/2007, 22h48
Bon beh voila j'ai encore un problème...
Voici tout d'abord mon code <complet> et commenté :D

#include <mygba.h>

#include "gfx/bg.raw.c"
#include "gfx/bg.pal.c"
#include "gfx/bg.map.c"
#include "gfx/pix.raw.c"
#include "gfx/obj.pal.c"
#include "gfx/corp.raw.c"

int i; //indice pour FOR
int k=0;
int compteur=0;
u8 x[]; //tableau des positons successives X de la tete
u8 y[]; //tableau des positons successives Y de la tete
u8 sprite[]; //tableau pr charger sprite ([0]=tete)
u8 sens[]; // tableau des sens successifs de la tete ([0]=actuel)


void vbl_func();
void input();
void update_position();
void decaler();
void show();


// Function: main()
int main()
{

x[0]=y[0]=50; //init position de la tete
sens[0]=0; //init du sens de deplacement (ici droite)

ham_Init();
ham_InitText(1);
ham_SetBgMode(1);
map_fragment_info_ptr bg_bg;

ham_LoadBGPal((void*)bg_Palette,256);
ham_LoadObjPal((void*)obj_Palette,256);

//init bg
ham_bg[0].ti = ham_InitTileSet((void*)bg_Tiles,
SIZEOF_16BIT(bg_Tiles),1,1);
ham_bg[0].mi = ham_InitMapEmptySet(3,0);
bg_bg = ham_InitMapFragment((void*)bg_Map,
30,20,0,0,30,20,0);
ham_InsertMapFragment(bg_bg,0,0,0);
ham_InitBg(0,1,1,0);
//fin init bg

sprite[0]=ham_CreateObj((void*)pix_Bitmap,OBJ_SIZE_16X16, 0,1,0,0,0,0,0,0,x[0],y[0]);//chargement de la tete

ham_StartIntHandler(INT_TYPE_VBL,(void*)vbl_func);

// Infinite loop to keep the program running
while(1) {}

return 0;
} // End of main()

void vbl_func() {

input();
update_position();
show();
decaler();
ham_CopyObjToOAM();

}

void input() {
if ((F_CTRLINPUT_UP_PRESSED)&&(sens[0]!=1)) sens[0]=3;
if ((F_CTRLINPUT_DOWN_PRESSED)&&(sens[0]!=3)) sens[0]=1;
if ((F_CTRLINPUT_LEFT_PRESSED)&&(sens[0]!=0)) sens[0]=2;
if ((F_CTRLINPUT_RIGHT_PRESSED)&&(sens[0]!=2)) sens[0]=0;
}

void update_position() {
if (sens[0]==3) --y[0];
if (sens[0]==1) ++y[0];
if (sens[0]==2) --x[0];
if (sens[0]==0) ++x[0];
//update position selon sens de deplacement
}


void decaler() {

// ce tableau mémorise les positions successives du centre la tete
// x[0] y[0] etant les coordonnées actuelles de la tete

x[1]=x[0]+8; // charge les positions du centre de la tete a la tete du tableau
y[1]=y[0]+8;

for (i=20; i>1; --i) { // decalage dans le tableau des autres positions
x[i]=x[i-1];
y[i]=y[i-1];
}


}


void show() {
ham_SetObjXY(sprite[0], x[0], y[0]);
ham_UpdateObjGfx(sprite[0], (void*)&pix_Bitmap[sens[0]*256]);
}

Mon idée de départ c'est de mémoriser dans un tableau les positions successives de la tete du serpent, ainsi les coordonnées du premier bout de corp par exemple, aura la meme position que la tete avait 8 coups avant.

Ce code marchait, puis j'ai voulu rajouter des fonctionnalités, et comme ca ne marchait pas je suis revenu au code initial (enfin je croyait). Or ca ne marche plus, alors que je me suis contenté de supprimer les lignes de code rajoutées entre temps.

Ce code sert donc juste à afficher et animer la tete en fonction de la direction choisie par le joueur. La fonction décaler ne sert a rien ici puisque j'ai enlever la partie du code qui utilise ce tableau pour afficher le premier bout de corps.

Lorsque j'enlève:
x[1]=x[0]+8; // charge les positions du centre de la tete a la tete du tableau
y[1]=y[0]+8;
du code, et bien cela fonctionne à merveille. Sinon la tête ne bouge plus au bout de qq milli-secondes. Je n'y comprends rien. Je ne vois pas en quoi ce bout de code influe sur le mouvement de la tete.

HLP


<edit>
J'ai rajouté l'intégralité des fichiers pour que vous puissiez voir concrètement ce qui se passe
</edit>


<edit_bis>
Par curiosité j'ai ajouté une ligne de code qui affiche la coordonnée Y du sprite de la tete.
Elle se comporte tres bizarrement; je descends l'ecran, tout va bien c'est logique. Mais quand je remonte en 0, et que je redescends, la coordonnée affiche des coordonnées genre 950...
En bougant un peu partout je note ceci, l'échelle des coordonnées change:

echelle normale:
haut de l'ecran => bas de l'ecran
0 => 100 => 160

echelle changée:
0 => 1000 => 160

De 0 a 100, la coordonnées affichée est y*10 puis a partir de 100 tout rentre dans lordre.

J'observe la meme chose avec la coordonnée X.

Ce qui est bizarre c'est que le sprite est correctement affiché donc la valeur affichée ne corresponds pas avec la coordonnée effective utilisée par la commande <ham_SetObjXY();>


</edit_bis>

Neumann
26/04/2007, 17h34
Bon et bien j'ai trouvé tout seul à force de tester et retester chaque partie du code.

Il fallait que je déclare la dimension du tableau.

Link Mauve
26/04/2007, 19h01
Pour le texte, c'est normal : il faut mettre un ou deux espaces après le texte sinon, il conserve le dernier caractère affiché (par exemple, tu affiche 100 puis 99, ton programme affiche 990 car tu n'as pas retiré le dernier 0 du 100...)