Hello
Jcontinuais mon jeu en faisant un ptit shoot-em-up ( mon jeu est un WarioWare).
Je poste le code ( appelé dans une boucle entre un fill_rect de l´ecran et un flip) et j´explique le problème après :
----
void game11_shoot()
{
int i,j,av;
SDL_Rect rcsrc,rcdst;
Uint8 *keystate;
static int
type[10],x[10],y[10],sens[10],bulletx[10],bullety[
10], vaisseaux,
vaisseauy,scroll,xscrollpl,last_time_shot,score,li
fe;
bool shooted[10],shot_bullet[10];
if ( !levelprepared)
{
for ( i=0;i<10;i++)
{
type[i]=rand()%3;
x[i]=640+rand()%200;
y[i]=16+rand()%(480-16-40);
vaisseaux=0;
vaisseauy=240;
printf("type %d",type[i]);
sens[i]=0;
shooted[i]=false;
shot_bullet[i]=false;
bulletx[i]=vaisseaux;
bullety[i]=vaisseauy;
}
scroll=0;
score=0;
life=3;
last_time_shot=0;
levelprepared=true;
}
else
{
if ( life<1)
{
resultat=PERDU;
jeuencours=false;
}
if ( score>135)
{
resultat=GAGNE;
jeuencours=false;
}
if(scroll>800-640)
{
rcsrc.w=800-scroll;
rcsrc.h=480;
rcsrc.x=scroll;
rcsrc.y=0;
SDL_BlitSurface(sh_scroll,&,Screen,NULL);
rcdst.x=800-scroll-1;
rcdst.y=0;
rcsrc.w=640-(800-scroll);
rcsrc.h=480;
rcsrc.x=0;
rcsrc.y=0;
SDL_BlitSurface(sh_scroll,&,Screen,&);
} else {
rcsrc.x=scroll;
rcsrc.y=0;
rcsrc.w=640;
rcsrc.h=480;
SDL_BlitSurface(sh_scroll,&,Screen,NULL);
}
scroll+=3;
if ( scroll>=800)scroll-=800;
SDL_BlitSurface(sh_haut,NULL,Screen,NULL);
for ( i=0;i<10;i++)
{
if ( x[i]<641 && x[i]>(-40) && ! shooted[i])
{
rcdst.x=x[i];
rcdst.y=y[i];
SDL_BlitSurface(sh_ennemi[type[i]],NULL,Screen,&
dst);
}
else if ( x[i]<(-40))
{
shooted[i]=true;
}
/ * regarde si y´a des tirs dans le coin */
for ( j=0;j<10;j++)
{
if ( shot_bullet[j])
{
if ( !shooted[i] && ( bulletx[j]>x[i] && bulletx[j]<x[i]+40) && ( bullety[j]>y[i] && bullety[j]<y[i]+40))
{
score+=5;
shooted[i]=true;
shot_bullet[j]=false;
}
}
}
/ * Regarde si y´a le vaisseau dans le coin, auquel cas, il est mort
*/
if ( (x[i]>vaisseaux && x[i]<vaisseaux+33) && ( y[i]>vaisseauy && y[i]<vaisseauy+20) && ! shooted[i])
{
life-=1;
shooted[i]=true;
vaisseaux=0;
vaisseauy=240;
}
if ( shooted[i])
{
type[i]=rand()%3;
x[i]=640+rand()%200;
y[i]=16+rand()%(480-16-40);
shooted[i]=false;
}
x[i]-=8;
/ * Mouvement different pour chaque type d´ennemi */
if ( type[i]==0)
{
/ * Lui il est rapide et il bouge un peu dans tous les sens*/
x[i]-=3;
av=(-5+rand()%10);
y[i]+=av;
}
else if ( type[i]==1)
{
/ * Plus lent mais il fait des sortes de vagues */
x[i]+=2;
if ( sens[i]==0)y[i]+=4;
else y[i]-=4;
if ( y[i]<17)sens[i]=0;
else if ( y[i]>(480-16-40))sens[i]=1;
}
else if ( type[i]==2)
{
/ * Lui il fait n´importe quoi */
av=(-8+rand()%16);
y[i]+=av;
}
}
/ * Gestion des tirs */
for ( j=0;j<10;j++)
{
if ( shot_bullet[j])
{
bulletx[j]+=5;
rcdst.x=bulletx[j];
rcdst.y=bullety[j];
SDL_BlitSurface(sh_shoot,NULL,Screen,&);
if ( bulletx[j]>640)shot_bullet[j]=false;
}
}
drawInt(score,95,0);
drawInt(life,230,0);
/ * Gestion du vaisseau*/
rcdst.x = vaisseaux;
rcdst.y = vaisseauy;
SDL_BlitSurface(sh_vaisseau,NULL,Screen,&);
keystate = SDL_GetKeyState(NULL);
if ( keystate[SDLK_UP])
{
vaisseauy-=5;
}
if ( keystate[SDLK_DOWN])
{
vaisseauy+=5;
}
if ( keystate[SDLK_RIGHT])
{
vaisseaux+=5;
}
if ( keystate[SDLK_LEFT])
{
vaisseaux-=5;
}
if ( keystate[SDLK_SPACE] && ( SDL_GetTicks()-last_time_shot)>110)
{
for ( j=0;j<10;j++)
{
if(shot_bullet[j]==0)
{
shot_bullet[j]=1;
bulletx[j]=vaisseaux+40;
bullety[j]=vaisseauy+10;
last_time_shot = SDL_GetTicks();
break;
}
}
}
if ( vaisseaux<0)vaisseaux=0;
if ( vaisseauy<18)vaisseauy=18;
if ( vaisseauy>(480-16-20))vaisseauy=(480-16-20);
sync_fps(5);
}
}
-----------
Le problème :
Sous windows, y´a un tir chelou qui part juste quand le jeu démarre...
Sous linux, les tirs marchent mais les ennemis sont pas affichés et y´a une sorte de tir fantome bizzare qui avance en meme temps que le vaisseau ( à vitesse/2) et qui est affiché une frame sur 3...
Bref... Ca marche pas.
Pour le tester et le débugger voilà ce qu´il faut faire :
1- Charger les ressources ( toutes des SDL_Surface*
chargeable avec SDL_LoadBMP ou IMG_Load)
2- Creer une boucle ainsi :
-------
Uint8 *key;
bool noquit=true;
while(noquit)
{
SDL_FillRect(Screen,NULL,0);
game11_shoot();
SDL_Flip(Screen);
key = SDL_GetKeyState(NULL);
if ( key[SDLK_ESCAPE])noquit=false;
}
SDL_Quit();
------
Le problème vient surtout de Linux où il empeche tout le déroulement du jeu alors que sous windows ben y´a juste un tir qui part ( donc ca aide)...
A moins qu´il y ai une erreur grossière que quelqu´un remarque, le code est beaucoup trop long pour que quiconque d´autre que toi le regarde réellement.
A ce stade là, tu doit te lancer dans le débogage de ton programme, en l´exécutant pas à pas, pour comprendre réellement comment il marche et où est-ce qu´il ne fait pas exactement ce que tu veux. C´est parfois la phase la plus complexe de la création d´un programme qui fonctionne rarement du premier coup comme tu le voudrais.
Le problème c´est que je l´ai dja fait et j´ai rien trouvé " d´anormal"...
Ce que je ne comprends pas c´est pourquoi ca fonctionne sous Windows et pas Linux...
Si les résultats sont différents d´un systeme a un autre, sans aucune raison, je pense - mais c´est qu´une hypothese - que tu as quelques chose d´aléatoire dans ton execution :
Il y a 2 façons d´avoir des choses aléatoires :
- appel de randoms
- utilisation d´une zone de donnée non initialisée.
Si par exemple, tu fais int a; et que tu lis a derriere : pan ! ! que vaut a ? personne ne peut prédire...
Pareil, si tu fais un malloc ou un new, et que tu lis ce qu´il y a dedans, sans avoir tout écrit auparavant : pan !
A toi de voir !
malloc et tout pour mes tableaux j´y avais pas pensé !
Merci pour l´idée
J´essaie de suite.
Si tu compile avec gcc, essaye de compiler avec l´option -Wall qui t´indiquera un max d´erreurs.
Et vérifie aussi que les chemins et noms de fichiers correspondent bien à ce qu´attendrait un systeme Unix.
Ensuite tu peux t´amuser à mettre des printf un peu partout pour voir dans ta console en temps reel ce qui se passe
Après avoir bidouillé pendant 1 heure, ca marche...pas.
J´ai tout vérifié : la surface est chargée sans erreurs et le blit se passe correctement ( vive les printf)...
Alors là je comprends plus...
C´est le seul jeu qui me pose problème...
Les printf...
essaie plutot d´utiliser le debugger de ton compilo ( si tu veux absolument rester sous nunux, prend GDB, ou des versions améliorées, dans ton intéret)
mais sinon, le débugger de visual C++ est excellent !
Oui mais Visual C++ je suis trop con pour comprendre...
En totu cas les printf m´apprennent que le problème ne vient pas de la SDL... Je crois que ce sont ces tableaux... ou ces randoms... ou les deux.
Mais en tout cas, je tiens à la version linux.
Elle est in-dis-pen-sable.
Je ne peux pas sortir le jeu sans ![]()
Je me permets un petit
car c´est important pour moi...
" Je ne peux pas sortir le jeu sans "
? ? -> Hu ? ? Pouqruoi donc ?
c´est un TP ?
En totu cas les printf m´apprennent que le problème ne vient pas de la SDL
--> S´il y avait des bugs dans la SDL, depuis qq années qu´elle existe, et par le fait que tu utilises une version finie et non beta, ils seraient connus ![]()
Controle toujours les parametres que tu envoies aux fonctions
Euh non, ce n´est pas un tp lol
Mais, ce que je ne comprends pas c´est d´ou vient ce tir fantome ( pourquoi l´afficher une frame sur 3 en plus ? ) , pk les ennemis ne sont pas affichés ( alors que j´ai testé la valeur de retour du blit, c´est censé etre ok) et ( mais ca je m´en fous) pk le scroll merde un peu sur les bords de l´ecran.
GDB... Je l´ai déjà essayé mais je ne comprends pas...
!
C´est urgent, je sors le jeu très bientot ( dans la semaine) et tout marche sauf ca, ca fait tâche...