Théorie: réagir au temps qui passe #
Déplacer un objet 2d #
- L’objet 2d a aussi une vitesse
- Cette vitesse indique comment déplacer l’objet
En Ntro
#
- On peut choisir la vitesse dès le début
public class Balle2d extends ObjetPong2d {
public Balle2d() {
super();
// ...
setSpeedX(100);
setSpeedY(50);
}
- Ou attendre après un événement usager (p.ex. touche du clavier)
Réagir au temps qui passe #
- Pour déplacer un objet on va:
- Attendre que le temps passe
- Déplacer un tout petit peu l’objet selon sa vitesse
- Ré-afficher le monde 2d
En Ntro
#
-
Ajouter une tâche qui s’exécute à chaque
clock().nextTick()- (c-à-d dès que possible)
subTasks.task("prochaineImagePartie") .waitsFor(created(VuePartie.class)) .waitsFor(created(DonneesVuePartie.class)) .waitsFor(clock().nextTick()) .executes(inputs -> { Tick tick = inputs.get(clock().nextTick()); DonneesVuePartie donneesVuePartie = inputs.get(created(DonneesVuePartie.class)); VuePartie vuePartie = inputs.get(created(VuePartie.class)); donneesVuePartie.reagirTempsQuiPasse(tick.elapsedTime()); donneesVuePartie.afficherSur(vuePartie); }); -
Appeler le
onTimePassesdu monde 2d (méthode héritée deWorld2dFx)public class DonneesVuePartie implements ViewData { // ... public void reagirTempsQuiPasse(double secondesEcoulees) { mondePong2d.onTimePasses(secondesEcoulees); } -
World2dFx.onTimePassesva notifier chaque objet que le temps passepublic abstract class World2dFx { public void onTimePasses(double secondsElapsed) { for(Object2d objet2d : objects) { objet2d.onTimePasses(secondsElapsed); } } -
Par défaut, un objet 2d se déplace selon sa vitesse
public abstract class Object2d { public void onTimePasses(double secondsElapsed) { topLeftX += speedX * secondsElapsed; topLeftY += speedY * secondsElapsed; // [appliquer aussi l'accélération] } -
On peut aussi redéfinir
onTimePasseset ajouter du comportementpublic class Balle2d extends ObjetPong2d { // ... @Override public void onTimePasses(double secondsElapsed) { // comportement par défaut super.onTimePasses(secondsElapsed); // comportement spécifique à la balle if(balleFrappeMurGauche()) { balleRebondiSurMurGauche(); } else if(balleFrappeMurDroit()) { balleRebondiSurMurDroit(); } // ... }