diff --git a/doc/MoteurDeJeu.md b/doc/MoteurDeJeu.md new file mode 100644 index 0000000000000000000000000000000000000000..407e23846f194561ddce6020be00c77aebc82706 --- /dev/null +++ b/doc/MoteurDeJeu.md @@ -0,0 +1,69 @@ +--- +author: PF Villard +title: Le moteur de jeu +--- +<!-- pandoc -N --variable mainfont="Palatino" --variable sansfont="Helvetica" --variable monofont="Menlo" -o MoteurDeJeu.html archiMoteurDeJeu.md --> + +# Utilisation de la bibliothèque de moteur de jeu + +Avant de lire ce document, il faut déjà comprendre l'[architecture du Moteur de jeu](./archiMoteurDeJeu.pdf). + +## Création de décors + +Il y a deux façon de créer un décors : +- Soit en utilisant un objet de la classe `ObjetMur` en le rajoutant au **monde** par `addMur(int x, int y, int dx, int dy)` avec $(x,y)$ la position du coin supérieur gauche du mur de dimension $dx \times dy$ +- Soit en créant une classe héritant de `ObjetMur` et en l'ajoutant au **monde** par `addObjet(Objet monObjet)`. + +Les éléments de décors, comme toutes les classes héritant de `Objet` ont une méthode `update()` qui permet de rajouter un comportement dynamique (Cf `ObjetMurDynamique`). + +## Changement d'image + +Pour changer l'image associée aux monstres ou aux héros, il suffit d'appeler la méthode `assignNewImage(String fileName)` de l'attribut `sprites` de l'objet. Exemple : +``` +monMonde.balle.sprites.assignNewImage("hero2.png"); +``` + +## Changement d'image pendant une collision + +Pour changer l'aspect d'un héros, monstre ou mur lorsque une collision a lieu, il faut faire une classe fille et ré-écrire la méthode `public void draw(Graphics g)`en rajoutant quelque chose du type : + +``` +// si en collision affiche carre +if (collision==1) { + g.setColor(Color.red); + g.fillRect(tab[0],tab[1],tab[2],tab[3]); +} +``` + +Pour changer l'aspect du hero, il faut aussi créer une classe héritant de `Monde` afin de d'assigner à la construction la bonne classe pour `balle`. + + +## Changement de gravité + +Pour changer la gravité, il faut changer la valeur de l'attribut `gravityValue` dans `MoteurPhysique`. Exemple : +``` +moteurPhys.gravityValue=-0.08f; +``` +Pour annuler la gravité et pouvoir se déplacer en **X** et en **Y** de la même façon, il faut mettre l'attribut `gravity` à `false`. + +## Vue subjective + +On parle de vue subjective lorsque l'on se place du point de vue du joueur. C'est-à-dire que si on se déplace, la géométrie du hero ne bouge pas, c'est le décors et les monstres qui bougent. Si la vu n'est pas subjective, le décors est fixe et ceux sont les monstres et le hero qui bougent. +La vue subjective peut être activé en changeant la valeur du booléen `Repere.isSubjective`. + +## Boucle de jeu + +La boucle de jeu est créée par défaut par la classe `BoucleDeJeu`. Pour gérer les événements du jeu, il est conseillé de créer une classe qui hérite de `BoucleDeJeu` en re-créant la méthode `public void lanceBouclePrincipale() throws Exception`. + +Exemple de code pour gérer les collisions en fonction du type + +``` +switch (jeuPhysique.moteurPhys.monde.balle.collision) +{ + case MONSTRE: System.out.println("Aie avec monstre numéro "+jeuPhysique.moteurPhys.current_monster_index);break; + case HERO: System.out.println("Copain !");break; + case DECORS: System.out.println("Pas mal avec mur numéro "+jeuPhysique.moteurPhys.current_wall_index);break; + default: break; +} +``` + diff --git a/doc/UML.png b/doc/UML.png new file mode 100644 index 0000000000000000000000000000000000000000..3a7d302b8b92aaa510f8e258ad02e4baaa651941 Binary files /dev/null and b/doc/UML.png differ diff --git a/doc/archiMoteurDeJeu.md b/doc/archiMoteurDeJeu.md new file mode 100644 index 0000000000000000000000000000000000000000..152bf956084b8d725dfbc3d62eb4d9c18b34e36d --- /dev/null +++ b/doc/archiMoteurDeJeu.md @@ -0,0 +1,56 @@ +--- +author: PF Villard +title: Architecture du moteur de jeu +--- +<!-- pandoc -N --variable mainfont="Palatino" --variable sansfont="Helvetica" --variable monofont="Menlo" --variable fontsize=12pt --variable version=2.0 --pdf-engine=xelatex -o archiMoteurDeJeu.pdf archiMoteurDeJeu.md --> + + + +Pour utiliser la bibliothèque de moteur de jeu, il faut adopter une architecture du type [Modèle-Vue-Contrôleur](https://fr.wikipedia.org/wiki/Modèle-vue-contrôleur). Il faut donc commencer par définir ces trois entités. + +# Le Modèle + +Il faut d'abord construire un **Monde** : +``` +// Construction du monde +monMonde= new Monde(); +``` +Pour peupler ce monde, on a le choix entre des éléments de décors (`addMur()`), des monstres (`addMonstre()`) ou des personnages jouables (`addHero()`). Tous ces éléments sont paramétrisables (position, image, comportement, etc.) + +Il faut alors rajouter un **moteur physique** pour gérer les règles du monde telles que les collisions, la gravité ou la façon de gérer la vitesse des éléments : +``` +moteurPhys=new MoteurPhysique(); +//On ajoute le monde au moteur +moteurPhys.monde=monMonde; +``` +Là aussi, on peut changer les valeurs par défaut. + +# La Vue + +La vue correspond à l'affichage. C'est cette partie qui va gérer la fenêtre graphique : +``` +affiche=new Afficheur(moteurPhys.monde); +``` + +# Le Contrôleur +Le contrôleur correspond dans notre cas à la gestion du clavier : +``` +ControleurClavier cClavier=new ControleurClavier(true); +``` + +# La méthode principale + +La méthode principale comprend la boucle de jeu : +``` +BouclePrincipale maBoucle= new BouclePrincipale(); +// Ajout du Contrôleur à le fenêtre +maBoucle.cClavier=cClavier; +// Ajout de la Vue au jeu +maBoucle.jeuPhysique.affiche=affiche; +// Ajout du Modèle à la boucle +maBoucle.jeuPhysique.moteurPhys=moteurPhys; +``` +Une fois que tous ces éléments ont été définis, le jeu pourra se lancer par : +``` +maBoucle.lanceBouclePrincipale(); +```