CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[SDL et Linux]Problème d'affichage...

Vengeur41
Vengeur41
Niveau 10
12 avril 2005 à 14:30:09

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)...

dnob700
dnob700
Niveau 10
12 avril 2005 à 16:36:12

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.

Vengeur41
Vengeur41
Niveau 10
12 avril 2005 à 16:43:39

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...

JeanYvesYves
JeanYvesYves
Niveau 10
12 avril 2005 à 16:50:04

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 !

Vengeur41
Vengeur41
Niveau 10
12 avril 2005 à 17:35:12

malloc et tout pour mes tableaux j´y avais pas pensé !
Merci pour l´idée :) J´essaie de suite.

fantometteninja
fantometteninja
Niveau 6
12 avril 2005 à 19:01:07

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

Vengeur41
Vengeur41
Niveau 10
12 avril 2005 à 19:52:02

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...

JeanYvesYves
JeanYvesYves
Niveau 10
12 avril 2005 à 20:20:47

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 !

Vengeur41
Vengeur41
Niveau 10
12 avril 2005 à 20:40:40

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 :-(

Vengeur41
Vengeur41
Niveau 10
13 avril 2005 à 14:04:53

Je me permets un petit :up: car c´est important pour moi...

JeanYvesYves
JeanYvesYves
Niveau 10
13 avril 2005 à 14:08:43

" 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

Vengeur41
Vengeur41
Niveau 10
13 avril 2005 à 14:15:30

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...

Vengeur41
Vengeur41
Niveau 10
15 avril 2005 à 23:03:38

:up: !
C´est urgent, je sors le jeu très bientot ( dans la semaine) et tout marche sauf ca, ca fait tâche...

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment