Problème code sur le jeu pong avec 2 raquettes

jeremy130710

4 years ago

Bonjour, j'ai tentais de créer le jeu du pong  en suivant le tuto et je bloque à l'étape 4 . Quand je le lance la balle ne rebondit pas sur les raquettes et impossible de trouver pourquoi. Voici le code :

En vous remerciant d'avance pour le temps que vous consacrerez à m'aider sachant que ça doit être un truc tout bête. =P

#include <Gamebuino-Meta.h> 
//carastéristiques de la balle :
int positionX = 20;
int positionY = 20;
int vitesseX = 2;
int vitesseY = 1;
int tballe = 4;
//Caractéristique de la raquette 1 :
int raquette1_posX = 6;
int raquette1_posY = 30;
//Caractéristique de la raquette 2 :
int raquette2_posX = gb.display.width() - 9;
int raquette2_posY = 30;
//Dimensions de la raquette :
int Hraquette = 12;
int Lraquette = 3;
//Scores des joueurs :
int score1;
int score2;
void setup() {
  gb.begin();
}
void loop() {
while (!gb.update());
  gb.display.clear();
//Raffraichissement de la position de la balle :
  positionX = positionX + vitesseX;
  positionY = positionY + vitesseY;

//Pour que la balle ne dépasse pas l'écran :
if(positionY < 0) {
  vitesseY = 1;
}
if (positionY > gb.display.height()-tballe) {
  vitesseY = -1;
}
//Déplacement de la raquette 1 :
if (gb.buttons.repeat(BUTTON_UP,0)) {
  raquette1_posY = raquette1_posY - 1;
}
if (gb.buttons.repeat(BUTTON_DOWN,0)) {
  raquette1_posY = raquette1_posY + 1;
}
//Déplacement de la raquette 2 :
if (gb.buttons.repeat(BUTTON_A,0)) {
  raquette2_posY = raquette2_posY - 1;
}
if (gb.buttons.repeat(BUTTON_B,0)) {
  raquette2_posY = raquette2_posY + 1;
}
//Rebond raquette 1 :
if ((positionX == raquette1_posX + Lraquette)
 && (positionY + tballe >= raquette1_posY)
 && (positionY <= raquette1_posY + Hraquette)) {
  vitesseX = 2;
 }
//Rebond raquette 2 :
 if ((positionX + tballe == raquette2_posX)
 && (positionY + tballe >= raquette2_posY)
 && (positionY <= raquette2_posY + Hraquette)) {
  vitesseX = -2;
 }
//Score joueur 1 :
if (positionX > gb.display.width()) {
  positionX = 20;
  positionY = 20;
  vitesseX = 2;
  vitesseY = 1;
  score1 = score1 + 1;
}
//Score joueur 2 :
if (positionX < 3) {
  positionX = 20;
  positionY = 20;
  vitesseX = 2;
  vitesseY = 1;
  score2 = score2 + 1;
}
//Affichage :
  gb.display.setColor(DARKBLUE);
  gb.display.setCursor(35,5);
  gb.display.print(score1);
  gb.display.setColor(RED);
  gb.display.setCursor(45,5);
  gb.display.print(score2);
  gb.display.setColor(ORANGE);
  gb.display.fillRect(positionX, positionY, tballe, tballe);
  gb.display.setColor(DARKBLUE);
  gb.display.fillRect(raquette1_posX, raquette1_posY, Lraquette, Hraquette);
  gb.display.setColor(RED);
  gb.display.fillRect(raquette2_posX, raquette2_posY, Lraquette, Hraquette);
}

Codnpix

NEW 4 years ago

Salut,

je n'ai pas essayé de compiler ton code pour vérifier mais à première vue je dirais que ton problème vient de la condition que tu utilises pour que ta balle rebondisse : 

if ((positionX == raquette1_posX + Lraquette)
 && (positionY + tballe >= raquette1_posY)
 && (positionY <= raquette1_posY + Hraquette)) {
  vitesseX = 2;
 }

Ta vitesse est égale à 2 ce qui veut dire qu'à chaque frame ta balle se déplace de deux pixels, mais dans ta condition tu testes la position de la balle avec un "==" ce qui veut dire que pour rebondir elle doit être exactement également à cette valeur, sauf qu'une fois sur deux elle n'y passe pas...

Bref je pense que ton code devrait marcher si tu remplaces par :

if ((positionX <= raquette1_posX + Lraquette)
 && (positionY + tballe >= raquette1_posY)
 && (positionY <= raquette1_posY + Hraquette)) {
  vitesseX = 2;
 }

Et pour la deuxième raquette 

 if ((positionX + tballe >= raquette2_posX)
 && (positionY + tballe >= raquette2_posY)
 && (positionY <= raquette2_posY + Hraquette)) {
  vitesseX = -2;
 }


En espérant que ça te dépannera :).

jeremy130710

4 years ago

Merci ça marche beaucoup mieux ^^ je savais que l'erreur devais venir de cette partie mais sans comprendre exactement où.

Question surement idiote, mais on peut mettre tout les programmes qu'on a créés sur la carte SD pour les lancer sans être connecté au pc  ? Comme les jeux préinstaller ?

Désolé je suis en pleine découverte =P

jeremy130710

NEW 4 years ago

Codnpix Codnpix

Merci ça marche beaucoup mieux ^^ je savais que l'erreur devais venir de cette partie mais sans comprendre exactement où.

Question surement idiote, mais on peut mettre tout les programmes qu'on a créés sur la carte SD pour les lancer sans être connecté au pc  ? Comme les jeux préinstaller ?

Désolé je suis en pleine découverte =P

Codnpix

NEW 4 years ago

Question surement idiote, mais on peut mettre tout les programmes qu'on a créés sur la carte SD pour les lancer sans être connecté au pc  ? Comme les jeux préinstaller ?

Oui bien sûr, il suffit d'exporter le code en binaire compilé (dans l'IDE Arduino, croquis->exporter les binaires compilés). Le fichier .bin qui est créé doit être dans un dossier du même nom que lui (donc si le fichier s'appelle mon_jeu.bin le dossier doit s'appeler mon_jeu, et on peut renommer tout ça comme on veut bien sûr), puis il faut juste mettre le dossier à la racine de la carte SD et c'est bon :).

Si il n'y a pas d'images de titre et d'icone dans le dossier le jeu s'affichera simplement dans le menu avec son nom en blanc sur noir. Sinon il faut rajouter un ICON.bmp et un TITLESCREEN.bmp...

jeremy130710

NEW 4 years ago

Encore merci pour ton aide =D