2017-07-27 9 views
0

にキャストしようとしています。私は現在、複数の異なるイベントカテゴリを扱う複数の異なるイベントキュー(ベクトル形式)を持つRoguelikeに取り組んでいます。むしろ、異なるゲームオブジェクトは、独自のプライベートイベントキューを持っています。複数のベクトルをvoid *

マップタイルデータ内に、プレーヤー(または他のもの)がタイルに入ったときにアクティブになる特殊なトリガー構造があります。このタイル構造は、イベントフラグを生成するためのデータを提供し、適切なイベントキューに配置する必要があります。

次のようにタイル構造がある:トリガー構造自体が適切なものであるキューを決定するための情報を保持することができます

struct tile{ 
    int t_type; 
    trigger t_dgram; 

    vector<actor*> occupied; 
    vector<item*> loot; 
public: 
    void trigger_tile(int ns, int we,); 
}; 

、内の各タイルのために可能なすべてのイベント・キューへのポインタを保持するために実行不可能です特に地図を無限の地図のためにオンザフライでダイナミックに生成するようになっているためです。

そこで質問は2つあり:関数を呼び出す際にボイドポインタにベクトルをキャストするために良いでしょう:

void tile :: trigger_tile(int ns, int we, void *queue_ob); 

tileオブジェクト自体は正しいキューベクトルの種類を決定することができるであろうtrigger t_dgramメンバ変数を使用してvoidポインタを逆参照しますが、これは良い考えですか?私が気づいていないことにこれに危険がいくつかありますか?

あなたは私が同様の効果を達成することを個人的に提案しますか?

ありがとうございます。

+1

単一のイベントキューを持つことはできません。実際のイベントは異なるタイプである可能性があります。 'struct Event {};構造体ActorEvent:publicイベント{}; ... '。そして、すべてを単一の 'std :: queue events'に格納します。しかしこれは、あなたがそれらをどのように使用する予定であるかについては、直交しているかもしれません。 – pingul

+0

@pingul私はそれを実際に考えていました。そのルートに向かない主な理由は、多くのイベントがエンティティに他のオブジェクトを照会し、追加の処理の結果を待たなければならないことでした。単一のキューを持つことは、あまりにも多くのパフォーマンスヒットを引き起こします。悲しいことです。また、異なるフラグのサービスは、異なるアクセス許可を持つ異なるオブジェクトによって処理されることが多く、柔軟性の問題を引き起こす単一のハンドラクラスを持つことがあります。 : 'D – Druid

答えて

0

そこで質問が二つある:関数を呼び出す際にボイドポインタにベクトルをキャストするために良いでしょう:

いいえ、それは右の音ではありません。おそらく、ベクトルのポインタにvoid*をキャストすることを意味していました。これは、ベクトルの要素にアクセスする前に、void*キャストを使用するダウンストリーム関数がベクトルポインタに戻っている限り問題ありません。

1

"トリガー"は私のクラスのように聞こえる。

struct Trigger { 
    virtual void triggeredOn(tile *tile) = 0; 
} 

その後tileは、そのトリガーへのポインタを持っています

struct tile{ 
    ... 
    ... 
    Trigger *trigger; 
    void trigger_tile(int ns, int we,){trigger.triggeredOn(this)}; 
}; 

Triggerから派生したクラスは、すべてのキューへのポインタを保持したり、キューを必要としない何かを行うことができます。

関連する問題