Ecole Polytechnique Fédérale de Lausanne
Section Sciences de la vie
Programmation Orientée Objet
Tutoriel librairie graphique (SFML)

IV. Gestion du temps: déplacement de la balle

SFML inclut une classe sf::Clock permettant de gérer des horloges, ainsi qu'une classe sf::Time pour représenter des durées.

Un objet de type sf::Clock s'utilise de la manière suivante:

//L'horloge démarre à sa création
sf::Clock clock;
//Récupération du temps écoulé, par exemple dans la boucle de rendu
sf::Time time = clock.getElapsedTime();
//Remise à zéro de l'horloge
clock.restart();

Un objet de type sf::Time possède des méthodes asSeconds(), asMilliseconds() et asMicroseconds() qui permettent de récupérer le temps représenté sous diverses unités.

Nous allons implémenter le déplacement de la balle de la manière suivante: cette dernière aura un angle de déplacement et toutes les 35 ms, la balle sera déplacée dans cette direction.

  1. Pour implémenter cela, commencez par ajoutez un attribut double angle et un attribut sf::Vector2f speed à la classe Ball.

Le type sf::Vector2f représente un vecteur réel à deux dimensions. Toutes les opérations classiques (additions, soustraction, multiplication par un scalaire) sont supportées naturellement. L'attribut speed sera donc simplement un vecteur de norme déterminée pointant vers la direction indiquée par l'angle angle. Lors du déplacement, on remplacera la position de la balle par cette dernière additionnée au vecteur speed.

  1. Créez une méthode void setDirectionFromAngle(double angle) qui modifie l'angle selon l'attribut passé en paramètre et met à jour la vitesse en conséquence.

Si vous êtes fâché avec la trigonométrie (ou plutôt: fatigué), voici comment il faut faire (notez le - sur l'axe vertical pour palier à l'inversion de cet axe par sfml):

void Ball::setDirectionfromAngle(double angle)
{
	speed=sf::Vector2f(5*cos(angle),-5*sin(angle));
	this->angle=angle;
}
  1. Créez une méthode void restart() positionnant la balle au milieu de l'écran et appelant la fonction setDirectionFromAngle avec un angle de disons π/4 (PI/4) pour tester. Plus tard, on pourra utiliser un angle aléatoire pour pimenter un peu le jeu. La méthode init invoquera restart pour démarrer le jeu avec ce positionnement initial de la balle;
  2. Ajoutez maintenant un attribut sf::Clock clock et une méthode void move(). Cette méthode sera appelée à chaque passage dans la boucle de rendu. Son fonctionnement sera le suivant:

    • Si 35 ms se sont écoulées depuis le dernier appel (consulter l'horloge clock), déplacer la balle selon la vitesse speed et remettre l'horloge à zéro.
      Plus explicitement, on additionne le vecteur speed au vecteur position actuel de la balle. En fait, un sprite SFML a déjà une méthode pour faire cela automatiquement: la méthode void move(Vector2f v) (lorsque vous comprendrez la notion d'héritage, vous pourrez voir que sf::Sprite hérite cette méthode de sf::Transformable). Il vous suffit donc de faire :
      sprite.move(speed);
    • Sinon, ne rien faire.
  3. Implémentez donc cette fonction et ajouter l'appel à move() de votre objet Ball dans la boucle de rendu.

La balle devrait maintenant se déplacer! Sinon, relisez les étapes précédentes pour être sûr de ne rien avoir oublié.

Vous pouvez télécharger une solution de cette étape.

Tutorial SFML
Corentin Perret, Jamila Sam - 2013-2019