1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| struct commandeMarcherSur
{
virtual
type_resultat // est-ce vraiment utile ? je ne sais pas
do(
/*in,out*/ type_entite & marcheur,
/*in,out*/ type_case & case)
{} // implémentation vide par défaut
};
struct commandeMarcherSurPiege : commandeMarcherSur
{
virtual
type_resultat // est-ce vraiment utile ? je ne sais pas
do(
/*in,out*/ type_entite & marcheur,
/*in,out*/ type_case & case)
{
if (marcheur.test_reflexes(piege_.getSeuilEsquive())) {
piege_.declenche(marcheur, case);
}
}
commandeMarcherSurPiege(
type_piege_descripteur & piege_descripteur)
: piege_(piege_descripteur)
{}
private:
type_piege piege_; // une instance de piege se construit à
// partir d'une description de piege
};
struct type_case
{
....
void traversePar(type_entite & marcheur) {
if (entite.enTrainDemarcher())
actionMarche_->commandeMarcherSurPiege(marcheur,*this);
else ...
// on doit pouvoir faire beaucoup mieux avec le patern state
}
private:
commandeMarcherSur * actionMarche_;
// se construirait aussi depuis une description de commandeMarcherSur
};
struct type_piege
{
type_seuil getSeuilEsquive() const;
type_quantite quantiteDegats() const;
void declenche(type_entite & entite, type_case & case) {
entite.recoitDegats(categorie_degats_, quantiteDegats());
if (--nb_charges_)
case.changeActionMarche("nil");
// avec de l'héritage, on aurait été embétés à devoir
// changer le type de l'objet courant. Là, c'est juste un
// attribut qui change
// Et attention au "delete this;" => à refactorer peut-être
}
private:
// ensemble(=champs de bits)
type_categorie_degats categorie_degats_;
int nb_charges_; // init à 1 pour la majorité des pieges.
}; |
Partager