Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2204 connectés 

  FORUM HardWare.fr
  Programmation
  C

  PONG en sdl

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

PONG en sdl

n°1393910
Iscream
Posté le 23-06-2006 à 18:06:40  profilanswer
 

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

mood
Publicité
Posté le 23-06-2006 à 18:06:40  profilanswer
 

n°1393914
Trap D
Posté le 23-06-2006 à 18:15:02  profilanswer
 

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

n°1394124
Iscream
Posté le 24-06-2006 à 13:16:08  profilanswer
 

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

n°1394153
Trap D
Posté le 24-06-2006 à 14:40:10  profilanswer
 

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 ?

n°1394247
Iscream
Posté le 24-06-2006 à 17:52:53  profilanswer
 

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
n°1394310
Trap D
Posté le 24-06-2006 à 22:30:11  profilanswer
 

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
n°1394385
Iscream
Posté le 25-06-2006 à 12:16:40  profilanswer
 

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 ?

n°1394424
Trap D
Posté le 25-06-2006 à 13:50:02  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  PONG en sdl

 

Sujets relatifs
lift pong[RECH] Jeux de pong programmé en Python
Jeux Pong questions + downloadGLPong : un jeu multijoueur de type Pong... à tester !
[RCH] Pong tout simple en visual basic[RCH] PONG en visual basic
Code source de pong ?? 
Plus de sujets relatifs à : PONG en sdl


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)