Programmation du Jeu Pong en Java – Modifions le jeu avec une vitesse variable ! (3/6)

On a vu que dans le jeu original la vitesse de la balle augmente au cours de la partie, jusqu’à ce que l’un des joueurs perde le point.

Or dans la version du tutoriel la balle va toujours à la même vitesse.

On doit donc trouver comment changer la vitesse de la balle pendant le jeu.

Etude de la classe BallMovement

Le fichier qui dirige la balle s’appelle BallMovement.

public BallMovement() {
   move = new Timer();
   move.scheduleAtFixedRate(
      new TimerTask() {
         public void run() {
            Var.ballx += Var.balldirx;
            Var.bally += Var.balldiry;
         }
      },
      0,
      4
   );
}

Toutes les 4 millisecondes, le timer exécute ce qui est dans la méthode run() : la nouvelle position de la balle qui est ballx et bally, est modifiée de balldirx et balldiry.

Dans la version du tutoriel la balledirx et la balldiry sont toujours 1 ou -1 et c’est le fichier BallKollision qui change ces valeurs quand la balle touche une raquette.

Ajout de la variable ‘vitesse’

On doit modifier le code pour ajouter la notion de vitesse.

On va donc créer la variable vitesse dans le fichier var.

static int vitesse=3;

Et maintenant faire changer la position en utilisant la vitesse :

Var.ballx += Var.balldirx * Var.vitesse;
Var.bally += Var.balldiry * Var.vitesse;

En relançant le jeux la balle va beaucoup plus vite (3 fois) et c’est plus difficile à jouer !!!

Augmentation de la vitesse pendant le jeu

Il faut maintenant trouver un moyen de changer la vitesse pendant le jeu, donc il faut savoir depuis quand le jeu a commencé. On va donc ajouter une variable débutjeu


static long debutJeu= 0;

A chaque fois que la balle est mise au centre on mémorise l’heure de la partie


Var.debutJeu = System.currentTimeMillis();

 

A chaque cycle de BallKollision on va calculer une vitesse qui va dépendre de la durée de la partie.


long maintenant = System.currentTimeMillis();
long duree = maintenant - Var.debutJeu;
Var.vitesse = 1 + duree / 10000;
Var.ballx += Var.balldirx * Var.vitesse;
Var.bally += Var.balldiry * Var.vitesse;

Toutes les dix secondes la balle accélère.

En relançant le jeu c’est bien ce qui ce passe. Mais la vitesse augmente de 1 à chaque fois : quand la vitesse passe de 1 à 2, c’est trop rapide pour l’ordinateur.

Changement plus progressif de la vitesse

On doit trouver le moyen de rendre progressif l’accélération de la balle. Au lieu d’utiliser des nombres entiers on utilise des nombres décimaux.

Dans le fichier Var, cela donne :

static double ballx = 200, bally = 500;
static double vitesse=1;

Dans le fichier BallMovement, cela donne :

long maintenant = System.currentTimeMillis();
double duree = maintenant - Var.debutJeu;
Var.vitesse = 1.0 + duree / 10000.0;
Var.ballx += Var.balldirx * Var.vitesse;
Var.bally += Var.balldiry * Var.vitesse;

On a aussi dû corriger la classe Draw car le dessin doit se faire avec des nombres entiers (dessin de la balle à sa position) :

g.fillRect((int)Var.ballx, (int) Var.bally, 20, 20);

Hourra ! Le programme marche comme l’original avec une balle qui accélère en cours de jeu !