ページ 11

シューティングゲームについて

Posted: 2009年10月23日(金) 23:07
by チルノのしー言語教室
C++ と 画像はDirectGraphics でプログラムを組んでいます。

質問です。
自機や敵が弾を発射すると、飛ぶ角度によって弾の画像が変わるように
プログラムを組みたいと思ってます。

1:角度ごとに弾の画像を用意して、弾を飛ばした角度によってどの画像を使うか決めて描画。
2:弾の画像は1つで、弾を飛ばした角度にその画像を傾ける。

今は 1 で組んでます。2 は画像を回転させることができれば可能かと思ってます。
DirectXはあまり詳しくないのですが、お願いします。

シューティングゲームについて

Posted: 2009年10月24日(土) 15:50
by チルノのしー言語教室
投稿者です。質問の仕方が悪かったのでもう一回。

シューティング作ってて、DirectGraphicsのD3DXSPRITEで
描画関係やってます
弾を飛ばすと角度によって弾の画像が変わるような処理作りたいんで
すが、

1:それなりに角度分画像を用意して、飛ばした角度によってどの画像を
 使うか決める
2:弾の画像は1つだけ用意して、飛ばした角度にD3DXSPRITEで画像を
 回転させて使う

他にやり方思いつかないけど、やるならどっちがいいと思います?

Re:シューティングゲームについて

Posted: 2009年10月24日(土) 16:44
by Justy

>やるならどっちがいいと思います

「角度によって弾の画像が変わる」の変わり具合次第ではないでしょうか。

 単純な回転で表現できる弾なら2です。
 回転は ID3DXSprite::SetTransform() で指定できます。

 が、そうではなく別の素材が必要なほど変わってしまう
(例えば上方向は丸い弾だけど、横方向になるにつれて△な弾になるとか)
のなら1にするしかないと思います。

 ただ、1の場合素材にもよりますが、画像の切り替わりがはっきりと
判ってしまうことが考えられるので、もう一工夫必要になるかもしれません。

シューティングゲームについて

Posted: 2009年10月24日(土) 19:56
by チルノのしー言語教室
Justyさんありがとうございます。

弾は角度だけ変えることができればいいので2でやります。

回転のやり方もわからなかったので調べたのですがうまくいきません。

-----------------------------------------------------------------------------------------
D3DXMATRIX matrix;
double angle = (90 * 3.14) / 180;

D3DXMatrixTransformation2D(
              &matrix,
              NULL, //?
              NULL, //?
              NULL, //?
              &D3DXVECTOR2(x+cx/2, y+cy/2),  //画像の中心座標
              angle,         //角度(ラジアン変換)
              &D3DXVECTOR2(x, y)        //x,y座標
              );

D3DXSprite->SetTransform(&matrix);

g_pD3DXSprite->Draw(
          Tex, //テクスチャ
 &srect, //画像元
 NULL, //中心ベクトル
 NULL, //?
 argb  //色
 );
-----------------------------------------------------------------------------------------
簡単に書くとこんな感じです。//? は何に使うのかわからない引数です。
これだと画像は右に90度回転してるんですが、位置が変になります。
D3DXMatrixTransformation2D の第5,第6引数をNULLにすると普通に表示されます。
わかる方いましたらお願いします。

Re:シューティングゲームについて

Posted: 2009年10月24日(土) 21:28
by Justy

>D3DXMatrixTransformation2D

 マニュアルを見るとわかりますが、第5引数はスクリーンの中心座標ではなく
ローカルでの回転の中心です。

 つまり D3DXVECTOR2(0,0)もしくは NULLを入れた場合はそのスプライトが画面のどこにあっても
テクスチャの原点……左上を中心にその場で回転することになります。

 なので、テクスチャの中央を中心に回転したい場合は第5引数にテクスチャの半分のサイズを
入れてください。

シューティングゲームについて

Posted: 2009年10月25日(日) 00:11
by チルノのしー言語教室
Justyさん、再度ありがとうございます。

無事描画できました。
第5引数は画像の中心点を入れるものだと思って、x+cx/2, y+cy/2 と
やってたのですが違ったんですね。すごく勘違いしてました。

角度を扱うようになって思ったことなのですが、0度が3時方向なのは使用ですか?
弾の画像元が上を向いていた場合、90度プラスしてから描画しないといけません。
設定とかできますか?

Re:シューティングゲームについて

Posted: 2009年10月25日(日) 00:45
by Justy

>角度を扱うようになって思ったことなのですが、0度が3時方向なのは使用ですか?

 D3DXMatrixTransformation2D関数での話ですか?
 そんなこと無いはずですけど……。

 上向き画像で0度を入れれば、そのままの画像が表示されるはずですよ。

シューティングゲームについて

Posted: 2009年10月25日(日) 01:46
by チルノのしー言語教室
Justyさん

>上向き画像で0度を入れれば、そのままの画像が表示されるはずですよ。
こちらは問題ありません。


問題はこちらなんですが、

double angle = (角度 * PI) / 180;
x += cos(angle) * speed;
y += sin(angle) * speed;

この計算で角度が0度の時は、弾が3時方向に飛んで行きます。90度で6時方向です。
0度を真上にしたいのですが直せますか? それとも仕様でしょうか?

Re:シューティングゲームについて

Posted: 2009年10月25日(日) 01:57
by Justy

>度を真上にしたいのですが直せますか? それとも仕様でしょうか?

 まずそういう式なので、仕様と言えば仕様です。

 で、勿論直せます。上 0度、時計回りで良ければ
[color=#d0d0ff" face="monospace]
x += sin(angle) * speed;
y += -cos(angle) * speed;
[/color]

でいいかと。

シューティングゲームについて

Posted: 2009年10月25日(日) 02:17
by チルノのしー言語教室
Justyさん

無事できました。ありがとうございました。

敵の判定

Posted: 2009年11月07日(土) 11:52
by cdj
マウスでクリックすると敵が消えるような感じのものを作っているのですが、
敵に体力をつけるとうまくいきません。
やり方がわからないので質問しました。
{
    int MouseInput=(GetMouseInput()& MOUSE_INPUT_RIGHT);    //マウスの押した状態取得
   
		if( ( MouseInput & 1<<1 ) != 0)
		{
			mouse->Button[1]++;//押されていたらカウントアップ


			for(int t = 0;t < ENEMY_MAX;t++){
			if(mouse->Button[1] < 3 && (enemy2[t].x - mouse->x) * (enemy2[t].x - mouse->x)
			    + (enemy2[t].y - mouse->y) * (enemy2[t].y - mouse->y)
				    <= (enemy2[t].r + mouse->r) * (enemy2[t].r + mouse->r))
			{
				enemy2[t].hp -= 1;
					if(enemy2[t].hp < 0)
					{
                        enemy2[t].flag = false;
						score +=30;
					    break;
					}
					
					else
						shot_eff->flag = false;
			}
			else        
			    mouse->Button[1] = 0; //押されてなかったら0
			}
		}	

		
}
これだと、敵は消えないし、スコアの上がり方もおかしくなってしまいます。。

Re:敵の判定

Posted: 2009年11月07日(土) 11:57
by cdj
すいません。敵は消えます。
でも一瞬で消えてしまいます。。