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

Mon programme sdl/c++ ne se lance pas

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 08:39:20

J´ai créer un petit casse brique en c++ dont voici le code :

  1. include <SDL/SDL.h>

SDL_Surface* screen;
SDL_Event event;
char key[400];
int xsouris=0,ysouris=0,xrelsouris=0,yrelsouris=0;

struct player
{
int score;
int vie;
};

void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(800, 600, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
SDL_ShowCursor(0);
}

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;
xrelsouris=event.motion.xrel;
yrelsouris=event.motion.yrel;
break;
}
}
}

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;
}

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);
SDL_FreeSurface(f);
return r;
}

int main(int argc ,char **argv)
{
struct player joueur;
joueur.vie = 3;
int s=1, pos_x=35, pos_y=0, i=0, start=0;
int sx4=0,sy4=0;
SDL_Rect rect4;
SDL_Rect rect5;
SDL_Rect rect6[300];
SDL_Rect rect_vie1;
SDL_Rect rect_vie2;
SDL_Rect rect_vie3;
SDL_Surface* firstscreen;
SDL_Surface* balle4;
SDL_Surface* plaque;
SDL_Surface* brique;
SDL_Surface* vie1;
SDL_Surface* vie2;
SDL_Surface* vie3;
int fini=0;
init_SDL();
// on dessine
rect4.x = 100;
rect4.y = 300;
rect5.x = 200;
rect5.y = 560;
rect_vie1.x = 620;
rect_vie1.y = 20;
rect_vie2.x = 680;
rect_vie2.y = 20;
rect_vie3.x = 740;
rect_vie3.y = 20;
for (i=0; i<231; i++)
{
rect6[i].x = pos_x;
rect6[i].y = pos_y;
pos_x = pos_x + 35;
if (pos_x >= 765) {pos_y += 17;pos_x = 35;}
}
//creation des objets
firstscreen=LoadBMP("font.bmp");
balle4=LoadBMP("boule_de_feu4.bmp");
plaque=LoadBMP("plaque.bmp");
brique=LoadBMP("brique_bleu.bmp");
vie1=LoadBMP("vie.bmp");
vie2=LoadBMP("vie.bmp");
vie3=LoadBMP("vie.bmp");
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));
SDL_SetColorKey(brique,SDL_SRCCOLORKEY ,SDL_MapRGBA(brique->format,255,0,255,0));
SDL_SetColorKey(vie1,SDL_SRCCOLORKEY ,SDL_MapRGBA(vie1->format,255,0,255,0));
SDL_SetColorKey(vie2,SDL_SRCCOLORKEY ,SDL_MapRGBA(vie2->format,255,0,255,0));
SDL_SetColorKey(vie3,SDL_SRCCOLORKEY ,SDL_MapRGBA(vie3->format,255,0,255,0));
while(1)
{
UpdateEvents();
if (key[SDLK_RETURN] && start == 0) {sy4 = 1; sx4 = 1; start = 1;}
if (key[SDLK_ESCAPE]) break;

if (xrelsouris > 0) plaque=LoadBMP("plaque-d.bmp");
if (xrelsouris == 0) plaque=LoadBMP("plaque.bmp");
if(xrelsouris < 0) plaque=LoadBMP("plaque-g.bmp");

rect4.x+=9*sx4;
rect4.y+=9*sy4;
if (rect4.x<0) sx4=1;
if (rect4.y<0) sy4=1;
if (rect4.x>785) sx4=-1;
if (rect4.y + 16 > rect5.y && rect4.x > rect5.x - 100 && rect4.x < rect4.x + 150 ) sy4=-1;
if (rect4.y > 600) {balle4=NULL; sx4=0; sy4=0;}

rect5.x = xsouris - 100;
if (rect5.x < 0) xsouris = 100;
if (rect5.x > 600) xsouris = 700;

for (i=0; i < 231; i++)
{
if (rect4.y >= rect6[i].y && rect4.y <= rect6[i].y + 14 && rect4.x >= rect6[i].x && rect4.x <= rect6[i].x + 35 ) {rect6[i].x = 1024; sy4 = -(sy4); joueur.score += 100; } //rebond bas
if (rect4.y + 16 >= rect6[i].y && rect4.y + 16 <= rect6[i].y + 14 && rect4.x >= rect6[i].x && rect4.x <= rect6[i].x + 35 ) {rect6[i].x = 1024; sy4 = -(sy4); joueur.score += 100; } //rebond haut
if (rect4.x >= rect6[i].x && rect4.x <= rect6[i].x + 33 && rect4.y >= rect6[i].y && rect4.y <= rect6[i].y + 17 ) {rect6[i].x = 1024; sx4 = -(sx4); joueur.score += 100; } //rebond gauche
if (rect4.x + 15 >= rect6[i].x && rect4.x + 15 <= rect6[i].x + 35 && rect4.y >= rect6[i].y && rect4.y <= rect6[i].y + 17 ) {rect6[i].x = 1024; sx4 = -(sx4); joueur.score += 100; } //rebond droite
}

if (balle4 == NULL)
{
joueur.vie--;

balle4=LoadBMP("boule_de_feu4.bmp");
SDL_SetColorKey(balle4,SDL_SRCCOLORKEY ,SDL_MapRGBA(balle4->format,255,0,255,0));
rect4.x = 100;
rect4.y = 300;
rect5.x = 200;
rect5.y = 560;
if (joueur.vie == 2)vie1 = NULL;
if (joueur.vie == 1)vie2 = NULL;
if (joueur.vie == 0)vie3 = NULL;
start = 0;
}
if (joueur.vie == -1) break;

SDL_BlitSurface(firstscreen,NULL,screen,NULL);
SDL_BlitSurface(balle4,NULL,screen,&rect4);
SDL_BlitSurface(plaque,NULL,screen,&rect5);
for (i=0; i<231; i++)
{
SDL_BlitSurface(brique,NULL,screen,&rect6[i]);
}
SDL_BlitSurface(vie1,NULL,screen,&rect_vie1);
SDL_BlitSurface(vie2,NULL,screen,&rect_vie2);
SDL_BlitSurface(vie3,NULL,screen,&rect_vie3);
SDL_Flip(screen);
}
SDL_Quit();
SDL_ShowCursor(1);
return 0;
}

