ページ 11

当たり判定

Posted: 2012年7月06日(金) 23:53
by モクベ
自分は今シューティングを作っています


関数を
・main
・Player
・Enemy

の3つに分けています


・mainの関数には「Player」「Enemy」に書いたそれぞれの関数の呼び出し



・Playerには自機に関すること
(座標、弾、など)



・Enemyには敵に関すること
(座標、移動、など)




上を前提に質問があります


敵、自分のそれぞれの当たり判定をつけたいのですが、
敵の当たり判定をつくるには、敵の座標と、自機の弾の座標が必要で、

自機の当たり判定を作るには、敵の弾の座標と、自機の座標が必要です




しかし、それぞれ別のファイルに書き込んでいるので、同時に干渉することが出来ません。


どのようにして、当たり判定を作ればよいでしょうか?

Re: 当たり判定

Posted: 2012年7月07日(土) 06:08
by へにっくす
モクベ さんが書きました:自機の当たり判定を作るには、敵の弾の座標と、自機の座標が必要です
ふーん

敵の弾なら死ぬけど、敵に当たっても死なないのね?


突っ込んでみるw

別々のファイルに書き込んでいるんだったら、
プログラム内のメモリにそれを読み込む必要があるのは分かるよね。
まずはそれぞれの構造体を作ってみたらどうかな?

Re: 当たり判定

Posted: 2012年7月07日(土) 14:12
by Dixq (管理人)
まず、使われている言語はCですか?C++ですか?

Cであれば
ゲームプログラミング設計
http://dixq.net/g/

この辺を参考にどうぞ。
C++であれば、座標が取得できるようなインターフェイスクラスを定義し、それを継承してPlayerやEnemyを実装し、
座標を取得する必要があるクラスへインスタンスのポインタを渡してやればよいと思います。

上記の内容を実装したサンプルを書きました。
添付ファイルにクラス図を書いていますので合わせてご覧ください。
「座標が取得できるようなインターフェイスクラス」をPosGettableとして定義します。
Playerはそれを継承します。
mainはPlayerもEnemyも持っているので、mainがPlayerのインターフェイスをEnemyに渡します。
EnemyはPlayerの基底クラスのポインタを持っているので、EnemyからPlayerの座標が参照できます。

コード:

#include<stdio.h>

class PosGettable {
public:
	virtual ~PosGettable(){}
	virtual float GetX() = 0;
	virtual float GetY() = 0;
};

class Player : public PosGettable{
	float x, y;
public:
	Player(){x=10;y=20;}
	float GetX() override {
		return x;
	}
	float GetY() override {
		return y;
	}
};

class Enemy {
	PosGettable* m_pPlayerPosGetter;
public :
	Enemy(PosGettable* impl){
		m_pPlayerPosGetter = impl;
	}
	void show(){
		printf("%f,%f",
			m_pPlayerPosGetter->GetX(),
			m_pPlayerPosGetter->GetY()
		);
	}
};

int main(){
	Player player;
	Enemy enemy((PosGettable*)&player);
	enemy.show();
}
実行結果
10.00000,20.00000

Re: 当たり判定

Posted: 2012年7月07日(土) 15:19
by モクベ
へにっくす さんが書きました:敵の弾なら死ぬけど、敵に当たっても死なないのね?

ありがとうございます! まったく、気がつきませんでした。



Dixq (管理人) さんが書きました:まず、使われている言語はCですか?C++ですか?

自分はCを使ってます。
貼られているサイトを参考に1個づつ勉強していこうと思います




お二方、回答ありがとうございました