合計 昨日 今日

アバター
Dixq (管理人)
管理人
 
記事: 1554
登録日時: 2010年10月12日(火) 20:16
お住まい: 北海道札幌市
日記: 日記を見る (570)
日記
- 12月 2017
ボーナスで自社製品を買う (2)
   2017年12月10日(日) 20:17
玉藤製と自宅製 (9)
   2017年12月03日(日) 22:01

+ 11月 2017
+ 10月 2017
+ 9月 2017
+ 8月 2017
+ 7月 2017
+ 6月 2017
+ 5月 2017
+ 4月 2017
+ 3月 2017
+ 2月 2017
+ 1月 2017
+ 12月 2016
+ 11月 2016
+ 10月 2016
+ 9月 2016
+ 8月 2016
+ 7月 2016
+ 6月 2016
+ 5月 2016
+ 4月 2016
+ 3月 2016
+ 2月 2016
+ 1月 2016
+ 12月 2015
+ 11月 2015
+ 10月 2015
+ 9月 2015
+ 8月 2015
+ 7月 2015
+ 6月 2015
+ 5月 2015
+ 4月 2015
+ 3月 2015
+ 2月 2015
+ 1月 2015
+ 12月 2014
+ 11月 2014
+ 10月 2014
+ 9月 2014
+ 8月 2014
+ 7月 2014
+ 6月 2014
+ 5月 2014
+ 4月 2014
+ 3月 2014
+ 2月 2014
+ 1月 2014
+ 12月 2013
+ 11月 2013
+ 10月 2013
+ 9月 2013
+ 8月 2013
+ 7月 2013
+ 6月 2013
+ 5月 2013
+ 4月 2013
+ 3月 2013
+ 2月 2013
+ 1月 2013
+ 12月 2012
+ 11月 2012
+ 10月 2012
+ 9月 2012
+ 8月 2012
+ 7月 2012
+ 6月 2012
+ 5月 2012
+ 4月 2012
+ 3月 2012
+ 2月 2012
+ 1月 2012
+ 12月 2011
+ 11月 2011
+ 10月 2011
+ 9月 2011
+ 8月 2011
+ 7月 2011
+ 6月 2011
+ 5月 2011
+ 4月 2011
+ 3月 2011
+ 2月 2011
+ 1月 2011
+ 12月 2010
+ 11月 2010
+ 10月 2010
フォロー
カテゴリー
日常
1 記事

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

パーマリンクby Dixq (管理人) on 2016年2月23日(火) 18:54

今日はプレイヤーと敵との当たり判定の計算方法です。

.png
.png (38.04 KB) 表示数: 493 回


自機である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;
変数はこれを経由して座標や当たり判定範囲を取得できるようになります。
そこで敵クラスは
コード[C++]: 全て選択
1
2
3
4
5
void Enemy::updateHit(){
    Pos pos = mPlayerInfoGettable->GetPosition();
    float range = mPlayerInfoGettable->GetRange();
    //posとrangeで敵との当たり判定計算
}

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

コメント数: 2 閲覧数: 10153
コメント

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

パーマリンクby へにっくす on 2016年2月24日(水) 05:10

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

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

集約とコンポジションの区別はちゃんとされてるのに、惜しいです
(^^;
最後に編集したユーザー へにっくす [ 2016年2月24日(水) 05:27 ], 累計 3 回
written by へにっくす
アバター
へにっくす
 
記事: 608
登録日時: 2012年7月01日(日) 17:32
お住まい: 埼玉県
日記: 日記を見る (167)

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

パーマリンクby Dixq (管理人) on 2016年2月24日(水) 08:24

へにっくすさん

あぁ、そうでした、会社で書くときはJAVAなので
ちゃんと書いてたのにC++だと継承にしてしまいました(^_^;)
帰宅したら直します!ご指摘ありがとうございます!
アバター
Dixq (管理人)
管理人
 
記事: 1554
登録日時: 2010年10月12日(火) 20:16
お住まい: 北海道札幌市
日記: 日記を見る (570)

オンラインデータ

登録ユーザー: なし