私は少しピクルスになっています。単純な2Dのゼルダのようなゲームを作っているとしましょう。2つのオブジェクトが衝突すると、それぞれにアクションが発生するはずです。ただし、主人公が何かに衝突した場合の反応は、衝突したオブジェクトの種類にのみ依存します。それがモンスターの場合、彼は跳ね返る必要があります、それが壁の場合、何も起こらないはずです、それがリボン付きの魔法の青い箱の場合、彼は癒す必要があります、など(これらは単なる例です)。
また、両方が衝突の一部であることに注意する必要があります。つまり、衝突イベントは、どちらか一方だけでなく、キャラクターとモンスターの両方で発生する必要があります。
このようなコードをどのように記述しますか?たとえば、グローバルWorldObjectクラスに仮想関数を配置して、属性を識別する、非常に洗練されていない方法をいくつか考えることができます。たとえば、GetObjectType()関数(int、char * s、オブジェクトをモンスターとして識別するものを返します) 、Box、またはWall)の場合、Monsterなどのより多くの属性を持つクラスでは、GetSpecies()などのより多くの仮想関数が存在する可能性があります。
ただし、これは維持するのが面倒になり、衝突ハンドラーに大きなカスケードスイッチ(またはIf)ステートメントが発生します。
MainCharacter::Handler(Object& obj)
{
switch(obj.GetType())
{
case MONSTER:
switch((*(Monster*)&obj)->GetSpecies())
{
case EVILSCARYDOG:
...
...
}
...
}
}
ファイルを使用するオプションもあり、ファイルには次のようなものがあります。
Object=Monster
Species=EvilScaryDog
Subspecies=Boss
そして、コードは、仮想関数がすべてを乱雑にすることなく、属性を取得できます。ただし、これはカスケードIfの問題を解決しません。
そして、それぞれの場合に関数を持つオプションがあります。たとえば、CollideWall()、CollideMonster()、CollideHealingThingy()などです。これは個人的には私の最も嫌いなものです(ただし、それらはすべて好感が持てるとは言えませんが)、維持するのが最も面倒なようです。
誰かがこの問題のよりエレガントな解決策についていくつかの洞察を与えてもらえますか?助けてくれてありがとう!