Malheuresement, avant il se lançait, ensuite j´aai esssayé d´y rajouter les calculs des angles avec le cosinus, mais je n´arrivais pas a enlever tout les bugs, alors j´ai enlevé tout ce qui avait rapport avec les calculs des angles, mais mon programme ne se lance plus !! !

Enfin si, il se lance, mais il n´y pas la fenetre sdl, et je peux faire echap pour quitter (if (key[SDLK_ESCAPE]) break;)

Je sais, ça va surement pas etre facil a débugger et je vous balance mon prog comme ça, mais aidez moi plz, ça fait 2 jours que je bloque !! !

Lapintade
Lapintade
Niveau 30
31 août 2005 à 08:42:52

Je te conseille de faire des sauvegardes reguliere de ton code (toutes les semaine par exemple). Comme ca, dans ce genre de cas, tu peux revenir a une version anterieure.

Je pense que dans toutes tes manips, tu as du virer une ligne improtante, fais une comparaison avec un code SDL standard et tu trouveras.

Sinon mets tout ton code en commentaire et lance ton jeu, tu dois au moins avoir une fenetre noire.

Bref quand le probleme est complexe, faut toujours le decouper en petite problemes et les resoudre un par un. En 10 minutes tu va trouver d´ou viens le probleme.

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 08:59:45

Je vais faire comme dit.

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

J´ai mit tout mon main en commentaires, sauf
while(1)
{
UpdateEvents();
if (key[SDLK_ESCAPE]) break;
}
SDL_Quit();
SDL_ShowCursor(1);
return 0;
}
Mais il refuse de le compiler ( Permission denied )

jejej
jejej
Niveau 9
31 août 2005 à 09:35:47

