Iscream | Salut,
je m'initie en ce moment a la programmation en 2D en C avec la librairie sdl.
Pour commencer doucement j'essaie de coder un PONG (tres basique).
Le jeu n'est pas terminé mais déjà je n'arrive pas a gerer la collision avec le haut de l'ecran pour que la "bille" redescende.
Voila le code:
Code :
- #include <stdlib.h>
- #include <stdio.h>
- #include <SDL/SDL.h>
- int main(int argc, char *argv[])
- {
- SDL_Surface *screen, *raquette1, *raquette2, *balle;
- SDL_Rect praquette1, praquette2, pballe;
- SDL_Event event;
- int continuer = 1;
- int i = 1;
- int y = 0;
- SDL_Init(SDL_INIT_VIDEO);
- screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE);
- SDL_WM_SetCaption("PONG avec SDL", NULL);
- //creation des raquettes
- raquette1 = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 100, 32, 0, 0, 0, 0);
- SDL_FillRect(raquette1, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
- praquette1.y = (480 - 100)/2;
- praquette1.x = 0;
- SDL_BlitSurface(raquette1, NULL, screen, &praquette1);
-
- raquette2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 100, 32, 0, 0, 0, 0);
- SDL_FillRect(raquette2, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
- praquette2.y = (480 - 100)/2;
- praquette2.x = 620;
- SDL_BlitSurface(raquette2, NULL, screen, &praquette2);
-
-
-
- //creation de la balle
- balle = SDL_CreateRGBSurface(SDL_HWSURFACE, 30, 30, 32, 0, 0, 0, 0);
- SDL_FillRect(balle, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
- pballe.x = (640 - 30)/2;
- pballe.y = (480 - 30)/2;
- SDL_BlitSurface(balle, NULL, screen, &pballe);
-
- //Ajustements
- SDL_EnableKeyRepeat(10, 10);
- while (continuer)
- {
- SDL_PollEvent(&event);
- switch(event.type)
- {
- case SDL_QUIT:
- continuer = 0;
- break;
-
- case SDL_KEYDOWN:
- switch(event.key.keysym.sym)
- {
- case SDLK_UP: // Flèche haut
- praquette1.y = praquette1.y - 3;
- break;
- case SDLK_DOWN: // Flèche bas
- praquette1.y = praquette1.y + 3;
- break;
- }
- break;
- }
- SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)); /* On efface l'écran */
- SDL_BlitSurface(raquette1, NULL, screen, &praquette1);
- SDL_BlitSurface(raquette2, NULL, screen, &praquette2);
-
- //mouvement de la balle
- switch (pballe.x)
- {
- case 20:
- if( (pballe.y > (praquette1.y - 30)) & (pballe.y < (praquette1.y + 100)))
- {
- i = 1;
- y = -((praquette1.y + 50 ) - (pballe.y +15))/10;
- }
- break;
-
- case 590:
- if( (pballe.y > (praquette2.y - 30)) & (pballe.y < (praquette2.y + 100)))
- {
- i = -1;
- y = -((praquette2.y + 50 ) - (pballe.y +15))/10;
- }
- break;
- }
- if (pballe.y < 0)
- y = -y;
- if (pballe.y > 450)
- y = -y;
-
-
- pballe.x = pballe.x + i;
- pballe.y = pballe.y + y;
-
- SDL_BlitSurface(balle, NULL, screen, &pballe);
- SDL_Flip(screen); /* On met à jour l'affichage */
- }
- SDL_FreeSurface(raquette1);
- SDL_FreeSurface(raquette2);
- SDL_FreeSurface(balle);
- SDL_Quit();
- return EXIT_SUCCESS;
- }
|
je pense que le probleme vient de cette partie (d'ou sinon)
Code :
- if (pballe.y < 0)
- y = -y;
- if (pballe.y > 450)
- y = -y;
|
Pourquoi ca ne marche pas ?
Par ailleurs pourriez vous me donner quelques conseil sur le code pour l'ameliorer ou l'epurer ...
Merci |