自機ショットに角度をつけたいのですが

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
<kor

自機ショットに角度をつけたいのですが

#1

投稿記事 by <kor » 17年前

龍神録の館で紹介されいてる自機が発射するショットは真っ直ぐ進んでますよね。
あれを、シューティンゲームの館のショットみたいに斜めに発射できるようにしたいのですが、どこを変更すればいいのでしょうか?


lbfuvab

Re:自機ショットに角度をつけたいのですが

#3

投稿記事 by lbfuvab » 17年前

X方向のスピードを付けてはいかがでしょうか。
扱いはXもYも同じですので。

<kor

Re:自機ショットに角度をつけたいのですが

#4

投稿記事 by <kor » 17年前

x方向のスピードってどう変えるんですか?

cshot[k].spd=20;

のところがスピードというのはわかったんですけど、これを、

1と、3のショットならx-10
2と、4のショットならx+10

とするにはどうすればよいのでしょうか?

lbfuvab

Re:自機ショットに角度をつけたいのですが

#5

投稿記事 by lbfuvab » 17年前

>1と、3のショットならx-10
>2と、4のショットならx+10
言われている事が良く分かりませんが
私の考えでは、弾の登録時に
cshot[k].angle=-PI/2;
としている箇所を適当に直してやればいいと思います。

<kor

Re:自機ショットに角度をつけたいのですが

#6

投稿記事 by <kor » 17年前

すいません。
>1と、3のショットならx-10
>2と、4のショットならx+10
というのは、添付した画像(1)のことです。

cshot[k].angle=-PI/2;
の部分は直し方がわからないので、とりあえず斜めに発射するということで4way弾の角度をそのまま入れたら、斜めにはいくんですけど90°曲がってしまいます。(添付した画像(2))
どうすれば前に飛んで行くようになりますか?

lbfuvab

Re:自機ショットに角度をつけたいのですが

#7

投稿記事 by lbfuvab » 17年前

そういう事ですか。
・・・なら
①の角度は(PI*4)/3
②は(PI*5)/3
③、④は-PI/2でいいと思います。

<kor

Re:自機ショットに角度をつけたいのですが

#8

投稿記事 by <kor » 17年前

毎回毎回すいません。
cshot[k].angle=-PI/2;
の、-PI/2の部分をそのまま、
(PI*4)/3(PI*5)/3-PI/2
にすると、エラーが出てしまうんですが・・・。

①の角度=、②の角度=・・・というように、別々に指定することはできませんか?

lbfuvab

Re:自機ショットに角度をつけたいのですが

#9

投稿記事 by lbfuvab » 17年前

さすがに列挙しても無理です。

(17章目の)ch0_shot_patternやch1_shot_patternといった関数内では①、②、③、④をiの値で割り振ってます。
つまり、iの値に応じてcshot[k].angleを調整すると良いでしょう。

L

Re:自機ショットに角度をつけたいのですが

#10

投稿記事 by L » 17年前

横レス失礼します角度をつける際にこのような方法では駄目なのでしょうか?
// ビームの表示 ----------------------------------------------------------------
	for ( i=0;i<BEAM_MAX;i++ )
	{
		if (gBeam.flg==ON)
		{
			if(gBeam.type==TYPE1)	// 真ん中
			DDRectBltSprite( DDSCREEN,  (int)gBeam.x, (int)gBeam.y,
					 		BEAM_XSIZE, BEAM_YSIZE,
							sBeam,  0, BEAM_YSIZE*2, 
							BEAM_XSIZE, BEAM_YSIZE );
			else if(gBeam.type==TYPE2)	// 右上1
			DDRectBltSprite( DDSCREEN,  (int)gBeam.x, (int)gBeam.y,
					 		BEAM_XSIZE, BEAM_YSIZE,
							sBeam,  0, BEAM_YSIZE*3, 
							BEAM_XSIZE, BEAM_YSIZE );
			else if(gBeam.type==TYPE3)	// 右下1
			DDRectBltSprite( DDSCREEN,  (int)gBeam.x, (int)gBeam.y,
					 		BEAM_XSIZE, BEAM_YSIZE,
							sBeam,  0, BEAM_YSIZE, 
							BEAM_XSIZE, BEAM_YSIZE );
			else if(gBeam[i].type==TYPE4)	// 右上2
			DDRectBltSprite( DDSCREEN,  (int)gBeam[i].x, (int)gBeam[i].y,
					 		BEAM_XSIZE, BEAM_YSIZE,
							sBeam,  0, BEAM_YSIZE*4, 
							BEAM_XSIZE, BEAM_YSIZE );
			else if(gBeam[i].type==TYPE5)	// 右下2
			DDRectBltSprite( DDSCREEN,  (int)gBeam[i].x, (int)gBeam[i].y,
					 		BEAM_XSIZE, BEAM_YSIZE,
							sBeam,  0, 0, 
							BEAM_XSIZE, BEAM_YSIZE );
		}
	}

管理人

Re:自機ショットに角度をつけたいのですが

#11

投稿記事 by 管理人 » 17年前

