ΠΠ΄ΠΈΠΎΠΌΠ° NVI Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ»ΠΈ Π·Π°ΠΊΡΡΡΡΠΌΠΈ. Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ, ΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅, Π±ΡΠ΄Π΅ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° (ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΠ· ΠΏΡΠ°Π²ΠΈΠ»Π° 27). Π§ΡΠΎΠ±Ρ ΡΠ°ΠΊΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ Π±ΡΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ, Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠΉ, Π° Π½Π΅ Π·Π°ΠΊΡΡΡΠΎΠΉ. ΠΠ½ΠΎΠ³Π΄Π° ΠΎΠ½Π° Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΡΡΡΠΎΠΉ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΡ Π² ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ β ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 7), Π½ΠΎ ΠΊ ΡΡΠΎΠΌΡ ΡΠ»ΡΡΠ°Ρ ΠΈΠ΄ΠΈΠΎΠΌΠ° NVI ΡΠΆΠ΅ Π½Π΅ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ°.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Β«Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡΒ» ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠ΄ΠΈΠΎΠΌΠ° NVI β ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΠΎΡΠΊΡΡΡΡΠΌ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ, Π½ΠΎ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ½Π° Π΄Π°Π΅Ρ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΠΌΡ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ°. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΠ»ΡΠ½ΡΠΌ Π±ΡΠ»ΠΎ Π±Ρ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΈΠΏΠ° ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ°, ΡΡΠΎ ΡΠ°ΠΊΠΈΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΠΌ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΠΎΠ³ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π»ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π»Π°ΡΡ Π±Ρ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ:
class GameCharacter; // ΠΎΠΏΠ΅ΡΠ΅ΠΆΠ°ΡΡΠ΅Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅
// ΡΡΠ½ΠΊΡΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ°
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter {
public:
typedef int (*HealthCalcFunc)(const GameCharacter&);
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
: healthFunc(hcf)
{}
int healthValue() const
{ return healthFunc(*this);}
...
private:
HealthCalcFunc healthFunc;
};
ΠΡΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ β Β«Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡΒ» (Strategy). ΠΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°ΠΌΠΈ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π½Π° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ Π² ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ GameCharacter, ΠΎΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΠ±ΠΎΠΏΡΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΏΠΎΠ²ΡΡΠ°ΡΡΠΈΠ΅ Π³ΠΈΠ±ΠΊΠΎΡΡΡ:
β’ Π Π°Π·Π½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ΅ΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΠΏΠ° ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
class EvilBadGay: public GameCharacter {
public:
explicit EvilBadGay(HealthCalcFunc hcf = defaultHealthCalc)
: GameCharacter(hcf)
{...}
...
};
int loseHealthQuickly(const GameCharacter&); // ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ
int loseHealthSlowly(const GameCharacter&); // ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ
// Ρ ΡΠ°Π·Π½ΡΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ
EvilBadGay ebg1(loseHealthQuickly); // ΠΎΠ΄Π½ΠΎΡΠΈΠΏΠ½ΡΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠΈ
EvilBadGay ebg2(loseHealthSlowly); // Ρ ΡΠ°Π·Π½ΡΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ
// ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π΄ΠΎΡΠΎΠ²ΡΡ
β’ Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ»Π°ΡΡ GameCharacter ΠΌΠΎΠ³ Π±Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½ setHealthCalculator, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅ΠΊΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ.
Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ-ΡΠ»Π΅Π½ΠΎΠΌ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ GameCharacter, ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΌΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΡΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΡ ΡΠΈΠ»Ρ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, defaultHealthCalc Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π·Π°ΠΊΡΡΡΡΠΌ ΡΠ°ΡΡΡΠΌ EvilBadGay. ΠΡΠΎ Π½Π΅ ΡΡΡΠ°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½Π°Ρ ΡΠΈΠ»Π° ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΅Π³ΠΎ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, Π½ΠΎ Π΄Π»Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΎΡΠ½ΡΡ ΡΠ°ΡΡΠ΅ΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π·Π°ΠΊΡΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ°ΠΊΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ Π²ΡΠ΅Π³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π²ΡΠ½ΠΎΡΠΈΡΡΡ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ° Π½Π°ΡΡΠΆΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΉ-ΡΠ»Π΅Π½ΠΎΠ² Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ Π΄ΡΡΠ·ΡΡΠΌΠΈ ΠΊΠ»Π°ΡΡΠ°, ΠΈΠ»ΠΈ Π² ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, Π½Π΅ Π΄ΡΡΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΎΠΌΡ). ΠΠ½Π° Π±ΡΠ΄Π΅Ρ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π² Π½Π°ΡΡΠΎΡΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π΅ ΠΈ Π΄Π°Π»Π΅Π΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΡΠ΅ ΠΏΡΠΎΡΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΠΌ Π΅ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠΎΠΈΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΠΎΠΆΠ΅ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΡ Π²Π½Π΅ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ GameCharacter.
ΠΠ±ΡΠ΅Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ°ΠΊΠΎΠ²ΠΎ: Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°ΡΠ΅ΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡΠΌ, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠΌΡΡ ΡΠ»Π΅Π½Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠ°, Π΄ΠΎΡΡΡΠΏ ΠΊ Π΅Π³ΠΎ Π·Π°ΠΊΡΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ β ΠΎΡΠ»Π°Π±ΠΈΡΡ ΡΡΠ΅ΠΏΠ΅Π½Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ»Π°ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ-Π½Π΅ΡΠ»Π΅Π½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄ΡΡΠ·Π΅ΠΉ Π»ΠΈΠ±ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΠΊΡΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ΅ΠΌ ΡΠ°ΡΡΡΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΡΡΠ΅ Π±ΡΠ»ΠΎ Π±Ρ ΠΎΡΡΠ°Π²ΠΈΡΡ Π·Π°ΠΊΡΡΡΡΠΌΠΈ. ΠΠΌΠ΅Π΅Ρ Π»ΠΈ ΡΠΌΡΡΠ» ΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΠ΅ΠΉ ΡΠ°Π΄ΠΈ Π²ΡΠ³ΠΎΠ΄Ρ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ΅Π½ΡΡΡ ΠΈΡ ), ΡΠ΅ΡΠ°ΡΡ Π²Π°ΠΌ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Β«Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡΒ» ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° tr::function
ΠΡΠ»ΠΈ Π²Ρ ΠΏΡΠΈΠ²ΡΠΊΠ»ΠΈ ΠΊ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌ ΠΈ ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π½Π΅ΡΠ²Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² (ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 41), ΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π²Π°ΠΌ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π³ΠΈΠ±ΠΊΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠΎΡΠ΅ΠΌΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π° Π½Π΅ ΡΡΠΎ-ΡΠΎ Π²Π΅Π΄ΡΡΠ΅Π΅ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ)? ΠΡΠ»ΠΈ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΠΈΠΊΡΠ΄Π° Π½Π΅ Π΄Π΅ΡΡΡΡ, ΡΠΎ ΠΏΠΎΡΠ΅ΠΌΡ Π½Π΅ ΡΠ΄Π΅Π»Π°ΡΡ Π΅Π΅ ΡΠ»Π΅Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ°? Π ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ int, Π° Π½Π΅ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π² int?
ΠΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈΡΡΠ΅Π·Π°ΡΡ, Π΅ΡΠ»ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ (ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ healthFunc) Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΡΠΈΠΏΠ° tr::function. ΠΠ°ΠΊ ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ Π² ΠΏΡΠ°Π²ΠΈΠ»Π΅ 54, ΡΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π»ΡΠ±ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΡΡΡΠ½ΠΎΡΡΡ (ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π»ΠΈΠ±ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½), ΡΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΉ. ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°, Π½Π° ΡΡΠΎΡ ΡΠ°Π· Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ tr1::function:
class GameCharacter; // ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅
int defaultHealthCalc(const GameCharacter& gc); // ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅
class GameCharacter {
public:
// HealthCalcFunction β ΡΡΠΎ Π»ΡΠ±Π°Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ ΡΡΡΠ½ΠΎΡΡΡ, ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ
// ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π½Π΅ΡΡΠΎ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠ΅ Ρ GameCharacter,
// ΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ΡΡΠΎ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠ΅ Ρ int; ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΡΠΌ. Π½ΠΈΠΆΠ΅
typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
: healthFunc(hcf)
{}
int healthValue() const
{ return healthFunc(*this);}
...
private:
HealthCalcFunc healthFunc;
};
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, HealthCalcFunc β ΡΡΠΎ typedef, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π° tr1::function. Π Π·Π½Π°ΡΠΈΡ, ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½Π΅Π΅, ΠΊΠ°ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΠΈΠΏ HealthCalcFunc:
std::tr1::function<int (const GameCharacter&)>
ΠΠ΄Π΅ΡΡ Ρ Π²ΡΠ΄Π΅Π»ΠΈΠ» Β«ΡΠ΅Π»Π΅Π²ΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡΒ» Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ tr1::function. Π‘Π»ΠΎΠ²Π°ΠΌΠΈ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊ: Β«ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ°Ρ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° const GameCharacter ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ intΒ». ΠΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° HealthCalcFunc ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π»ΡΠ±ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΡΡΡΠ½ΠΎΡΡΡ, ΡΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ. ΠΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ΡΠ²Π½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π² const GameCharacter&, Π° ΡΠΈΠΏ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ΡΠ²Π½ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ Π² int.
ΠΡΠ»ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½Π° (Π³Π΄Π΅ GameCharacter Π²ΠΊΠ»ΡΡΠ°Π» Π² ΡΠ΅Π±Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ), ΡΠΎ Π²Ρ Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΠ΅ ΠΏΠΎΡΡΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΎΡΠ»ΠΈΡΠΈΠΉ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ°Π·Π½ΠΈΡΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ GameCharacter ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° tr1::function β ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΊ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎ Ρ Π½Π°Π·Π²Π°Π» Π±Ρ Π΅Π³ΠΎ Π½Π΅ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π΅ ΡΠΎ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²ΠΎ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠ΅Π»ΠΎΠΌΠ»ΡΡΡΡΡ Π³ΠΈΠ±ΠΊΠΎΡΡΡ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ, Π²ΡΡΠΈΡΠ»ΡΡΡΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΡ ΡΠΈΠ»Ρ:
short calcHealth(const gameCharacter&); // ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ
// ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ;
// ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ int
stuct HealthCalculator { // ΠΊΠ»Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ
int operator()(const GameCharacter&) const // ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π²ΡΡΠΈΡΠ»ΡΡΡΠΈΡ
{...} // ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΡ ΡΠΈΠ»Ρ
};
class GameLevel {
public:
float health(const GameCharacter&) const; // ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½ Π΄Π»Ρ
... // Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ
}; // ΡΠΈΠ»Ρ; Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ int
class EvilBadGay: public GameCharacter { // ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅
...
};
class EyeCandyCharacter: public GameCharacter { // Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΏ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ΅ΠΉ;
... // ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅
}; // ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠ°ΠΊ
// Ρ EvilBadGay
EvilBadGay ebg1(calcHealh); // ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ
// ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ
// ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ
EyeCandyCharacter ecc1(HealthCalculator()); // ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ
// ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
// Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ
// ΡΠΈΠ»Ρ
GameLevel currentLevel;
...
EvilBadGay ebg2( // ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ
std::tr1::bind(&GameLevel::health, // ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½ Π΄Π»Ρ
currentLevel, // Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ
_1) // ΡΠΈΠ»Ρ; ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ
); // ΡΠΌ. Π½ΠΈΠΆΠ΅
ΠΠΈΡΠ½ΠΎ Ρ ΠΏΠΎΡΠ°ΠΆΠ°ΡΡΡ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²Π΅ΡΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π΅Π»Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ tr1::function. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΡΠ΅ ΠΌΠΎΠΈΡ ΡΡΠ²ΡΡΠ², ΡΠΎ Π½Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΎ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΠ΅, Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ tr1::bind Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ebg2. ΠΠΎΠ·Π²ΠΎΠ»ΡΡΠ΅ ΠΌΠ½Π΅ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ.
ΠΡ Ρ ΠΎΡΠΈΠΌ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° ebg2 ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½ ΠΊΠ»Π°ΡΡΠ° GameLevel. ΠΠΎ ΠΈΠ· ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ GameLevel::health ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ (ΡΡΡΠ»ΠΊΡ Π½Π° GameCharacter), Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΎΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΠΌΠ΅Π΅ΡΡΡ Π΅ΡΠ΅ Π½Π΅ΡΠ²Π½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° GameLevel β ΡΠΎΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ Π²Π½ΡΡΡΠΈ Π½Π΅Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ this. ΠΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ: ΡΡΡΠ»ΠΊΡ Π½Π° ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° GameCharacter, ΡΡΡ ΠΆΠΈΠ·Π½Π΅Π½Π½Π°Ρ ΡΠΈΠ»Π° Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ. ΠΡΠ»ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ GameLevel::health, ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Β«Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡΒ» Π΅Π΅, ΡΡΠΎΠ±Ρ Π²ΠΌΠ΅ΡΡΠΎ Π΄Π²ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² (GameCharacter ΠΈ GameLevel) ΠΎΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π»Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ (GameCharacter). Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π·Π΄ΠΎΡΠΎΠ²ΡΡ ebg2 Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΈΠΏΠ° GameLevel Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ currentLevel, ΠΏΠΎΡΡΠΎΠΌΡ Β«ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌΒ» Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ GameLevel::health. ΠΠΌΠ΅Π½Π½ΠΎ Π² ΡΡΠΎΠΌ ΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠΌΡΡΠ» Π²ΡΠ·ΠΎΠ²Π° tr1::bind: ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ»Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° ebg2 Π΄ΠΎΠ»ΠΆΠ½Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° GameLevel ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ currentLevel.