J´ai créer un petit casse brique en c++ dont voici le code :
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 !! !
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.
Je vais faire comme dit.
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 )
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 .
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
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...
Youpi.
Maintenant faut progressivement remettre pour trouver le code pourrave.
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 ?
Ptin c´est saoulant. Moi je cale la... Vous voyez pas d´ou ça pourrait venir?
on dirai du martien ton code
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 !! !
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.
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...
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);
}
Donc il faut que je supprime toute mes structures rect et que je les remplaces par ce blit ?
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.
Oups, double... désolé.
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
}
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 ?