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