Théorie: créer un monde 2d
#
Le monde 2d
#
- Un monde 2d est un rectangle avec une largeur et une hauteur
- Le monde 2d contient des objets 2d
- Un objet 2d occupe un rectangle dans lequel son dessin est contenu
En Ntro
#
public class MondePong2d extends World2dFx {
public static final double LARGEUR_MONDE = 640;
public static final double HAUTEUR_MONDE = 360;
@Override
protected void initialize() {
setWidth(LARGEUR_MONDE);
setHeight(HAUTEUR_MONDE);
// ...
}
public class MondePong2d extends World2dFx {
@Override
protected void initialize() {
// ...
addObject2d(new Palette2d());
addObject2d(new Balle2d());
}
Décrire les objets
#
- Chaque objet 2d a aussi une largeur (
w
) et une hauteur (h
)
- La position de l’objet 2d est indiquée par son coin haut/gauche (
topLeft
)
En Ntro
#
- Un classe abstraite pour tous les objets 2d
public abstract class ObjetPong2d extends Object2dFx<MondePong2d> {
}
public class Balle2d extends ObjetPong2d {
@Override
public void initialize() {
setTopLeftX(100);
setTopLeftY(150);
setWidth(10);
setHeight(10);
}
Afficher le monde 2d
#
- On va afficher le monde 2d en deux étapes
- (optionnel) dessiner une image de fond
- itérer chaque objet 2d et demander à cet objet de se dessiner
En Ntro
#
- Définir un canvas pour afficher le monde 2d
public class CanvasPartie extends ResizableWorld2dCanvasFx {
@Override
protected void initialize() {
setInitialWorldSize(MondePong2d.LARGEUR_MONDE, MondePong2d.HAUTEUR_MONDE);
}
public void afficherFps(String imagesParSeconde) {
drawOnCanvas(gc -> {
gc.fillText(imagesParSeconde, 0, 12);
});
}
}
- Initialiser le CanvasPartie
public class CanvasPartie extends ResizableWorld2dCanvasFx {
@Override
protected void initialize() {
setInitialWorldSize(MondePong2d.LARGEUR_MONDE,
MondePong2d.HAUTEUR_MONDE);
}
- Appeler la méthode
drawOn
(héritée de World2dFx
)
public class VuePartie extends ViewFx {
// ...
public void afficherPong2d(MondePong2d mondePong2d) {
mondePong2d.drawOn(canvasPartie);
}
- La méthode
drawOnWorld
de chaque objet2d va être appelée:
public class Balle2d extends ObjetPong2d {
// ...
@Override
public void drawOnWorld(GraphicsContext gc) {
gc.fillArc(getTopLeftX(),
getTopLeftY(),
getWidth(),
getHeight(),
0,
360,
ArcType.CHORD);
}
}
- NOTES
- le
CanvasPartie
va redimensionner le monde 2d selon le conteneur
- le ratio largeur/hauteur est préservé automatiquemen
Détecter les collisions
#
- La collision est calculée selon le rectangle qui entoure l’objet
En Ntro
#
- Collision avec un autre objet
public class Balle2d extends ObjetPong2d {
// ...
private boolean balleFrappePalette(Palette2d palette) {
return collidesWith(palette);
}
- Collision avec un rectangle
public class Balle2d extends ObjetPong2d {
// ...
private boolean balleFrappePlancher() {
return collidesWith(0, // x
getWorld2d().getHeight(), // y
getWorld2d().getWidth(), // largeur
1); // hauteur
}