personne ?
Tu peux montrer la nouvelle partie de ton code avec le BlitSurface ?
( Après je te dirai pour l´appui touche)
SDL_Surface* screen;
SDL_Event event;
void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
screen = SDL_SetVideoMode(1024, 768, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
SDL_ShowCursor(0);
}
SDL_Rect Rect(int x,int y,int w=0,int h=0)
{
SDL_Rect r;
r.x=x;
r.y=y;
r.w=w;
r.h=h;
return r;
}
SDL_Surface* LoadBMP(char* fichier,int vram=1)
{
SDL_Surface* f = SDL_LoadBMP(fichier);
SDL_Surface* r;
if ( vram)
r=SDL_CreateRGBSurface(SDL_HWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
if ( r==NULL) vram=0;
if ( !vram)
r=SDL_CreateRGBSurface(SDL_SWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
SDL_Rect R=Rect(0,0,f->w,f->h);
SDL_BlitSurface(f,NULL,r,&);
SDL_FreeSurface(f);
return r;
}
int main(int argc , char **argv)
{
int s=1;
int sx=1,sy=1;
SDL_Rect rect1;
SDL_Surface* firstscreen;
SDL_Surface* perso[4];
int fini=0;
init_SDL();
rect1.x = 0;
rect1.y = 0;
firstscreen=LoadBMP("map.bmp");
perso[0]=LoadBMP("homme1.bmp");
perso[1]=LoadBMP("homme2.bmp");
perso[2]=LoadBMP("homme3.bmp");
perso[3]=LoadBMP("homme4.bmp");
SDL_SetColorKey(perso[4],SDL_SRCCOLORKEY , SDL_MapRGBA(perso[4]->format,255,0,255,0));
SDL_SetAlpha(perso[4],SDL_SRCALPHA,128);
while(1)
{
SDL_PollEvent(&);
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_RETURN)
break;
if ( event.type == SDL_KEYDOWN)
{
if ( event.key.keysym.sym == SDLK_LEFT) rect1.x-=1;
if ( event.key.keysym.sym == SDLK_RIGHT) rect1.x+=1;
if ( event.key.keysym.sym == SDLK_UP) rect1.y-=1;
if ( event.key.keysym.sym == SDLK_DOWN) rect1.y+=1;
}
if ( rect1.x<0) sx=1;
if ( rect1.y<0) sy=1;
if ( rect1.x>950) sx=-1;
if ( rect1.y>650) sy=-1;
SDL_BlitSurface(firstscreen,NULL,screen,NULL);
SDL_BlitSurface(perso[rect1.x/(20%4)],NULL,screen,
&1);
SDL_Flip(screen);
}
SDL_ShowCursor(1);
SDL_Quit();
return 0;
}
lalelale : donne le prog complet, avec le main
druss : ben faut parser le fichier . X et remplir ses structures de données... A noter que . X est le format de DirectX à priori, via cette API tu disposes de toutes les fonctionnalités pour charger simplement un fichier de ce type, et pour ensuite manipuler l´objet dans ton appli.
SDL_BlitSurface(perso[rect1.x/(20%4)],NULL,screen,
&1);
20 modulo 4 ça fait 0, et on ne divise pas par 0 !
Tout à l´heure le modulo était à 3, ce qui faisait 2.
? ??? ( keski ma sorti la) ? ???
j´ai essayé en mettant 25 mais ca change rien
on deterre ce topic
qqun sait comment faire pour assigner une img a une touche
T´as qu´à faire un tableau de SDL_Surface...
Et à chaque touche tu associes un chiffre :
if(event.key.keysym.sym == SDLK_LEFT)
SDL_BlitSurface(perso[0],NULL,screen,
&1);
if(event.key.keysym.sym == SDLK_RIGHT)
SDL_BlitSurface(perso[1],NULL,screen,
&1);
if(event.key.keysym.sym == SDLK_UP)
SDL_BlitSurface(perso[2],NULL,screen,
&1);
if(event.key.keysym.sym == SDLK_DOWN)
SDL_BlitSurface(perso[3],NULL,screen,
&1);
Tu charges évidemment les bonnes images dans [0][1][2] et [3] !
merci
mais j´ai un gros dilème
SDL_Surface* screen;
SDL_Event event;
void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
screen = SDL_SetVideoMode(640, 480, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
SDL_ShowCursor(0);
}
SDL_Rect Rect(int x,int y,int w=0,int h=0)
{
SDL_Rect r;
r.x=x;
r.y=y;
r.w=w;
r.h=h;
return r;
}
SDL_Surface* LoadBMP(char* fichier,int vram=1)
{
SDL_Surface* f = SDL_LoadBMP(fichier);
SDL_Surface* r;
if ( vram)
r=SDL_CreateRGBSurface(SDL_HWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
if ( r==NULL) vram=0;
if ( !vram)
r=SDL_CreateRGBSurface(SDL_SWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
SDL_Rect R=Rect(0,0,f->w,f->h);
SDL_BlitSurface(f,NULL,r,&);
SDL_FreeSurface(f);
return r;
}
int main(int argc , char **argv)
{
int s=1;
int sx=1,sy=1;
SDL_Rect rect1;
SDL_Surface* firstscreen;
SDL_Surface* perso[4];
int fini=0;
init_SDL();
rect1.x = 0;
rect1.y = 0;
firstscreen=LoadBMP("map.bmp");
perso[0]=LoadBMP("homme1.bmp");
perso[1]=LoadBMP("homme2.bmp");
perso[2]=LoadBMP("homme3.bmp");
perso[3]=LoadBMP("homme4.bmp");
SDL_SetColorKey(perso[4],SDL_SRCCOLORKEY , SDL_MapRGBA(perso[4]->format,255,0,255,0));
SDL_SetAlpha(perso[4],SDL_SRCALPHA,128);
while(1)
{
SDL_PollEvent(&);
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_RETURN)
break;
if ( event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_RIGHT)
SDL_BlitSurface(perso[0],NULL,screen,&1);
if(event.key.keysym.sym == SDLK_UP)
SDL_BlitSurface(perso[1],NULL,screen,&1);
if(event.key.keysym.sym == SDLK_LEFT)
SDL_BlitSurface(perso[2],NULL,screen,&1);
if(event.key.keysym.sym == SDLK_DOWN)
SDL_BlitSurface(perso[3],NULL,screen,&1);
}
if ( rect1.x<0) sx=1;
if ( rect1.y<0) sy=1;
if ( rect1.x>950) sx=-1;
if ( rect1.y>650) sy=-1;
SDL_BlitSurface(firstscreen,NULL,screen,NULL);
SDL_BlitSurface(perso[rect1.x/25%4],NULL,screen,&
ect1);
SDL_Flip(screen);
}
SDL_ShowCursor(1);
SDL_Quit();
return 0;
}
le prog marche, mais il y a qu´un écran tout noir pendant 3secondes
help ( j´y connais presque rien en SDL un tuto en francais serait le bienvenu)
Alors, c´est bon, j´ai trouvé la solution ; ).
Mais j´ai maintenant un autre problème, je ne sais pas comment " manger" un caractere. Le code :
void error(char* error, . ..)
{
va_list ap;
va_start(ap,error);
char *p;
cout<<" " <<error;
for(p = error; *p; p++)
{ if(*p!=´%´)
{}
else
{
++p;//pour que ca lise le caractere suivant
switch(*p)
{
case ´s´ :
int entier = va_arg(ap,int);
cout<<entier<<" " ;
break;
}
}
}
}
void main()
{
error("lut %s,%s",15,15);
cin.get();
}
Alors, il marche bien, mais je n´arrive pas à enlever ces ´%s´ et c´est pas très élégant je trouve. Vous n´auriez pas une méthode( j´ai pensé à faire un tableau char* error[] à la place de char* error, mais je n´y arrive pas ( ben oui, avec un tableau il m´aurait suffi de ne pas afficher la partie contenant le ´%´)). Comment faire?
tuto français de sdl : www.fvirtman.fr.st ( le site de mister JY²)
ton code sert a quoi au fait
http://www.fvirtman.fr.st
merci de mettre le lien
Ben en fait, lorsque tu appelles la fonction error(char* error,...), tu peux mettre dedans une chaîne de caractere plus plusieurs variables ( d´où le ´...´). Je n´ai jamais étudié le C, mais je crois que ça revient à la fonction printf()(ou un nom de ce genre).
Il faut mettre les appuis touches après le Blit de first screen, sinon le fond s´affichera par dessus le perso ! Et virer ton Blit du Perso :
if ( rect1.x<0) sx=1;
if ( rect1.y<0) sy=1;
if ( rect1.x>950) sx=-1;
if ( rect1.y>650) sy=-1;
SDL_BlitSurface(firstscreen,NULL,screen,NULL);
SDL_PollEvent(&);
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_RETURN)
break;
if ( event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_RIGHT)
SDL_BlitSurface(perso[0],NULL,screen,&1);
if(event.key.keysym.sym == SDLK_UP)
SDL_BlitSurface(perso[1],NULL,screen,&1);
if(event.key.keysym.sym == SDLK_LEFT)
SDL_BlitSurface(perso[2],NULL,screen,&1);
if(event.key.keysym.sym == SDLK_DOWN)
SDL_BlitSurface(perso[3],NULL,screen,&1);
}
Mais je crois que ça va un peu foutre la merde dans ton code original, faudrait que tu apprennes bien comment marchent tes Blit.
euh, ´ai oublié de préciser. dans la fonction printf(), je crois que si dans la chaîne de caractere tu mùets un %s, il est remplacé par la constant definie à la fon de la declaration de la fonction ( peut etre que je me trompe, je n´y connais pas grand chose encore).
ca marche tjrs pas
il y a eu parachute deployed
fatal signal