忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

衝突判定に使えるダブルディスパッチ

お疲れ様です、 ナトル です。
今回は「ダブルディスパッチ」という、
衝突判定などに役立つプログラムの仕組みについて紹介したいと思います、2年生向けです。

拍手[3回]


ゲーム中に複数のキャラクターを登場させる場合、様々なキャラクターを共通の基底クラスから派生させて、それらを基底クラスのポインタ配列やリストで管理すると、
毎フレーム実行する処理を記述した関数や、描画する関数の呼び出しが簡単になったりする!
というのはもうご存じの方もいらっしゃるのではないでしょうか。

これについては5月に行ったオブジェクト指向セミナーでも2年生の方々に紹介させて頂きました。(もう3ヶ月も経っているのか……)

ところが、そのままではゲーム中に登場する様々なキャラクターはお互いを継承元の基底クラスでしか認識できません。

この問題を解決する方法の一つとしてダブルディスパッチがあります!

<以下例文>

// キャラクター基底クラス
class Character 
{
public:
    virtual void Dispatch(Character& _character) = 0;
    virtual void Collide(Player& _player) = 0;
    virtual void Collide(Enemy& _enemy) = 0;
    virtual void Collide(BossEnemy& _bossEnemy) = 0;
};
// キャラクター基底クラスを継承したプレイヤークラス
class Player : public Character 
{
public:
    virtual void Dispatch(Character& _character);
    virtual void Collide(Player& _player);
    virtual void Collide(Enemy& _enemy);
    virtual void Collide(BossEnemy& _bossEnemy);
};
class Enemy : public Character { /* 省略 */ };
class BossEnemy : public Character { /* 省略 */ };
// ディスパッチ関数
void Player::Dispatch(Character& _character)
{
    _character.Collide(*this);
}

※Collide関数にはそれぞれの引数のキャラクターに対する衝突判定の処理を書きます。
※エネミークラス、ボスクラスにもプレイヤークラスと同様の関数が必要になります。

・使い方の説明として。

まず、Character*型にアップキャストされたPlayerクラスc1と、何だか分からないキャラクターc2があるとします。

それに対してc1->Dispatch(*c2)を呼ぶと、Player::Dispatch(Character&)が呼ばれます。
その関数内で引数として受け取ったc2のCollideを呼ぶと、Player::Dispatch()の中では*thisの型はPlayerなので、もしc2がEnemyクラスだった場合、Enemy::Collide(Player&)が呼ばれ、c2がBossEnemyクラスだった場合、BossEnemy::Collide(Player&)が呼ばれます。


これでc2は衝突判定の相手のc1がPlayer型であるという事が判明しました。


このようにオーバーロードされたCollide()によって、型情報を使わずに派生クラスを特定する事ができます。


ダブルディスパッチの欠点として、新しい派生クラスを作るたびに、そのクラス用のCollide()を基底クラスと派生クラスに追加する必要があるという点があるので注意しておいて下さい。


衝突判定で悩んでいる方は是非参考にしてみてください!!
では!
PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]