Commençons par créer notre première classe : j'ai choisi de l'appeler Personnage. En effet, ce sera la classe des objets représentant nos deux personnages (vous et le Méchant).
Dans un nouveau fichier appelé Personnage.as, écrivons la structure de base de notre classe : le package, la classe et le constructeur :
Code : Actionscript
package {
public class Personnage {
// Constructeur
public function Personnage()
{ } } }
Les attributs
Ensuite, ajoutons les attributs de la classe ; mais pour cela, réfléchissons les données utiles pour notre combat. Comme dans tous les jeux avec des combats (ou presque), donnons un niveau de santé à nos personnages, que nous initialiserons à 100. Et pour les armer, indiquons la puissance de l'attaque qu'ils vont porter à leur adversaire, ainsi que les chances de coup critique :
// Santé du personnage private var _sante:int; // Dégâts de base
private var _degats:int;
// Chances de faire une critique (sur 100) private var _chanceCritique:int;
Les accesseurs
N'oublions pas d'accompagner les attributs de leurs accesseurs :
Code : Actionscript
public function get sante():int
{
return _sante; }
public function set sante(value:int):void {
_sante = value;
}
public function get degats():int
{
return _degats; }
public function set degats(value:int):void {
_degats = value;
}
public function get chanceCritique():int
{
return _chanceCritique; }
public function set chanceCritique(value:int):void {
_chanceCritique = value;
}
Le contructeur
Ensuite, initialisons nos attributs au sein du constructeur :
Code : Actionscript
// Constructeur
public function Personnage() { sante = 100; degats = 0; chanceCritique = 0; }
La méthode
Code : Actionscript
public function attaquer(cible:Personnage):void {
var degatsAppliques:int = degats;
// On jette un dé à 100 faces : si le résultat est inférieur ou égal à la chance de coup critique, l'attaque fait un coup critique !
if (Math.random() * 100 <= chanceCritique)
{ trace("Critique !"); // On double les dégâts ! degatsAppliques *= 2; } // On applique les dégâts cible.sante -= degatsAppliques; if (cible.sante <= 0) {
trace("La cible est décédée."); }
else {
trace("Il reste " + cible.sante + " PV à la cible."); }
}
Comme vous pouvez le constater, nous passons en paramètre un objet de la classe Personnage, afin de rendre le code logique et surtout très lisible. Ainsi, pour qu'un personnage attaque un second, il faudra procéder ainsi :
Code : Actionscript
personnageA.attaquer(personnageB); // Le personnageA attaque le
personnageB ! S'en est fini de lui !
La classe complète
Si tout se passe bien, vous devriez normalement avoir une classe Personnage qui correspond à la description ci-dessous :
La classe Personnage
Voici le code complet de notre classe Personnage, pour vérifier le vôtre :
Code : Actionscript
{
public class Personnage {
// Santé du personnage
private var _sante:int;
// Dégâts de base
private var _degats:int;
// Chances de faire une critique (sur 100)
private var _chanceCritique:int;
public function Personnage()
{ sante = 100; degats = 0; chanceCritique = 0; }
public function get sante():int
{
return _sante;
}
public function set sante(value:int):void
{
_sante = value;
}
public function get degats():int
{
return _degats;
}
public function set degats(value:int):void
{
_degats = value;
}
public function get chanceCritique():int
{
return _chanceCritique;
}
public function set chanceCritique(value:int):void
{
_chanceCritique = value;
}
public function attaquer(cible:Personnage):void
{
var degatsAppliques:int = degats;
// On jette un dé à 100 faces : si le résultat est
inférieur ou égal à la chance de coup critique, l'attaque fait un coup critique !
if (Math.random() * 100 <= chanceCritique)
{ trace("Critique !"); // On double les dégâts ! degatsAppliques *= 2; } // On applique les dégâts cible.sante -= degatsAppliques; if (cible.sante <= 0) {
trace("La cible est décédée."); }
else
{
trace("Il reste " + cible.sante + " PV à la
cible."); } } } }
Le programme principal
Votre classe Main vide (contenue dans le fichier Main.as) devrait ressembler à cela :
Code : Actionscript
package {
import flash.display.Sprite; import flash.events.Event;
public class Main extends Sprite {
public function Main():void {
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
} } }
Rappel : il faut commencer à programmer après le commentaire // entry point («point d'entrée») à la ligne 17.
Commençons par déclarer la variable qui pointera vers le premier objet de classe Personnage (celui qui vous représente) :
Code : Actionscript
var moi:Personnage = new Personnage();
Ensuite, donnons-lui son épée légendaire (elle fait 80 dégâts de base et a 80 chances sur 100 de faire un coup critique) :
Code : Actionscript
moi.degats = 80;
moi.chanceCritique = 80;
Le code pour créer le Méchant est très similaire :
var mechant:Personnage = new Personnage();
mechant.degats = 40;
mechant.chanceCritique = 10;
Enfin, simulons le combat épique qui a lieu entre nos deux personnages ! Si vous vous souvenez de ma remarque sur la méthode attaquer() un peu plus haut, vous savez comment procéder :
Code : Actionscript
trace("Le méchant m'attaque ! "); mechant.attaquer(moi);
trace("Il va connaître ma fureur ! A l'attaque !"); moi.attaquer(mechant);
Voici le code complet de notre classe Main :
Code : Actionscript
package {
import flash.display.Sprite; import flash.events.Event;
public class Main extends Sprite
{
public function Main():void {
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
// Création du personnage vous représentant
var moi:Personnage = new Personnage();
moi.degats = 80;
moi.chanceCritique = 80;
// Création du personnage Méchant
var mechant:Personnage = new Personnage();
mechant.degats = 40;
mechant.chanceCritique = 10;
// Simulation du combat
trace("Le méchant m'attaque ! "); mechant.attaquer(moi);
trace("Il va connaître ma fureur ! A l'attaque !"); moi.attaquer(mechant);
} } }
Résultat
Code : Console
Le méchant m'attaque ! Critique !
Il reste 20 PV à la cible.
Il va connaître ma fureur ! A l'attaque ! Critique !
La cible est décédée.
Gagné !
Attendez malheureux ! Ne criez pas victoire trop vite ! En effet, notre classe pourrait être améliorée...
Vous ne voyez pas en quoi ? Et bien, pensez au chapitre précédent : «Un objet dans un objet (dans un objet...)». Maintenant, réfléchissez à cette problématique : comment pourrait-on mieux séparer les données et les propriétés de ma classe
Personnage ? En créant de nouvelles classes, pardi !
Une nouvelle classe
En effet, il serait judicieux de représenter les armes que portent nos personnages par des objets à part entière : cela semble logique, et cela respecte les principes de la POO. En outre, cela nous faciliterait énormément la tâche si nous devions gérer un inventaire par exemple : nous pourrions mettre autant d'objets que l'on veut, et équiper nos personnages avec, tout ceci de façon très souple et naturelle !