les seules fois où j´ai eu un ´permision denied´ , c´est lorsque mon programme etait deja lance , mais plante ( fais gestionnaire de programme , verifie qu´il n´est pas deja execute , on ne sait jamais ... parfois , le programme se plante , et ne ferme pas ... et on ne peux pas l´avoir en double .

JeanYvesYves
JeanYvesYves
Niveau 10
31 août 2005 à 09:39:54

clair, permission denied, ce n´est pas une erreur de ton compilo, c´est qu´il n´arrive pas a créer l´exe, parce qu´il est déja utilisé.
kill le avant de recompiler

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 10:04:57

Merci de m´aider.

Voila, en testant comme m´a dit Lapintade, j´ai découvert que si je met la ligne
SDL_Rect rect6[300];
et tout ce qui a rapport avec rect 6 en commentaires, mon programme se lance...

Lapintade
Lapintade
Niveau 30
31 août 2005 à 10:05:58

Youpi.

Maintenant faut progressivement remettre pour trouver le code pourrave.

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 10:10:06

Ba je comprend pas trop la... Si je met tout entre crochet sauf rect6[300]; ça plante. Donc le bug doit venir de cette ligne la non ?

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 10:42:25

Ptin c´est saoulant. Moi je cale la... Vous voyez pas d´ou ça pourrait venir?

joacine
joacine
Niveau 6
31 août 2005 à 10:44:01

on dirai du martien ton code

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 11:10:11

C´est sur qu´il est pas très propre, mais ça fait que 2 mois que je fais du c++, alors j´arrive pas encore a m´appliquer.

Mais pourriez vous au moins me dire ce qui pourrait faire que rect6[300] fasse planter le programme?
C´est quand meme étrange !! !

Lapintade
Lapintade
Niveau 30
31 août 2005 à 11:17:22

en general, on utilise pas de variables locales aussi grosse.

Ton rect6, mets le en dehors de ta fonction main et regarde si ca marche.

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 11:20:14

Et bien en bas, dans la barre des taches, a coté de la console il y a sdl_aplication qui apprait, mais mon écran ne passe pas en mode sdl...

JeanYvesYves
JeanYvesYves
Niveau 10
31 août 2005 à 11:27:32

moi ce que je te conseille vivement, c´est d´oublier les structures Rect !
Pour l´instant, tu n´en as pas la réelle utilité :

tu remarques qu´avant chaque blit, tu te fais chier avec une structure rect qui t´emmerde + qu´autre chose :)
La philosophie du C, c´est les fonctions, ça permet de moins se casser la tete :

Fais toi une fonction :

Blit(SDL_Surface* source, SDL_Surface* dest, int X, int Y);

qui te posera ton sprite source sur l´écran dest a X,Y, sans que tu aies besoin de déclarer des SDL_Rect !!

Programme la une fois pour toutes ainsi :

Blit(SDL_Surface* source, SDL_Surface* dest, int X, int Y)
{
SDL_Rect R;
R.x = X;
R.y = Y;
R.w=R.h=0;
SDL_BlitSurface(source,NULL,dest,&R);
}

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 11:33:31

Donc il faut que je supprime toute mes structures rect et que je les remplaces par ce blit ?

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 11:34:45

Donc il faut que je supprime toute mes structures rect et que je les remplaces par ce blit ?

Pour info, avant d´y rajouter des cos et des sins,la structure marchait parfaitement et mon programme aussi.

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 11:35:17

Oups, double... désolé.

N_Cortex
N_Cortex
Niveau 7
31 août 2005 à 11:36:46

Excusez moi de ne pas arrter de poster, mais je fais comment pour remplacer ça ?

for (i=0; i < 231; i++)
{
if (rect4.y >= rect_brik[i].y && rect4.y <= rect_brik[i].y + 14 && rect4.x >= rect_brik[i].x && rect4.x <= rect_brik[i].x + 35 ) {rect_brik[i].x = 1024; sy4 = -(sy4); joueur.score += 100; } //rebond bas

if (rect4.y + 16 >= rect_brik[i].y && rect4.y + 16 <= rect_brik[i].y + 14 && rect4.x >= rect_brik[i].x && rect4.x <= rect_brik[i].x + 35 ) {rect_brik[i].x = 1024; sy4 = -(sy4); joueur.score += 100; } //rebond haut

if (rect4.x >= rect_brik[i].x && rect4.x <= rect_brik[i].x + 33 && rect4.y >= rect_brik[i].y && rect4.y <= rect_brik[i].y + 17 ) {rect_brik[i].x = 1024; sx4 = -(sx4); joueur.score += 100; } //rebond gauche

if (rect4.x + 15 >= rect_brik[i].x && rect4.x + 15 <= rect_brik[i].x + 35 && rect4.y >= rect_brik[i].y && rect4.y <= rect_brik[i].y + 17 ) {rect_brik[i].x = 1024; sx4 = -(sx4); joueur.score += 100; } //rebond droite
}

N_Cortex
N_Cortex
Niveau 7
01 septembre 2005 à 09:01:54

J´ai fait ce que tu m´as dit,
Blit(SDL_Surface* source, SDL_Surface* dest, int X, int Y)
{
SDL_Rect R;
R.x = X;
R.y = Y;
R.w=R.h=0;
SDL_BlitSurface(source,NULL,dest,&R);
}

Mais ça ne fonctionne pas. Il me dit : ISO C++ forbids declaration of `Blit´ with no type

Donc il faut que je rajoute void devant blit ?

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