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
#
- Choisir la vitesse dès le début
public class Balle2d extends ObjetPong2d {
@Override
public void initialize() {
// ...
setSpeedX(100);
setSpeedY(50);
}
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
onTimePasses
du monde 2d (méthode héritée deWorld2dFx
)public class DonneesVuePartie implements ViewData { public void reagirTempsQuiPasse(double secondesEcoulees) { mondePong2d.onTimePasses(secondesEcoulees); }
-
World2dFx.onTimePasses
va 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; }
-
On peut aussi redéfinir
onTimePasses
et ajouter du comportementpublic class Balle2d extends ObjetPong2d { // ... @Override public void onTimePasses(double secondsElapsed) { // comportement spécifique à la balle if(balleFrappeMurGauche()) { balleRebondiSurMurGauche(); } else if(balleFrappeMurDroit()) { balleRebondiSurMurDroit(); } // ... // comportement par défaut super.onTimePasses(secondsElapsed); }