Est ce que tu as lu mon chapitre sur les fonctions, ou est ce que tu recopies betement ce que j´ai fait ?
En effet, j´ai fait une faute en écrivant la fonction !
Il y a quelque chose a mettre devant Blit, pour la déclaration : un indice, la fonction ne retourne rien...
A toi de trouver !
Oui, j´avais mu ton chapitre sur les fonctions, et j´ai donc rajouter void devant, mais il me dit :
Blit(balle,NULL,screen,ball.x, ball.y);
Erreurs :
1-invalid conversion from `SDL_Surface*´ to `int´
2-at this point in file
Et a la fonction blit :
void 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);
}
too many arguments to function `void Blit(SDL_Surface*, SDL_Surface*, int, int)´
Mais comme je sais pas trop ce que je dois faire, j´aimerais bien que tu m´aides un petit peu, s´il te plait.
et ben alors ?
void Blit(SDL_Surface* source, SDL_Surface* dest, int X, int Y)
Compte combien la fonction attend d´argument ?
4 n´est ce pas ?
et ton appel ?
Blit(balle,NULL,screen,ball.x, ball.y);
Combien tu lui en donnes ?
4 ? recompte donc
Que viens foutre ce "NULL" ??
le but de cette fonction est de simplifier les appels, toute une histoire de logique !
LOL je viens de comprendre grace a toi !! En fait je sais pas trop ce que j´ai foutu puisque j´avais bien recompté et j´avais trouvé 5...
Enfin bon, merci !! !
C´est sur, ça a simplifié mon programme (c´est plus lisible maintenant ^^) mais ça bug toujours...
je vais essayer de retrouver une ancienne dversion de mon programme que j´avais foutue sur le net pour voir...
toujours se simplifier la vie ![]()
si une fonction t´emmerde, t´en crée une autre qui l´englobe (comme Blit qui englobe SDL_Blit et ces vieux Rect)
et tu te simplifies mortel la vie ![]()
et pour info, il faut savoir lire les messages d´erreurs :
too many arguments to function `void Blit(SDL_Surface*, SDL_Surface*, int, int)´
--> explicite !!
t´en mets trop
invalid conversion from `SDL_Surface*´ to `int´
--> en fait, il évalue les arguments dans l´ordre : toi tu lui donnais :
Blit(balle,NULL,screen,ball.x, ball.y);
et il y rangeais dans :
void Blit(SDL_Surface* source, SDL_Surface* dest, int X, int Y)
Alors balle, il le met dans "source"
NULL, il le met dans "dest"
screen, c´est le 3e, donc il essaie de le mettre dans int X
--> screen est un SDL_Surface*, tu essaies de le ranger dans un int ?
la ça gueule ! il te le dit :
"je ne peux pas convertir un SDL_Surface* en int !! "
c´est ça qu´il te dit
savoir lire les messages d´erreur, ça aide !
Putin j´y crois pas. J´ai retrouver l´ancienne version de mon prog, mais CA FAIT COMME LA VERSION ACTUELLE, CA RAME !! !!
Je suis dégouté et je comprends rien, avant ça marchait parfaitement...
Je vais reboot mon pc pour voir si ça vient de la...
Vous pouvez tester mon ancien prog plz ? Juste pour voir si ça rame chez vous...
--> http://membres.lycos.fr/ncortex/
A la ligne "CasseBriqueAlpha.zip"
vérifie que tu n´as pas de loadbmp dans ta boucle
refait ton prog en clair, puis je regarderai
C´est quoi l´ancienne version de ton prog ?
parceque , si elle est comme la premiere ( de ton premier post sur le topic ) , c´est pas etonnant que ça rame... reposte ton code si il est different , si tu veux .
C´est quoi l´ancienne version de ton prog ?
parceque , si elle est comme la premiere ( de ton premier post sur le topic ) , c´est pas etonnant que ça rame... reposte ton code si il est different , si tu veux .
Bon, je repost mon nouveau code, et vous pouvez tester le programme sur le meme ftp, mais au nom de
casse brique qui rame.zip
Voila le code :
SDL_Surface* screen;
SDL_Event event;
char key[400];
int xsouris=0,ysouris=0,xrelsouris=0,yrelsouris=0;
//toutes les structures des objets
struct player
{
int score;
int vie;
};
struct balle
{
int x;
int y;
bool in;
};
struct vaisseau
{
int x;
int y;
bool in;
int anim;
};
struct briques
{
int x;
int y;
bool in;
};
struct life
{
int x;
int y;
bool in;
};
//initialisation de sdl + updates events ect (merci JYY ^^)
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;
}
void 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);
}
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)
{
//déclaration des variables + structures
struct player joueur;
joueur.vie = 3;
int s=1, pos_x=35, pos_y=0, i=0, start=0;
int sx4=0,sy4=0;
init_SDL();
struct balle ball;
ball.x = 100;
ball.y = 300;
ball.in = true;
struct vaisseau plaque;
plaque.x = 200;
plaque.y = 510;
plaque.in = true;
struct briques briks[250];
for (i=0; i<231; i++)
{
briks[i].x = pos_x;
briks[i].y = pos_y;
briks[i].in = true;
pos_x = pos_x + 35;
if (pos_x >= 765) {pos_y += 17;pos_x = 35;}
}
struct life vie[3];
for (i=0;i<=3;i++)
{
pos_x = 620;
vie[i].x = pos_x;
vie[i].y = 20;
vie[i].in = true;
pos_x += 20;
}
//création des surfaces
SDL_Surface* firstscreen;
SDL_Surface* balle;
SDL_Surface* img_plaque;
SDL_Surface* img_plaqued;
SDL_Surface* img_plaqueg;
SDL_Surface* brique;
SDL_Surface* vie1;
SDL_Surface* vie2;
SDL_Surface* vie3;
int fini=0;
//creation des objets + transparence
firstscreen=LoadBMP("font.bmp");
balle=LoadBMP("boule_de_feu4.bmp");
img_plaque=LoadBMP("plaque.bmp");
img_plaqued=LoadBMP("plaque-d.bmp");
img_plaqueg=LoadBMP("plaque-g.bmp");
brique=LoadBMP("brique_bleu.bmp");
vie1=LoadBMP("vie.bmp");
vie2=LoadBMP("vie.bmp");
vie3=LoadBMP("vie.bmp");
SDL_SetColorKey(balle,SDL_SRCCOLORKEY ,SDL_MapRGBA(balle->format,255,0,255,0));
SDL_SetColorKey(img_plaqued,SDL_SRCCOLORKEY ,SDL_MapRGBA(img_plaque->format,255,0,255,0));
SDL_SetColorKey(img_plaqueg,SDL_SRCCOLORKEY ,SDL_MapRGBA(img_plaque->format,255,0,255,0));
SDL_SetColorKey(img_plaque,SDL_SRCCOLORKEY ,SDL_MapRGBA(img_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) //boucle principale
{
UpdateEvents(); //recherche d´events, et quitte si echap ou lance la balle si return
if (key[SDLK_RETURN] && start == 0) {sy4 = 1; sx4 = 1; start = 1;}
if (key[SDLK_ESCAPE]) break;
//animation du vaisseau
if (xrelsouris > 0) plaque.anim = 0;
if (xrelsouris == 0) plaque.anim = 1;
if(xrelsouris < 0) plaque.anim = 2;
//mouvements de la balle
ball.x+=9*sx4;
ball.y+=9*sy4;
//rebonds de la balle
if (ball.x<0) sx4=1;
if (ball.y<0) sy4=1;
if (ball.x>785) sx4=-1;
if (ball.y + 16 > plaque.y && ball.x > plaque.x - 100 && ball.x < ball.x + 150 ) sy4=-1;
if (ball.y > 600) ball.in=false;
//destruction des briques
for (i=0; i < 231; i++)
{
if (ball.y >= briks[i].y && ball.y <= briks[i].y + 14 && ball.x >= briks[i].x && ball.x <= briks[i].x + 35 ) {briks[i].in = false; sy4 = -(sy4); joueur.score += 100; } //rebond bas
if (ball.y + 16 >= briks[i].y && ball.y + 16 <= briks[i].y + 14 && ball.x >= briks[i].x && ball.x <= briks[i].x + 35 ) {briks[i].in = false; sy4 = -(sy4); joueur.score += 100; } //rebond haut
if (ball.x >= briks[i].x && ball.x <= briks[i].x + 33 && ball.y >= briks[i].y && ball.y <= briks[i].y + 17 ) {briks[i].in = false; sx4 = -(sx4); joueur.score += 100; } //rebond gauche
if (ball.x + 15 >= briks[i].x && ball.x + 15 <= briks[i].x + 35 && ball.y >= briks[i].y && ball.y <= briks[i].y + 17 ) {briks[i].in = false; sx4 = -(sx4); joueur.score += 100; } //rebond droite
}
// mouvements du vaisseau
plaque.x = xsouris - 100;
if (plaque.x < 100) xsouris = 100;
if (plaque.x > 700) xsouris = 700;
//restart si la balle meurt
if (ball.in == false)
{
joueur.vie--;
SDL_SetColorKey(balle,SDL_SRCCOLORKEY ,SDL_MapRGBA(balle->format,255,0,255,0));
ball.x = 100;
ball.y = 300;
ball.in = true;
plaque.x = 200;
plaque.y = 560;
if (joueur.vie == 2)vie[1].in = false;
if (joueur.vie == 1)vie[2].in = false;
if (joueur.vie == 0)vie[3].in = false;
start = 0;
}
if (joueur.vie == -1) break; // quitte si le joueur n´a plus de vies
// génération a l´écran
SDL_BlitSurface(firstscreen,NULL,screen,NULL);
if (ball.in == true)Blit(balle,screen,ball.x, ball.y);
if (plaque.in == true && plaque.anim == 1)Blit(img_plaque,screen,plaque.x,plaque.y);
if (plaque.in == true && plaque.anim == 0)Blit(img_plaqueg,screen,plaque.x,plaque.y);
if (plaque.in == true && plaque.anim == 2)Blit(img_plaqued,screen,plaque.x,plaque.y);
for (i=0;i<231;i++)
{
if(briks[i].in == true)Blit(brique,screen,briks[i].x,briks[i].y);
}
if (vie[1].in == true)Blit(vie1,screen,vie[1].x,vie[1].y);
if (vie[2].in == true)Blit(vie2,screen,vie[2].x,vie[2].y);
if (vie[3].in == true)Blit(vie3,screen,vie[3].x,vie[3].y);
SDL_Flip(screen);
}
SDL_Quit();
SDL_ShowCursor(1);
return 0;
}
Qui de toute façon est dans le fichier zip.
pourquoi un SDL_SetColorKey appelé en boucle ?
je pense que ce sont tes tests qui font ralentir : le coup de ´
//destruction des briques
for (i=0; i < 231; i++)
{
puis mass ´if´ apres , il aime pas ...
tu pourrais peut etre ( je dis ça à l´instinct )
considerer ton ecran comme un tableau , avec des briques bonnes ou non
un tableau a deux entrees
et donc , si ta balle est au coordonnées X,Y
tu regardes si il y a une brique bonne au coordonnées
tab[X%tailledutableau][y/tailledutableau] ( pour % et / , c peut etre l´inverse , trop tot pour reflechir )
et c tout , pas beosin de tout tester , si ta balle est en bas a droite , aucun riques pour que la raquette en haut a gauche soit touchée
Donc chez vous aussi ça rame ?
Mais le truc le plus étrange, c´est que mon ancien programme ne RAMAIT PAS AVANT et que maintenant IL RAME !! ! :´(
Aperreme,t, chez un pote l´ancien prog de rame pas... Est-ce que ça viendrait de mon pc ?? ?
J´ai du nouveau !!
Le problème ne vient pas de la création et de la gestion des briques.
Quand j´ai supprimer tout ça, il ramait toujours !!
Excusez moi, je n´avais pas terminer de tester, je suis aller un peu vite. En fait le problème vient des mouvements de la plaque en bas !!
Mon avis c´est que tu n´as aucune connaissance préalable en C++ et que tu as sauté tous les cours en mode texte parce que ca te faisait chier pour passer directement à SDL...
Sinon, ben relis les cours, fait des exercices etc au lieu de t´attaquer à trop gros. Avant d´utiliser la SDL il faut que tu connaisse très bien le C++ et que tu sois capable de faire de très gros programme (de gestion par exemple) en mode texte...
Avant, mon programme fonctionnait très bien. J´ai rajouter des trucs, puis je les ai enlever. Maintenant mon programme rame a mort. Pourtant, rien n´a été changer par rapport au programme précédent.
En plus, j´avais fait une version courte de mon programme, et elle marchait a merveille. Je l´ai récupérée et elle aussi rame a mort.
Qu´est-ce que mes compétences ont a voir la dedans ?
Ca fait 1 ans que je fais de la programmation, quand meme...