当たり判定の計算方法 [四聖龍神録2公式Twitter]

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

当たり判定の計算方法 [四聖龍神録2公式Twitter]

投稿記事 by Dixq (管理人) » 9年前

今日はプレイヤーと敵との当たり判定の計算方法です。
無題2.png
無題2.png (38.04 KiB) 閲覧数: 523 回
自機であるPlayerクラスも敵であるEnemyクラスもインスタンスはGameManagerが持っています。
(Enemyは間にEnemyManagerが入ります)

EnemyからPlayerは遠いので、どうやってPlayerの情報を取ってくるか?が設計のポイントです。
まずPlayerに位置情報や当たり判定範囲などの情報を取得できる関数を実装するための
インターフェイスクラス「PlayerInfoGettable」を定義します。
これをPlayerに実装させます。

多重継承はタブーなので、言語仕様的にできないようにしてある言語も多々あります。
しかしJavaのimplementsがC++に無いように、C++にはインターフェイスクラスの実装方法は継承しかありません。
ですので、PlayerはCharactorクラスを継承していますが、インターフェイスクラスを多重継承する分には
全く問題ありません。
多重継承が悪いのはインターフェイスクラス以外のクラスを多重継承する場合です。

さて、PlayerインスタンスはGameManagerが持っているのでEnemyManagerに渡してやることができます。
mPlayer = new Player();
new EnemyManager((PlayerInfoGettable*)mPlayer);
こんな感じで渡せます。

EnemyManagerはEnemyを作るときにこのインターフェイスポインタを渡してやります。
そうしてEnemyクラスが持った
mPlayerInfoGettable;
変数はこれを経由して座標や当たり判定範囲を取得できるようになります。
そこで敵クラスは

CODE:

void Enemy::updateHit(){
    Pos pos = mPlayerInfoGettable->GetPosition();
    float range = mPlayerInfoGettable->GetRange();
    //posとrangeで敵との当たり判定計算
}
こんな感じで計算することで、離れたクラス間で当たり判定の計算が可能になります。
Playerのインスタンス自身を丸ごと渡してやる方法もありますが、
必要以上の権限を多数のクラスに渡すのは危険です。
インターフェイスクラスを実装して必要最小限の権限だけを渡し、
関数の返り値はこのように値のコピーになるようにすることで安全な設計が可能になります。
(オブジェクトがある程度のサイズになるような返り値はオブジェクトコピーに時間がかかるのでconstポインタかconst参照にします)
最後に編集したユーザー Dixq (管理人) on 2016年2月24日(水) 17:57 [ 編集 4 回目 ]

アバター
へにっくす
記事: 634
登録日時: 13年前

Re: 当たり判定の計算方法 [四聖龍神録2公式Twitter]

投稿記事 by へにっくす » 9年前

とりあえず細かいところツッコミ
インターフェースと結ぶ矢印のスタイルが違います(以下の実現を参照)。
http://www.itsenka.com/contents/develop ... class.html

C++では継承しかないですが
UMLで表すならちゃんと書いてほしいです。

集約とコンポジションの区別はちゃんとされてるのに、惜しいです
(^^;
最後に編集したユーザー へにっくす on 2016年2月24日(水) 05:27 [ 編集 3 回目 ]

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 当たり判定の計算方法 [四聖龍神録2公式Twitter]

投稿記事 by Dixq (管理人) » 9年前

へにっくすさん

あぁ、そうでした、会社で書くときはJAVAなので
ちゃんと書いてたのにC++だと継承にしてしまいました(^_^;)
帰宅したら直します!ご指摘ありがとうございます!