Bonjour tout le monde,
voici mon problème : j'utilise la SDL pour programmer un jeu se jouant a l'aide du clavier et de la souris de la manière suivante : vous, le héros êtes au beau milieu d'un niveau plus grand que l'écran et remplit d'ennemi. Lorsque vous vous approchez d'eux ils vous tirent dessus et vous voyez votre vie descendre. Pour les tuer vous devez cliquer dessus. Je suis assez fier de mon jeux qui incorpore un menu en jeu donnant divers information comme votre vie et vos dégats ou encore votre position sur une mini carte.
Cependant, depuis peu j'ai un gros problème de rapidité. Je ne sais pas a quoi cela est du. Voici la structure de mon programme(seulement l'essentiel)
Tout d'abord j'ai créé des structures ennemis et des structures personnage, un SDL_Rect qui sert de camera pour le scrolling et un tableau d'ennemi, histoire de gerer tout les ennemis a l'aide de ce tableau.
j'arrive ensuite a une boucle des évenements écrite ainsi:
SDL_Event event; //variable pour les evenements
bool continuer = true;
int oldTime = 0;
int now = 0;
int clike = 0;
while(continuer)
{
now = SDL_GetTicks();
if(now-oldTime >= 20) //pour limiter le nombre de fps
{
afficherTout(ecran, adversaires, personnage, Camera);
//fonction qui parcourt le tableau d'ennemis, les blittes
IA(ecran, adversaires, &personnage, Camera);
//fonction qui parcourt le tableau d'ennemi et fait tirer ceux qui sont proche
afficherMenu(ecran, adversaires, personnage, Camera);
//tout est dans le nom
SDL_Flip(ecran);
SDL_PollEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = false;
break;
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_UP && Camera.y > 0)
Camera.y -= 5;
else if(event.key.keysym.sym == SDLK_RIGHT && Camera.x < 1000-Camera.w)
Camera.x += 5;
else if(event.key.keysym.sym == SDLK_DOWN && Camera.y < 1000-Camera.h)
Camera.y += 5;
else if(event.key.keysym.sym == SDLK_LEFT && Camera.x > 0)
Camera.x -= 5;
break;
//ci dessus : les mouvements
case SDL_MOUSEBUTTONDOWN:
if(500+206 > event.button.x && event.button.x > 500+10)
{
if(464 > event.button.y && event.button.y > 413)
return; //si on a cliqué sur le bouton quitter du menu, on quitte
}
clike = clik(adversaires, event.button.x, event.button.y, Camera);
//test pour voire si on tue des ennemi
if(clike != -1)
adversaires[clike].PointDeVies -= personnage.Degats;
break;
};
}
}
D'autres part, j'ai vérifié que je libérais toutes les surfaces après les blits. Et je ne pense pas avoir abusé sur le nombre d'ennemis(5) ni la taille du niveau (1000*1000 dans une fenetre de 500*500).
J'ai entendu parlé de probleme de lenteur avec la SDL. Si la SDL ne sait plus suivre pour un tel programme indiquez moi d'autres bibliothèques 2d un peu plus rapides.
Merci de m'avoir accordé du temps et a bientôt.