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

Problème c++/sdl

N_Cortex
N_Cortex
Niveau 7
25 août 2005 à 18:39:08

J´ai un énorme problème. Je suis en train de m´entrainer a la lib sdl, alors j´ai créer plusieurs balles qui rebondissaient contre l´écran. Puis j´ai voulu y rajouter un objet qui bougerait en fonction de la souris, et maintenant, le programme se lance, mais les images ne s´affichent qu´au bout de 1 min. Puis les boules ont déja avancées, mais elles restent immobiles, plus rien ne bouge. Mais je peux quand meme faire return et quitter le programme...

Voici mon code :

  1. include <SDL/SDL.h>
  2. include <windows.h>

SDL_Surface* screen;
SDL_Event event;
char key[400];
int xsouris=0,ysouris=0;
void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(800, 600, 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;
}

void UpdateEvents()
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYDOWN:
key[event.key.keysym.sym]=1;
break;
case SDL_KEYUP:
key[event.key.keysym.sym]=0;
break;
case SDL_MOUSEMOTION:
xsouris=event.motion.x;
ysouris=event.motion.y;
break;
}
}
}

SDL_Surface* LoadBMP(char* fichier,int vram=1)
{
SDL_Surface* f = SDL_LoadBMP(fichier);
SDL_Surface* r=NULL;
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,&R); M
SDL_FreeSurface(f);
return r;
}

int main(int argc ,char **argv)
{
int s=1;
int sx1=1,sy1=1, sx2=1,sy2=1, sx3=1,sy3=1, sx4=1,sy4=1;
SDL_Rect rect1;
SDL_Rect rect2;
SDL_Rect rect3;
SDL_Rect rect4;
SDL_Rect rect5;
SDL_Surface* firstscreen;
SDL_Surface* balle1;
SDL_Surface* balle2;
SDL_Surface* balle3;
SDL_Surface* balle4;
SDL_Surface* plaque;
int fini=0;
init_SDL();
// on dessine
rect1.x = 100;
rect1.y = 100;
rect2.x = 90;
rect2.y = 90;
rect3.x = 75;
rect3.y = 75;
rect4.x = 55;
rect4.y = 55;
rect5.x = 300;
rect5.y = 570;
firstscreen=LoadBMP("font.bmp");
balle1=LoadBMP("boule_de_feu.bmp");
balle2=LoadBMP("boule_de_feu2.bmp");
balle3=LoadBMP("boule_de_feu3.bmp");
balle4=LoadBMP("boule_de_feu4.bmp");
plaque=LoadBMP("plaque.bmp");
SDL_SetColorKey(balle1,SDL_SRCCOLORKEY ,SDL_MapRGBA(balle1->format,255,0,255,0));
SDL_SetColorKey(balle2,SDL_SRCCOLORKEY ,SDL_MapRGBA(balle2->format,255,0,255,0));
SDL_SetColorKey(balle3,SDL_SRCCOLORKEY ,SDL_MapRGBA(balle3->format,255,0,255,0));
SDL_SetColorKey(balle4,SDL_SRCCOLORKEY ,SDL_MapRGBA(balle4->format,255,0,255,0));
SDL_SetColorKey(plaque,SDL_SRCCOLORKEY ,SDL_MapRGBA(plaque->format,255,0,255,0));
while(1)
{
UpdateEvents();
if (key[SDLK_RETURN])
break;
rect1.x+=8*sx1;
rect1.y+=8*sy1;

if (rect1.x<0) sx1=1;
if (rect1.y<0) sy1=1;
if (rect1.x>700) sx1=-1;
if (rect1.y>500) sy1=-1;

rect2.x+=6*sx2;
rect2.y+=6*sy2;
if (rect2.x<0) sx2=1;
if (rect2.y<0) sy2=1;
if (rect2.x>720)sx2=-1;
if (rect2.y>520)sy2=-1;

rect3.x+=4*sx3;
rect3.y+=4*sy3;
if (rect3.x<0) sx3=1;
if (rect3.y<0) sy3=1;
if (rect3.x>740)sx3=-1;
if (rect3.y>540) sy3=-1;

rect4.x+=6*sx4;
rect4.y+=6*sy4;
if (rect4.x<0) sx4=1;
if (rect4.y<0) sy4=1;
if (rect4.x>760) sx4=-1;
if (rect4.y>560) sy4=-1;

rect5.x = 100;

SDL_BlitSurface(firstscreen,NULL,screen,NULL);
SDL_BlitSurface(balle1,NULL,screen,&rect1);
SDL_BlitSurface(balle2,NULL,screen,&rect2);
SDL_BlitSurface(balle3,NULL,screen,&rect3);
SDL_BlitSurface(balle4,NULL,screen,&rect4);
SDL_BlitSurface(plaque,NULL,screen,&rect5);
SDL_Flip(screen);
}
SDL_Quit();
SDL_ShowCursor(1);
return 0;
}

Si jamais vous trouvez quelquonque problème dans mon code, n´hésitez pas !

Vengeur41
Vengeur41
Niveau 10
25 août 2005 à 18:53:18

Windows.h sert à rien, comme de nombreuses fonctions, et ces genres de déclaration :

" balle1=LoadBMP("boule_de_feu.bmp"); "

ca n´a pas passé à la compilation.
(j´ai réarrangé).

Ensuite pour la capture clavier, le keysym c´est pas ce que je te recommande le plus. Je te recommanderais plus un SDL_GetKeyState().

Cependant une fois ca réarrangé, ca rame pas :question:

N_Cortex
N_Cortex
Niveau 7
25 août 2005 à 19:04:07

Je précise que je suis débutant dans le sdl.

Comment fonctionne GetKeyStates ?
Qu´est-ce qui ne vas pas dans
" balle1=LoadBMP("boule_de_feu.bmp"); " ?

En tout cas, merci de m´aider.

Vengeur41
Vengeur41
Niveau 10
25 août 2005 à 19:26:43

Il manquait un argument.

Pour getkeystate :
Déjà tu vire SDL_KEYDOWN et SDL_KEYUP et tu fais ca :
Uint8 *keystate;

...
...
keystate = SDL_GetKeyState(NULL);

L´avantage c´est que le multitouche est géré.
Et puis bon, ca marche pareil après.

N_Cortex
N_Cortex
Niveau 7
26 août 2005 à 11:09:18

Aperrement le problème ne vient pas de ce code, mais vient d´un des objets que j´importe.

Je vais essayer de régler le problème, maintenant, j´ai une piste.

N_Cortex
N_Cortex
Niveau 7
26 août 2005 à 16:13:38

Comment faire pour supprimer completement d ela mémoire un objet rect en sdl ?

JeanYvesYves
JeanYvesYves
Niveau 10
26 août 2005 à 16:22:29

tel que tu les as déclaré : de façon statique, pas besoin de t´occuper de ça : ils sont détruits tout seuls a la fin de leur bloc de déclaration (bloc du main)

N_Cortex
N_Cortex
Niveau 7
26 août 2005 à 16:28:39

Le problème, c´est que j´ai besoin de supprimé un rect pendant mon programme. Puisque qu´en fait, j´ai 250 rect qui contiennent chacun la meme image, je ne voie pas comment supprimer l´image, puis que si je fais image=NULL, tout les rect seront vides...

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