恐らくラジアンと角度についての対応を詳しくご存じないのだと思います。

円周率をご存知ですよね。あの3.141592....という奴です。
あれをπをPIとしてdefineで予め定義してありますね。
これは180°を示します。一周360°は2*PIですね。
ここで、-90°と270°は同じ方向であることと、
xは増えると右へ
yは増えると下へ向くことを考えると、-90°か270°は真上になります。
つまり-PI/2か1.5*PIですね。
サンプルではこの前者が使われています。
だから、真上より10°位ずらしたければ

-PI/2 ± PI/10

ということになります。これで角度がかえられます。
スピードは.spdの値を変更することでかえられます。
これらは

void calc_cshot()

で計算されています。

//ショットの移動計算
void calc_cshot(){
	for(int i=0;i<CSHOT_MAX;i++){
		if(cshot.flag==1){
			int dranx=(int)(cshot.spd+11/2),drany=(int)(cshot.spd+55/2);
			cshot.x+=cos(cshot.angle)*cshot.spd;
			cshot.y+=sin(cshot.angle)*cshot.spd;			cshot.cnt++;
			if(cshot[i].x<-dranx || cshot[i].x>FMX+dranx ||
				cshot[i].y<-drany || cshot[i].y>FMY+drany)//画面から外れたら
				cshot[i].flag=0;
		}
	}
}

この部分をしっかり理解されると疑問も晴れると思います。
コサインとサインを利用して角度からx成分、y成分にわけ、スピードをかけています。
もし何かここでわからなければまたご質問下さい。
 

管理人

Re:自機ショットに角度をつけたいのですが

#12

投稿記事 by 管理人 » 17年前

>Lさん

その関数はどんな仕様なのでしょうか?

Re:自機ショットに角度をつけたいのですが

#13

投稿記事 by » 17年前

関数自体はかれこれ数年前に使ったものでソースを見ても分からないですがまぁDirectX の2D汎用関数ではあるのですがどう答えたらいいですかね??例えばDirectDraw を利用したゲームアプリケーションをサポートするヘルパー関数を使ってますとかなら答えられるんですが・・・

管理人

Re:自機ショットに角度をつけたいのですが

#14

投稿記事 by 管理人 » 17年前

関数の仕様はまぁ定義されていると思われる文字列を見たら大体想像出来ますが、
例えばこんな風に
http://homepage2.nifty.com/natupaji/DxL ... html#R3N10
何の値を引数にしているのか説明してもらえると助かります。

Re:自機ショットに角度をつけたいのですが

#15

投稿記事 by » 17年前

以下のような事でいいんですかね?

// ■スプライト処理つきサーフェス間の画像の転送
// スプライト処理つきサーフェス間の画像の転送を行う.
// サイズが違う場合には,拡大/縮小が行われる.
//
// 宣 言) void DDRectBltSprite(
// LPDIRECTDRAWSURFACE7 pDestSurface,
// int dx, int dy, int dw, int dh,
// LPDIRECTDRAWSURFACE7 pSrcSurface,
// int sx, int sy, int sw, int sh );
//
// 引 数) pDestSurface : 転送先サーフェス
// dx, dy : 転送先左上座標 (x,y)
// dw, dh : 転送先領域(幅と高さ)
// pSrcSurface : 転送元サーフェス
// sx, sy : 転送元左上座標 (x,y)
// sw, sh : 転送元領域(幅と高さ)
//
// 戻り値) なし

管理人

Re:自機ショットに角度をつけたいのですが

#16

投稿記事 by 管理人 » 17年前

上のコードと弾に角度を付けて発射することとどのように関係するのかよくわからないですが、
コードはかなり綺麗に書いていらっしゃいますし、試してみて思い通りにいけば、
それでいいのではないかと思いますよ。

Re:自機ショットに角度をつけたいのですが

#17

投稿記事 by » 17年前

まぁそうなんですがね

ちなみに関連するコードは全て横シューティング用のコードだったりします。

ライブラリー関連は全て学校の担任が独自に製作したものを使用させていただいて卒業向けに作った物でした。

結局ゲーム学科を卒業した物のネットワークエンジニアに転向してしまったため分からない事が多いんですよね。

また不明な点を調べた結果と併せていくつか質問するかもしれませんがよろしくお願いいたします。

<kor

Re:自機ショットに角度をつけたいのですが

#18

投稿記事 by <kor » 17年前

龍神録の自機ショットのプログラムををシューティングゲームの館のショットのプログラムに置き換える時に
GV.cppやdefine.cppとかに追加しなきゃいけないものってありますか?

管理人

Re:自機ショットに角度をつけたいのですが

#19

投稿記事 by 管理人 » 17年前

変数名も関数名も違うので、GV.hなどに変数名を追加しただけでは機能を移植できないと思います。
自機ショットに関係するものはch_tに含まれる構造体の内容と画像用変数、そしてcshot.cppに書かれている内容が主だと思いますから、
そこを確認すれば良いと思います。
関数を移植する時は、内容をしっかり理解して移植する必要がありそうです。

閉鎖

“C言語何でも質問掲示板” へ戻る