6

これは、私が最近抱えているいくつかのニーズをどのように実装するかについての質問です。これにはパターンまたは一般的な解決策があると確信しており、私はそれを持ってきましたが、もっと学びたいと思っています.

ゲーム自体に関連するすべてのエンティティがクラス「アクター」(「障害物」、「動く障害物」、「発射物」、「大砲」など) から派生するゲームで作業しているとします。ゲームでは、これらのエンティティはすべてstd::vector<Actor *>ベクトルに格納されるため、トラバースできます。

ここで、各「Actor」が各ターンで何かを「実行」できると仮定し、メソッド「act」を与えてみましょう。Obstacle::act はほとんど何もしません。Moving_obstacle::act と Projectile::act はそれらを動かし、"Cannon::act" は新しい発射物を作成します。純粋な仮想関数 Actor::act を用意するのは理にかなっているので、次のようなことができます。

std::vector<Actor *>::iterator b=myvectorofactors.begin(), e=myvectorofactors.end();
while(b < e)
{
    *b->act();
     b++;
}

そして、それらすべてを「演技」させます。まあ、これまでのところとても良いです...問題は、Cannon::act が異なるプロトタイプまたは戻り値を持つ可能性があることです (たとえば、生成された発射体を格納し、それをベクトルにプッシュするために)、この 1 つの「小さな」違いすべてを壊します。

さて、ある観点から、これらのメソッドのオーバーロードはそれぞれ完全に異なる関数であることを知っています。また、事前に計画を立て、十分な洞察力を持って問題を解決できることも知っています... または、問題を回避することもできます。

このケースでは、派生した Actor クラスごとに異なる一意の識別子を使用し、それらを使用して対応するクラスにキャストし、それらを回避しました。私は再び同じ問題に遭遇すると確信しており、いくつかのエントリーレベルの解決策について知りたいと思っています.

お時間をいただきありがとうございます。

4

2 に答える 2

3

スタートは順調です。ここで脱線します。

問題は、Cannon::act が別のプロトタイプまたは戻り値を持つ可能性があることです (たとえば、生成された発射体を格納し、それをベクトルにプッシュさせるために)

なぜでしょうか?行為は行為です。インスタンスは、他に何もせずにそれを理解する必要があります。行動する前に、ctor またはその他の呼び出しでそれをトレーニングする必要があります。または、Act コール中に見回す必要があります。

考慮してください:魔法のようにさまざまなパラメーターのペイロードを準備できたとしても、引用されたときにそれはどのように理解されるでしょうか? 呼び出しは抽象的です。dynamic_cast で感染させたとしても、どの大砲がどのパラメーターを取得するかという問題は残りますか?

いいえ、サブジェクトは互いに協力するか、何らかのメッセージング システムを使用する必要があります (ディスパッチャを参照)...

于 2013-06-12T15:37:40.750 に答える
1

各行為の本体が異なる内部変数であり、内部のプライベート所有/または継承変数を使用できるため、行為を呼び出す前にこれらの変数を設定できれば、安全のためにパラメーターを介して何も送信する必要はありません、または合併症を起こさないために

于 2013-06-12T15:32:07.823 に答える