You are not logged in.
Bonjour,
Je début en programmation et travail sur l'affichage d'animation en .png
Je crée mon .png avec mes animations sous imagemagick, lorsque je veux les afficher avec grrlib j'ai un souci, celles-ci ne se suivent pas toujours.
Hello,
I 'm a beginer in programation and work on the display of animation .png
I create my .png with my animations under imagemagick, when I want to show them with grrlib I have a some time a bad result
pouvez-vous m'aider?
can you help me?
horizontal and vertical anim like it Good result
Bad result how I can do it to work left to right ligne by ligne????
I've an other question how I can do to have my musique again and again?
Comment puis-je faire pour avoir ma musique en boucle?
thank you and excuse for my bad English
Last edited by triki (2011-03-22 16:15:32)
Offline
Normalement pour faire une animation tu dois te servir de la fonction GRRLIB_DrawTile. Si tu veux un démo regarde l'exemple basic_drawing.
Offline
ok merci j'ai trouvé en faite je mettais une image suplémentaire ce qui saccadais mon animation
Last edited by triki (2011-03-22 17:00:37)
Offline
#include <stdio.h> #include <gccore.h> #include <ogcsys.h> #include <unistd.h> // lib principale #include <grrlib.h> #include <stdlib.h> #include <wiiuse/wpad.h> //les images stoqué .png #include "demofont.h" //pour afficher le texte. #include "player1_point.h" #include "mario.h" #include "luigi.h" #include "sols.h" #include <fat.h> // <- a must #define HOTSPOTX 48 // Cursor hot spot for x coordinate #define HOTSPOTY 48 // Cursor hot spot for y coordinate //#include "vecteurs.c" /* blitz3d offmariox=16 offmarioy=16 scl=16 ;taille de la grille periode=1 pMax=7 */ u16 offmariox=16; u16 offmarioy=16; u16 scl=16; //taille de la grille u16 periode=1; u16 pMax=7; //GRRLIB_LoadFileJPG(const char *filename) //old_anim ; anim ;periode ;frame ;frameMax ;no_bg u32 old_anim; u32 anim=1; //u32 periode; u32 frame=1; u32 frameMax=1; u32 no_bg; //using namespace std; #define NUM_STARS 2 #define NUM_bloc 86 typedef struct { u32 pad; u32 px; u32 py; u32 periode; u32 frame; u32 frameMax; u32 old_anim; u32 anim; u32 no_bg; } star; static star stars[NUM_STARS]; /* Function new_bloc(typ,Gx,Gy,anim,frame,fmax,hdlpnj) ;Gx et Gy commence a 1 a.bloc =New bloc a\typ=typ a\Gx=Gx-1 a\Gy=Gy-1 a\anim=anim a\frame=frame a\foff=frame a\fmax=fmax a\hdlpnj=hdlpnj Return Handle(a) End Function Type bloc Field typ,Gx,Gy,anim,frame,foff,fmax,hdlpnj End Type */ Mtx GXmodelView2D; typedef struct { u8 typ; u8 Gx; u8 Gy; u8 anim; u8 frame; u8 foff; u8 fmax; //,hdlpnj } Bloc; static Bloc LstBloc[NUM_bloc]; int main(int argc, char **argv) { float alpha=255; u8 *tex_logo; fatInitDefault (); // <- must be there before loading png //GRRLIB_texImg *tex_logo = GRRLIB_LoadTextureFromFile("sd:/logo.png"); //FromFile<- here it loads the png, be sure to input where the file is stored in your sd GRRLIB_texImg *demo_font = GRRLIB_LoadTexture(demofont); GRRLIB_InitTileSet(demo_font, 13, 23, 32); u32 i; // u32 scl=16; //i,blam; pour plusieurs var u32 pressed; u32 t=1; //gfh /* blitz3d For i=1 To 40 new_bloc(1,i,30,10,2,2,0) Next */ /* for(i=0;i<NUM_bloc;i++) { LstBloc[i].typ=1; LstBloc[i].Gx=i; LstBloc[i].Gy=25; LstBloc[i].anim=10; LstBloc[i].frame=2; LstBloc[i].foff=2; LstBloc[i].fmax=2; } */ for(i=0;i<30;i++) { LstBloc[i].typ=1; LstBloc[i].Gx=i; LstBloc[i].Gy=25; LstBloc[i].anim=10; LstBloc[i].frame=2; LstBloc[i].foff=2; LstBloc[i].fmax=2; } for(i=31;i<55;i++) { LstBloc[i].typ=1; LstBloc[i].Gx=1; LstBloc[i].Gy=i-30; LstBloc[i].anim=11; LstBloc[i].frame=3; LstBloc[i].foff=3; LstBloc[i].fmax=3; } for(i=56;i<80;i++) { LstBloc[i].typ=1; LstBloc[i].Gx=25; LstBloc[i].Gy=i-55; LstBloc[i].anim=11; LstBloc[i].frame=1; LstBloc[i].foff=1; LstBloc[i].fmax=1; } //new_bloc(2,5,28,1,1,1,0) //new_bloc(2,6,28,1,2,2,0) //new_bloc(2,7,28,1,3,3,0) //new_bloc(3,5,29,2,1,1,0) //new_bloc(3,6,29,2,2,2,0) //new_bloc(3,7,29,2,3,3,0) i=80; LstBloc[i].typ=1; LstBloc[i].Gx=5; LstBloc[i].Gy=23; LstBloc[i].anim=1; LstBloc[i].frame=1; LstBloc[i].foff=1; LstBloc[i].fmax=1; i=81; LstBloc[i].typ=1; LstBloc[i].Gx=6; LstBloc[i].Gy=23; LstBloc[i].anim=1; LstBloc[i].frame=2; LstBloc[i].foff=2; LstBloc[i].fmax=2; i=82; LstBloc[i].typ=1; LstBloc[i].Gx=7; LstBloc[i].Gy=23; LstBloc[i].anim=1; LstBloc[i].frame=3; LstBloc[i].foff=3; LstBloc[i].fmax=3; i=83; LstBloc[i].typ=1; LstBloc[i].Gx=5; LstBloc[i].Gy=24; LstBloc[i].anim=2; LstBloc[i].frame=1; LstBloc[i].foff=1; LstBloc[i].fmax=1; i=84; LstBloc[i].typ=1; LstBloc[i].Gx=6; LstBloc[i].Gy=24; LstBloc[i].anim=2; LstBloc[i].frame=2; LstBloc[i].foff=2; LstBloc[i].fmax=2; i=85; LstBloc[i].typ=1; LstBloc[i].Gx=7; LstBloc[i].Gy=24; LstBloc[i].anim=2; LstBloc[i].frame=3; LstBloc[i].foff=3; LstBloc[i].fmax=3; stars[0].pad=1; stars[0].px = 100; stars[0].py = 200; stars[0].periode=1; stars[0].frame=1; stars[0].frameMax=1; stars[0].old_anim=1; stars[0].anim=1; stars[0].no_bg=0; stars[1].pad=2; stars[1].px = 200; stars[1].py = 100; stars[1].periode=1; stars[1].frame=1; stars[1].frameMax=1; stars[1].old_anim=1; stars[1].anim=1; stars[1].no_bg=0; GRRLIB_Init(); //px=400; //py=300; // chargement des images GRRLIB_texImg *Cursor0 = GRRLIB_LoadTexture(player1_point); GRRLIB_texImg *marioimg = GRRLIB_LoadTexture(mario); GRRLIB_texImg *luigiimg = GRRLIB_LoadTexture(luigi); GRRLIB_texImg *solsimg = GRRLIB_LoadTexture(sols); GRRLIB_SetHandle(Cursor0, HOTSPOTX, HOTSPOTY);// Not needed, by default center is selected // // Initialise the Wiimotes WPAD_Init(); WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL, rmode->fbWidth, rmode->efbHeight); // debut de la boucle principale while(1) { WPAD_ScanPads(); // Scan the Wiimotes WPADData *WPadData0 = WPAD_Data(WPAD_CHAN_0); // 34,85,136 // 0x225588FF GRRLIB_FillScreen (0x225588FF); //cls color 34,177,76 ;maskimage 0x0022B14C) couleur de fond d'écran clscolor //GRRLIB_Rectangle(0,0,650,650,0x22B14CFF,true); //34,177,76 ;maskimage 0x0022B14C) couleur de fond d'écran clscolor if (WPadData0->btns_d & WPAD_BUTTON_HOME) break; // si [HOME] de la wiimote est présser alors on retourne au loader // --------------------------------------------------------------------- if(WPadData0->ir.valid){ GRRLIB_DrawImg(WPadData0->ir.x - HOTSPOTX, WPadData0->ir.y - HOTSPOTY,Cursor0 , WPadData0->ir.angle, 1, 1, 0xFFFFFFFF); } // if (pressed & WPAD_BUTTON_A){ // GRRLIB_DrawPart(150,150,22,22,22,22,fondimg,0,1,1,0xFFFFFFFF); // }else{ // GRRLIB_DrawPart(150,150,0,0,22,22,fondimg,0,1,1,0xFFFFFFFF); // } /* If old_anim<>anim ;réinitialiser la période periode=1 frame=1 EndIf old_anim=anim If periode=>15 periode=1 If frame<frameMax ;vitess de l'anim frame=frame+1 Else frame=1 EndIf Else periode=periode+1 EndIf DrawImageRect(img,px,py,(frame-1)*21+frame,(anim-1)*21+anim,20,20) */ //DrawImageRect(img,px,py,(frame-1)*21+frame,(anim-1)*21+anim,20,20); i=0; //affichage des objets 2d for(i=0;i<NUM_STARS;i++) { GRRLIB_DrawPart(stars[i].px,stars[i].py,(stars[i].frame-1)*33+stars[i].frame,(stars[i].anim-1)*33+stars[i].anim,32,32,marioimg,0,1,1,0xFFFFFFFF); if (stars[i].old_anim!=stars[i].anim){ //réinitialiser la période stars[i].periode=1; stars[i].frame=1; } stars[i].old_anim=stars[i].anim; if (stars[i].periode > 14){ //=>15 stars[i].periode=1; if (stars[i].frame<stars[i].frameMax){ //vitess de l'anim stars[i].frame=stars[i].frame+1; }else{ stars[i].frame=1; } }else{ stars[i].periode=stars[i].periode+1; } if (stars[i].pad==1){ pressed = WPAD_ButtonsHeld(WPAD_CHAN_0); /* no_bg=0 ;détecte si le joueur est en train d'appuyer sur une touche If Krgt=1 ;marche vers la droite anim=2 frameMax=2 no_bg=1 EndIf If Klft=1 ;marche vers la gauche anim=2 frameMax=2 no_bg=1 EndIf If Kdwn=1 ;pour se baisser anim=3 frameMax=1 no_bg=1 EndIf If no_bg=0 ;a l'arret anim=1 frameMax=1 EndIf */ stars[i].no_bg=0; //détecte si le joueur est en train d'appuyer sur une touche //pab a l'horizontal if (pressed & WPAD_BUTTON_LEFT) { //bas stars[i].anim=3; stars[i].frameMax=1; stars[i].no_bg=1 ; } // if (pressed & WPAD_BUTTON_RIGHT) { //haut // } if (pressed & WPAD_BUTTON_UP) { //gauche stars[i].anim=2; stars[i].frameMax=2; stars[i].no_bg=1 ; stars[i].px=stars[i].px-1 ; } if (pressed & WPAD_BUTTON_DOWN) { //doite stars[i].anim=2; stars[i].frameMax=2; stars[i].no_bg=1 ; stars[i].px=stars[i].px+1; } if (stars[i].no_bg==0) {//a l'arret stars[i].anim=1; stars[i].frameMax=1; } } if (stars[i].pad==2){ pressed = WPAD_ButtonsHeld(WPAD_CHAN_1); stars[i].no_bg=0; //détecte si le joueur est en train d'appuyer sur une touche //pab a l'horizontal if (pressed & WPAD_BUTTON_LEFT) { //bas stars[i].anim=3; stars[i].frameMax=1; stars[i].no_bg=1 ; } // if (pressed & WPAD_BUTTON_RIGHT) { //haut // } if (pressed & WPAD_BUTTON_UP) { //gauche stars[i].anim=2; stars[i].frameMax=2; stars[i].no_bg=1 ; stars[i].px=stars[i].px-1 ; } if (pressed & WPAD_BUTTON_DOWN) { //doite stars[i].anim=2; stars[i].frameMax=2; stars[i].no_bg=1 ; stars[i].px=stars[i].px+1; } if (stars[i].no_bg==0) {//a l'arret stars[i].anim=1; stars[i].frameMax=1; } } } i=0; //DrawImageRect(sols,a\Gx*scl,a\Gy*scl,(a\frame-1)*(scl+1)+a\frame,(a\anim-1)*(scl+1)+a\anim,scl,scl) for(i=0;i<NUM_bloc;i++) { GRRLIB_DrawPart(LstBloc[i].Gx*16,LstBloc[i].Gy*16,(LstBloc[i].frame-1)*17+LstBloc[i].frame,(LstBloc[i].anim-1)*17+LstBloc[i].anim,16,16,solsimg,0,1,1,0xFFFFFFFF); /* If periode=>pMax If a\frame<a\fmax ;vitess de l'anim a\frame=a\frame+1 Else a\frame=a\foff EndIf EndIf */ if (periode > pMax-1){ if (LstBloc[i].frame < LstBloc[i].fmax){ //;vitess de l'anim LstBloc[i].frame = LstBloc[i].frame+1; }else{ LstBloc[i].frame = LstBloc[i].foff; } } } //GRRLIB_DrawPart(px,py,(frame-1)*21+frame,(anim-1)*21+anim,20,20,fondimg,0,1,1,0xFFFFFFFF); GRRLIB_DrawImg(144, 176, tex_logo, 0, 1, 1, alpha ); GRRLIB_Printf(5, 5, demo_font, 0xFFFFFFFF, 1,"anim %i f: %i p: %i Fm: %i",anim,frame,periode,frameMax); //afficher un txt + var int. // GRRLIB_DrawPart(30,30,(1-1)*21+1,(1-1)*21+1,20,20,mario_Pimg,0,1,1,0xFFFFFFFF); /* Color 0,0,0 Text 0,0,"ctrl gauche pour courir ; up pour sauter" ;"anim "+VectorY#(vecSaut)+" "+saa ;anim+" f: "+frame+" p: "+periode Text 0,15,"espace gauche pour afficher la collision du perso sur sa grille" Text 0,30,"appuyer sur entrer pour changer de perso mario/luigi" Text 0,45,"mario sautte plus haut et luigi peut sauter plusieur fois " Text 0,60,">Suite a une erreur de programmation de mario ,j'ai donc fait luigi XD" */ GRRLIB_Render(); // Render the frame buffer to the TV } //fin de la boucle principale GRRLIB_Exit(); // Be a good boy, clear the memory allocated by GRRLIB GRRLIB_FreeTexture(demo_font); GRRLIB_FreeTexture(Cursor0); GRRLIB_FreeTexture(marioimg); // GRRLIB_FreeTexture(luigi_Pimg); // GRRLIB_FreeTexture(solsimg); exit(0); } /* int Level[] = { //------------------------ Map du niveau ------------------------------------------------- 0,0,0,0,0,0,0,0, 0,0,1,0,1,0,0,0, 0,0,0,0,0,1,0,1, 0,0,1,0,1,1,0,1 }; */ /* u8 * GRRLIB_LoadFileJPG(const char *filename) { FILE *fd = fopen(filename, "rb"); // obtain file size: fseek(fd , 0 , SEEK_END); long lSize = ftell(fd); rewind(fd); // read the file unsigned char *buffer = (unsigned char*) malloc (sizeof(unsigned char)*lSize); fread (buffer, 1, lSize, fd); fclose(fd); // load data into a texture u8 *tex = GRRLIB_LoadJPG(buffer, (unsigned int)lSize); free(buffer); return tex; } */ GRRLIB_texImg *GRRLIB_LoadTextureFromFile(const char *filename) { GRRLIB_texImg *tex = NULL; fatInitDefault(); FILE *fd = fopen(filename, "rb"); if(fd != NULL) { fseek(fd, 0, SEEK_END); long lsize = ftell(fd); rewind(fd); unsigned char *buffer = (unsigned char*) malloc (sizeof(unsigned char)*lsize); if(buffer) { fread (buffer, 1, lsize, fd); tex = GRRLIB_LoadTexture(buffer); free(buffer); } fclose(fd); } return tex; }
Voici mon 1er code source
j'utilise notamment des animations de mario sur snes 364/452
sa commence a l'animation 1 et la frame 1
chaque animation sont dans un rectangle de 34/34 et dans ce rectangle accolé les un au autre il y a frame en elle même qui fait 32/32
j'utilise "période" et "Pmax" pour définir la vitesse des animations.
j'utilise une structure "star" pour pouvoir crée plusieurs joueurs.
amuse toi bien a chercher dans mon code ^^.
Offline