• Aucun résultat trouvé

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 !

Documents relatifs