ページ 1 / 1
自機ショットに角度をつけたいのですが
Posted: 2008年8月28日(木) 17:45
by <kor
龍神録の館で紹介されいてる自機が発射するショットは真っ直ぐ進んでますよね。
あれを、シューティンゲームの館のショットみたいに斜めに発射できるようにしたいのですが、どこを変更すればいいのでしょうか?
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月28日(木) 18:01
by dpbut
間違えました^^;
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月29日(金) 03:10
by lbfuvab
X方向のスピードを付けてはいかがでしょうか。
扱いはXもYも同じですので。
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月29日(金) 09:06
by <kor
x方向のスピードってどう変えるんですか?
cshot[k].spd=20;
のところがスピードというのはわかったんですけど、これを、
1と、3のショットならx-10
2と、4のショットならx+10
とするにはどうすればよいのでしょうか?
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月29日(金) 10:07
by lbfuvab
>1と、3のショットならx-10
>2と、4のショットならx+10
言われている事が良く分かりませんが
私の考えでは、弾の登録時に
cshot[k].angle=-PI/2;
としている箇所を適当に直してやればいいと思います。
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月29日(金) 11:27
by <kor
すいません。
>1と、3のショットならx-10
>2と、4のショットならx+10
というのは、添付した画像(1)のことです。
cshot[k].angle=-PI/2;
の部分は直し方がわからないので、とりあえず斜めに発射するということで4way弾の角度をそのまま入れたら、斜めにはいくんですけど90°曲がってしまいます。(添付した画像(2))
どうすれば前に飛んで行くようになりますか?
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月29日(金) 13:12
by lbfuvab
そういう事ですか。
・・・なら
①の角度は(PI*4)/3
②は(PI*5)/3
③、④は-PI/2でいいと思います。
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月29日(金) 19:08
by <kor
毎回毎回すいません。
cshot[k].angle=-PI/2;
の、-PI/2の部分をそのまま、
(PI*4)/3(PI*5)/3-PI/2
にすると、エラーが出てしまうんですが・・・。
①の角度=、②の角度=・・・というように、別々に指定することはできませんか?
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 00:30
by lbfuvab
さすがに列挙しても無理です。
(17章目の)ch0_shot_patternやch1_shot_patternといった関数内では①、②、③、④をiの値で割り振ってます。
つまり、iの値に応じてcshot[k].angleを調整すると良いでしょう。
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 01:24
by L
横レス失礼します角度をつける際にこのような方法では駄目なのでしょうか?
// ビームの表示 ----------------------------------------------------------------
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:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 18:36
by 管理人
恐らくラジアンと角度についての対応を詳しくご存じないのだと思います。
円周率をご存知ですよね。あの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:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 19:30
by 管理人
>Lさん
その関数はどんな仕様なのでしょうか?
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 20:00
by L
関数自体はかれこれ数年前に使ったものでソースを見ても分からないですがまぁDirectX の2D汎用関数ではあるのですがどう答えたらいいですかね??例えばDirectDraw を利用したゲームアプリケーションをサポートするヘルパー関数を使ってますとかなら答えられるんですが・・・
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 20:10
by 管理人
関数の仕様はまぁ定義されていると思われる文字列を見たら大体想像出来ますが、
例えばこんな風に
http://homepage2.nifty.com/natupaji/DxL ... html#R3N10
何の値を引数にしているのか説明してもらえると助かります。
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 20:21
by L
以下のような事でいいんですかね?
// ■スプライト処理つきサーフェス間の画像の転送
// スプライト処理つきサーフェス間の画像の転送を行う.
// サイズが違う場合には,拡大/縮小が行われる.
//
// 宣 言) 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:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 21:17
by 管理人
上のコードと弾に角度を付けて発射することとどのように関係するのかよくわからないですが、
コードはかなり綺麗に書いていらっしゃいますし、試してみて思い通りにいけば、
それでいいのではないかと思いますよ。
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月30日(土) 21:25
by L
まぁそうなんですがね
ちなみに関連するコードは全て横シューティング用のコードだったりします。
ライブラリー関連は全て学校の担任が独自に製作したものを使用させていただいて卒業向けに作った物でした。
結局ゲーム学科を卒業した物のネットワークエンジニアに転向してしまったため分からない事が多いんですよね。
また不明な点を調べた結果と併せていくつか質問するかもしれませんがよろしくお願いいたします。
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月31日(日) 15:48
by <kor
龍神録の自機ショットのプログラムををシューティングゲームの館のショットのプログラムに置き換える時に
GV.cppやdefine.cppとかに追加しなきゃいけないものってありますか?
Re:自機ショットに角度をつけたいのですが
Posted: 2008年8月31日(日) 18:41
by 管理人
変数名も関数名も違うので、GV.hなどに変数名を追加しただけでは機能を移植できないと思います。
自機ショットに関係するものはch_tに含まれる構造体の内容と画像用変数、そしてcshot.cppに書かれている内容が主だと思いますから、
そこを確認すれば良いと思います。
関数を移植する時は、内容をしっかり理解して移植する必要がありそうです。