ページ 11

DxLibを利用したゲーム作成のクラスについて

Posted: 2013年10月20日(日) 08:03
by ねに
質問させてください。
初心者ですが、DxLibを利用してC++でSTG製作しています。

Init()した後にMove()とDraw()等をループさせています。
(簡略化はしています)

コード:

GameMain::Init(){
	PLAYER =new Player
	ENEMY  =new Enemy
}

GameMain::Move(){
	Player->PLmove();//操作キャラの移動、プレイヤのショット
	Enemy->ENmove(Player->GetX(),Player->GetY());//敵キャラの移動、敵ショット
	//↑で操作キャラの場所に寄っていく敵、ホーミングする弾を作りたいので、操作キャラのX,Y座標を引数にしている。
	Collision(???);//ここで操作キャラ、敵キャラ、プレイヤショット、敵ショットの当たり判定を行いたい
}
GameMain::Draw(){
	Player->PLDraw();
	Enemy->ENDraw();


ざっくり上記のようなことをやっていますが、二点疑問があります。

一点目ですが、

コード:

Enemy->ENmove(Player->GetX(),Player->GetY());//敵キャラの移動、敵ショット
//↑で操作キャラの場所に寄っていく敵、ホーミングする弾を作りたいので、操作キャラのX,Y座標を引数にしている。
 
現状これで動いています。が、考え方としてこれでよいのでしょうか。
視覚的には

コード:

>Enemy->ENmove();
 
で、操作キャラクタをグローバル変数?にして指定しなくても座標を取得したい気持ちなのですが
恐らくそれは良くないことなのでは。とも思います。
どうするのが一般的なのでしょうか。

二点目は
当たり判定について考え始めたところで
Collision();という関数を作ろうと考えています。
当たり判定には

PLAYER =new Player
ENEMY =new Enemy

両方の座標が欲しいのですが Collision(PLAYER *,ENEMY *);のようにしてもよいものなのでしょうか。
そしてこれはクラス化するべきなのでしょうか。
無駄があるような気もしつつよくわからなくなってきています。

まだよくわかってない点等かなりあります。
プレイヤが動いた、敵が動いた、プレイヤがショット撃てた のように順に作っているため、
どこかで破綻するのかもしれません。
根本的に考え方が間違ってましたらそのあたりも含めご教授くださると助かります。
以上よろしくおねがいたします。

Re: DxLibを利用したゲーム作成のクラスについて

Posted: 2013年10月20日(日) 18:37
by softya(ソフト屋)
>で、操作キャラクタをグローバル変数?にして指定しなくても座標を取得したい気持ちなのですが
>恐らくそれは良くないことなのでは。とも思います。
>どうするのが一般的なのでしょうか。

一般的かは難しいですが、親(マネージャ)にあたる処理から子(敵、プレーヤー)に対して座標を要求して、また子に渡すので良いんじゃないでしょうか。
ただ、座標データ受け渡し専用のデータを保持するだけの構造体やクラスを作った方が良いとは思います。

>両方の座標が欲しいのですが Collision(PLAYER *,ENEMY *);のようにしてもよいものなのでしょうか。
>そしてこれはクラス化するべきなのでしょうか。
>無駄があるような気もしつつよくわからなくなってきています。

最初の同じでほしいのは座標と当たり範囲だけですよね?
構造体にしてvectorなどに集めてはどうでしょうか?
後は当たりダメージ処理は、戻り値(たぶんvector)をみて処理するということに成るんでしょう。

>まだよくわかってない点等かなりあります。
>プレイヤが動いた、敵が動いた、プレイヤがショット撃てた のように順に作っているため、
>どこかで破綻するのかもしれません。

基本的には間違っていません。一瞬の時間を本当に切り取るわけではないので、そのようにしかプログラムが組めないんです。
ここで悩むより作ってから問題が出て来て悩んだほうが勉強になるので突っ走って良いと思います。
初心者は自分の成長のためにも悩むべきです。

Re: DxLibを利用したゲーム作成のクラスについて

Posted: 2013年10月22日(火) 01:13
by ねに
アドバイスありがとうございます。
vector、Templateですよね。たしか。
手元の本のどこかで見かけたことがあるような気がしますが、
むづかしそうなので放置していました。
調べて利用してみたいと思います。

基礎があやふやなので質問自体もあやふやで申し訳ありませんでした。
アドバイス通りとりあえず突っ走ってとりあえずの完成を目指したいと思います。
本当にありがとうございました!