敵のアクションでキャラクターの値(ライフ、HPなど)を変更できるようにしたい。Enemy ファイルはキャラクターの存在を認識していないため、 character->setHP(whatever) を使用できないことはわかっています...これを行う方法はありますか?
クラスで変更通知機能として機能するインターフェース (抽象クラスとして実装) を介して、クラスEnemy
とクラスを切り離すことができます。次の設計を検討してください。Character
Enemy
敵のクラス
class Enemy{
//your stuff
enemyChangeListener ch;
public:
Enemy(/*your members*/,enemyChangeListener echl){
/*your initialissation*/
ch = echl;
}
//the method where you want to call a change on the character or any other object
void enemyAttack(){
//....//
ch.fireEnemyAttacked(/*whatever args that describe the prop change in enemy object*/)
}
敵ChangeListener クラス
クラスは、次のようenemyChangeListener
に、1つ(場合によっては複数)のメソッドを持つ単なる抽象クラスです。fireEnemyAttacked
class enemyChangeListener{
public:
virtual void fireEnemyAttacked(/*args*/)=0;
}
文字クラス
これで、キャラクター クラス内で、enemyPropertyChanged 抽象クラスから継承しfireEnemyAttacked
、敵オブジェクトの変更引数が に渡されたものに応じてキャラクター オブジェクトを変更するメソッドの実装を提供できますfireEnemyAttacked
。
class Character : public enemyChangeListener{
//your methods and members;
void fireEnemyAttacked(/*args*/){
//do the changes to the character.
}
オブジェクトへの参照を提供することにより、敵オブジェクトをインスタンス化しますCharacter
(敵クラスはenemyChangeListener
コンストラクター内のオブジェクトとして認識します。この設計により、次の 2 つのことが達成されます。
Enemy
クラスは、クラスの実装の詳細 (getter メソッドや setter メソッドなど) について心配する必要がなくなりましたCharacter
。それが知っているのは、敵オブジェクトの何らかのイベントに基づいて自分自身を変更したいオブジェクトは、必要なインターフェースを実装し、変更自体を処理するということだけです。
このインターフェイスは、Character
クラスだけでなく、敵オブジェクトの変更やアクションをリッスンし、それに応じて自身の状態を変更することに関心のある他のクラスでも使用できます。
* PS: *
非静的メンバー参照は、特定のオブジェクトに関連している必要があります。
enemyAttack
が静的関数かどうかを確認しましたか?