PONG en sdl

PONG en sdl - C - Programmation

Marsh Posté le 23-06-2006 à 18:06:40    

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 :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL/SDL.h>
  4. int main(int argc, char *argv[])
  5. {
  6.     SDL_Surface *screen, *raquette1, *raquette2, *balle;
  7.     SDL_Rect praquette1, praquette2, pballe;
  8.     SDL_Event event;
  9.     int continuer = 1;
  10.     int i = 1;
  11.     int y = 0;
  12.     SDL_Init(SDL_INIT_VIDEO);
  13.     screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE);
  14.     SDL_WM_SetCaption("PONG avec SDL", NULL);
  15.     //creation des raquettes
  16.     raquette1 = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 100, 32, 0, 0, 0, 0);
  17.     SDL_FillRect(raquette1, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
  18.     praquette1.y = (480 - 100)/2;
  19.     praquette1.x = 0;
  20.     SDL_BlitSurface(raquette1, NULL, screen, &praquette1);
  21.    
  22.     raquette2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 100, 32, 0, 0, 0, 0);
  23.     SDL_FillRect(raquette2, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
  24.     praquette2.y = (480 - 100)/2;
  25.     praquette2.x = 620;
  26.     SDL_BlitSurface(raquette2, NULL, screen, &praquette2);
  27.    
  28.    
  29.    
  30.     //creation de la balle
  31.     balle = SDL_CreateRGBSurface(SDL_HWSURFACE, 30, 30, 32, 0, 0, 0, 0);
  32.     SDL_FillRect(balle, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
  33.     pballe.x = (640 - 30)/2;
  34.     pballe.y = (480 - 30)/2;
  35.     SDL_BlitSurface(balle, NULL, screen, &pballe);
  36.    
  37.     //Ajustements
  38.     SDL_EnableKeyRepeat(10, 10);
  39.     while (continuer)
  40.     {
  41.         SDL_PollEvent(&event);
  42.         switch(event.type)
  43.         {
  44.         case SDL_QUIT:
  45.              continuer = 0;
  46.              break;
  47.            
  48.         case SDL_KEYDOWN:
  49.              switch(event.key.keysym.sym)
  50.              {
  51.                case SDLK_UP: // Flèche haut
  52.                     praquette1.y = praquette1.y - 3;
  53.                     break;
  54.                case SDLK_DOWN: // Flèche bas
  55.                     praquette1.y = praquette1.y + 3;
  56.                     break;
  57.              }
  58.              break;
  59.         }
  60.         SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)); /* On efface l'écran */
  61.         SDL_BlitSurface(raquette1, NULL, screen, &praquette1);
  62.         SDL_BlitSurface(raquette2, NULL, screen, &praquette2);
  63.        
  64.         //mouvement de la balle
  65.         switch (pballe.x)
  66.            {
  67.            case 20:
  68.                 if( (pballe.y > (praquette1.y - 30)) & (pballe.y < (praquette1.y + 100)))
  69.                 {
  70.                     i = 1;
  71.                     y = -((praquette1.y + 50 ) - (pballe.y +15))/10;
  72.                 }
  73.                 break;
  74.        
  75.            case 590:
  76.                 if( (pballe.y > (praquette2.y - 30)) & (pballe.y < (praquette2.y + 100))) 
  77.                 {
  78.                     i = -1;
  79.                     y = -((praquette2.y + 50 ) - (pballe.y +15))/10;
  80.                 }
  81.                 break;
  82.            }
  83.         if (pballe.y < 0)
  84.            y = -y;
  85.         if (pballe.y > 450)
  86.            y = -y;
  87.        
  88.        
  89.         pballe.x = pballe.x + i;
  90.         pballe.y = pballe.y + y;
  91.        
  92.         SDL_BlitSurface(balle, NULL, screen, &pballe);
  93.         SDL_Flip(screen); /* On met à jour l'affichage */
  94.     }
  95.     SDL_FreeSurface(raquette1);
  96.     SDL_FreeSurface(raquette2);
  97.     SDL_FreeSurface(balle);
  98.     SDL_Quit();
  99.     return EXIT_SUCCESS;
  100. }


 
je pense que le probleme vient de  cette partie (d'ou sinon)

Code :
  1. if (pballe.y < 0)
  2.            y = -y;
  3. if (pballe.y > 450)
  4.            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

Reply

Marsh Posté le 23-06-2006 à 18:06:40   

Reply

Marsh Posté le 23-06-2006 à 18:15:02    

Ben, si pballe.y est égal à 451 on va un peu tourner en rond, j'ai l'impression.

Reply

Marsh Posté le 24-06-2006 à 13:16:08    

En realité pballe.y est unsigned donc jamais inferieur a zero

Reply

Marsh Posté le 24-06-2006 à 14:40:10    

Ca ne change rien et ça montre que c'est programmé un peu "bizarrement", ty peux virer ton test inutile).  
A toi de voir ce que tu dois faire lorsque pballe.y devient supérieur à 450. y négatif correspond à quoi ?

Reply

Marsh Posté le 24-06-2006 à 17:52:53    

je ne comprend pas ce que tu dis.
le prog marche avec un if(pballe.y == 0).
le test sert a detecter une collision avec le bord de l'ecran.
et y corresond a la "vitesse" verticale de la balle qui s'inverse lors de la collision pour simuler un rebond.  
Voila.
Le code est certainement un peu alambiqué, premierement parce que je ne suis pas un pro en C et aussi parce que je fais un pong un peu perso, la gestion est "artisanale" et c'est pourquoi j'aurai aimé des critiques sur le code. Pour l'ameliorer, le simplifier, bref le rapprocher d'un pong traditionnel.
 


Message édité par Iscream le 24-06-2006 à 17:53:46
Reply

Marsh Posté le 24-06-2006 à 22:30:11    

OK.
Je regarde simplement ton code, je ne peux pas tester je n'ai pas SDL.
Je viens de voir ça aussi :

Code :
  1. if( (pballe.y > (praquette1.y - 30)) & (pballe.y < (praquette1.y + 100)))


Si tu veux faire un et logique il faut mettre && et non pas & qui est le et binaire.


Message édité par Trap D le 24-06-2006 à 22:30:36
Reply

Marsh Posté le 25-06-2006 à 12:16:40    

ok merci je n'avais pas fait attention et tout semblait se passer normalement.
Je modifie. Le pong est terminé, avec un peu de mal pour gerer des trajectoire qui ne soit pas trop monotone lorsque la raquette  est gérée par l'ordi.
A ce propos comment peut on generer un nombre entier relatif aleatoirement en C ?

Reply

Marsh Posté le 25-06-2006 à 13:50:02    

Pour obtenir un nombre compris entre a et b entiers quelconques, tu fais
int randomValue = a + (int)((float)rand() / RAND_MAX * (b - a));

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed