Salut je travaille sur mon 2e pong et j´utilise SDL_TTF pour afficher les score , pour utiliser sdl_ttf je dois utiliser sdl_color,mais quand je rajoute:
color.r=SDL_MapRGB(screen->format,0,0,0);
color.g=SDL_MapRGB(screen->format,0,255,0);
color.b= SDL_MapRGB(screen->format,0,0,0);
Ce qui fonctionnait à mon premier pong le programme m´envoit le rapport d´erreur de microsoft,comment cela et comment faire pour le contourner ou régler le problème. Voici mon code source:
- include < iostream> / /inclue les librairie
- include < stdlib.h>
- include < SDL\SDL.h>
- include < SDL\SDL_ttf.h>
SDL_Surface *screen,sscore,bestscore; / /les écran sur lequel on travaille
SDL_Rect rscore; / /rectangle du score
SDL_Event event; / /gère les événement
TTF_Font *font, *fon; / /règle la police du texte
SDL_Color color;
class rect / /s´occupe de la balle
{
public:
SDL_Rect des, dep;
rect();
};
rect::rect() / /s´occupe de la balle
{
dep.x=1;
dep.y=1;
dep.w=18;
dep.h=18;
des.x=370;
des.y=450;
des.h=18;
des.w=18;
}
void Init_SDL() / / inittie la SDL, librairie fesant l´affichage
{
if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER)<0)
exit(1);
atexit(SDL_Quit);
screen = SDL_SetVideoMode(760,500,32, SDL_HWSURFACE|SDL_DOUBLEBUF ) ;
if( screen ==NULL)
{
printf("Can´t set video mode");
exit(2);
}
if ( TTF_Init() < 0) / /initie SDL ttf permettant d´écrire
{
fprintf(stderr, " Impossible d´initialiser SDL_TTF: %s\n",SDL_GetError());
}
font= TTF_OpenFont("./elephant.ttf",15);
font= TTF_OpenFont("./elephant.ttf",20);
}
int main(int argc, char *argv[])// Le programme commence ici
{
rscore.x = 660;
rscore.y=2;
rscore.h= 15;
rscore.w=100;
color.r=SDL_MapRGB(screen->format,0,0,0);
color.g=SDL_MapRGB(screen->format,0,255,0);
color.b= SDL_MapRGB(screen->format,0,0,0);
bool done=true;
int texte;
/ /surface de la balle
SDL_Surface *image= SDL_CreateRGBSurface(SDL_HWSURFACE,800,600, 32,0,0,0,0);
rect balle;
image=SDL_LoadBMP("balle.bmp");
int x=2,y=-2, score=0;
int vitesse=0,vitesse1=1; / /sert à régler la vitesse de la balle
Init_SDL();
SDL_Rect bar[2]; / /sont les bar qui se déplace
bar[0].x = 340;
bar[0].y = 468;
bar[0].h = 10;
bar[0].w = 100;
bar[1].x = 340;
bar[1].y = 22;
bar[1].h = 10;
bar[1].w = 100;
int time, nextime,nom; / /temps pour le changement de couleur
nextime = SDL_GetTicks()+ 300;
while(done)
{
time = SDL_GetTicks(); / /prend l´heure
if(time > nextime) / /change la couleur de la balle
{
if(nom > 3)
nom=0;
else
nom++;
balle.dep.x= nom*18 +1;
nextime= time +300;//change la couleur de la balle
}
if(balle.des.x>18 && balle.des.x < 660) / /fait bouger la bar du haut
bar[1].x= balle.des.x-9;
if(balle.des.x > 742 || balle.des.x < 1) / /fait rebondir la balle
x=-x;
if(balle.des.y < 33-y)
y=-y;
if(balle.des.y > 450)
if(balle.des.x > bar[0].x - 17 && balle.des.x < bar[0].x +117)
{
y=-y;
vitesse++;
score+=10;
if(balle.des.x < bar[0].x +50)
{if(x>0) x=-x;}
else
if(x<0) x=-x;
}
if(balle.des.y > 500) / /quitte si la balle sort par le bas
return 0;
if(vitesse/2 > vitesse1)
{
vitesse1++;
if(y<0) y--;
else y++;
}
balle.des.x += x; / /fait bouger la balle
balle.des.y += y;
SDL_PollEvent(&);
if(event.type== SDL_QUIT) done=false;
if(event.type == SDL_KEYDOWN)
{
switch(event.key.keysym.sym)
{
case SDLK_RIGHT:
if(bar[0].x < 660)
bar[0].x += 5;
break;
case SDLK_LEFT:
if(bar[0].x > 5)
bar[0].x -= 5;
break;
case SDLK_ESCAPE: done =false;
break;
}
}
SDL_FillRect(screen,NULL,0);
SDL_FillRect(screen, &[0],SDL_MapRGB(screen->format,255,255,255));
SDL_FillRect(screen, &[1],SDL_MapRGB(screen->format,255,255,255));
SDL_BlitSurface(image,&.dep,screen, &.des);
SDL_Flip(screen);
}
return 0;
}