Si je met juste la balle a rebondir, mon programme ne raaaaaaame paaaaaaaas.
Je crois que je vais peter un cable... Serait-ce mest struct et mes variables qui beug ?
Qu´est ce que tes compétences ont à voir ?
Ben tu oublie des mots clefs, tu mets trop d´arguments aux fonctions et à la vue de ton code en général...
Enfin bon on peut etre distrait, coder comme un porc mais avoir de bonnes compétences quand meme...
Pour ton problème je crois que j´ai la solution mais je répondrai plus tard, je dois y aller là...
Ok, merci quand meme.
Par contre, par rapport a coder comme un porc, j´ai toujours débuter un langage comme ça... (allez voir sur le forum writing-pad, j´ai un sujet de 3 pages a cause d´un problème trop con... :p
Bon, je up le topic pour vengeur.
Pitié, Vengeur, donne moi la solutioon a mon problème !! !
SW_Surface à la place de HW_Surface ?
Ram au lieu de VRAM ?
Bidouille la dedans...
J´aimerais connaître ta configuration j´ai vu plein de fois des gens qui se plaignaient que la SDL rammait (d´ailleurs quoi q´on dise elle est gourmande)... Faut optimiser un max...
Je me rappelle de mon premier jeu : un petit mario avec 5 sprites à l´écran qui rammait comme pas 2 sur mon vieux P3 à 700mhz et maintenant que j´optimise, mon LeZardWare (qui a souvent une 30 aine de sprites à l´écran) tourne tranquillou...
Optimizasheune !
A la base, je suis parti du petit programme de JYY qui faisait rebondir un balle a l´écran, puis j´ai rajouté plein de trucs.
Mon pc est un pentium II 350mhz 128 mo de ram, alors je pense qu´il va falloir optimiser un max.
Mais comment fonctionne l´optimisation ?
Ah oui d´accord jvois le truc...
T´as pas grand chose à faire.
Pour optimiser ton code ben faut au maximum macher le travail de l´ordinateur (par exemple au lieu de marquer direct dans ton code cos(3) ecrit directement le résultat), fait lui blitter des images plus petites enfin bref, t´as du travail...
Surtout avec un pc pareil...
Enfin bon, mon pc arrive a faire tourner starcraft sans lag, il devrait bien réussir a faire tourner un pauv programme tout pourris !!
Il y´a une grosse différence : la SDL est software, elle utilise directement le cpu et la ram.
Starcraft utilise des librairies hardware qui laissent le gros du calcul au gpu de la carte graphique...
okokok....
Par contre, je vois pas ou j´ai mit swsurface et ram... je n´ai mit que des vram et aucun swsurface ou hwsurface !!
Mon 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--;
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);
if (ball.y < 300)
{
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;
}
Bon j´ai décidé de recommencer le programme quasiment a zéro, parce que la, c´est trop la galère.
Donc j´ai décidé de ranger mes images dans des dossiers, mais
firstscreen=LoadBMP("backgrounds\font_etoiles.bmp"
);
ne fonctionne pas...
Alors il vaut mieux faire ça comment ?
/ à la place de \
ok merci
ALELUIA !! !!!!!!!
J´ai trouvé d´ou vient le lag !! !
C´est mon image qui est trop grosse !!
Alors, j´aimerais bien savoir, comment optimiser une image bmp ?
Y a t il moyen d´utiliser des images autre que des bmp ?
J´ai trouvé la libraire sdl_image qui permet de faire ça, mais c´est quoi les liens qu´il faut mettr e ? Je trouve pas sur le site.
Une image bmp une fois chargé prendra autant de mémoire qu´une png... Une solution est de découper l´image en plusieurs petites images...
Je vais essayer ça.
YAHOOOOOOOOOH !! ! CA NE RAME PLUS !! !
MERCI VENGEUR !!
TU ES MON DIEU !! !
MAINTENANT JE TE VOUVOIRAI !!