初めまして、今回初めて質問させていただきます。
私は今、全方向型のシューティングゲームの作成をしています。
そして、このサイトを拝見して、どうにか一定方向の弾の発射まで行えるようになりました。
しかし、そのプログラムを改造して方向キーを押した後、弾がその方向にでる用にしたいのですが、
うまくいきません。どうしたらよいかアドバイスをください。
全方向シューティングについて
Re:全方向シューティングについて
>>電気屋さん
ある角度に打ち出すのであれば
弾のX座標 += 速度 * cosf(ラジアンに変換した角度);
弾のY座標 += 速度 * sinf(ラジアンに変換した角度);
(sinf, cosf は float で計算するものです。doubleで計算したい場合は sin, cos を使って下さい)
例えば90度の方向に速度2で打ちたい場合、
弾のX座標 += 2 * cosf((90)*PI/180.0f);
弾のY座標 += 2 * sinf((90)*PI/180.0f);
(PIは円周率の3.141592・・・)
という風になります。
もちろん、90度に画像を回転させる処理も入れなければなりません。
ある角度に打ち出すのであれば
弾のX座標 += 速度 * cosf(ラジアンに変換した角度);
弾のY座標 += 速度 * sinf(ラジアンに変換した角度);
(sinf, cosf は float で計算するものです。doubleで計算したい場合は sin, cos を使って下さい)
例えば90度の方向に速度2で打ちたい場合、
弾のX座標 += 2 * cosf((90)*PI/180.0f);
弾のY座標 += 2 * sinf((90)*PI/180.0f);
(PIは円周率の3.141592・・・)
という風になります。
もちろん、90度に画像を回転させる処理も入れなければなりません。
Re:全方向シューティングについて
>このサイトを拝見して
と言う事はコードも同じような感じと考えて良いのでしょうか?
その場合は初期角度だけ変えれば良さそうですね
「弾を発射中に方向キーで発射方向を変えられる」と解釈すると、こんな感じでどうですか?(8方向限定)
char X=0,Y=0;
if( Key[KEY_INPUT_UP]>0 )--Y;
if( Key[KEY_INPUT_RIGHT]>0 )++X;
if( Key[KEY_INPUT_DOWN]>0 )++Y;
if( Key[KEY_INPUT_LEFT]>0 )--X;
if( X!=0 || Y!=0 )Angle=atan2( Y , X );
と言う事はコードも同じような感じと考えて良いのでしょうか?
その場合は初期角度だけ変えれば良さそうですね
「弾を発射中に方向キーで発射方向を変えられる」と解釈すると、こんな感じでどうですか?(8方向限定)
char X=0,Y=0;
if( Key[KEY_INPUT_UP]>0 )--Y;
if( Key[KEY_INPUT_RIGHT]>0 )++X;
if( Key[KEY_INPUT_DOWN]>0 )++Y;
if( Key[KEY_INPUT_LEFT]>0 )--X;
if( X!=0 || Y!=0 )Angle=atan2( Y , X );
Re:全方向シューティングについて
>電気屋さん
初めまして^^
うちのサイトをご覧下さりありがとうございます☆
まず、発射と軌道計算はどのようにしていますか?
弾.x++;
みたいな撃ち方だとすぐに変えられないかもしれませんが、
「角度」を持って
弾.x += cos(弾.角度) * 弾.スピード;
みたいに計算していれば、その角度を変更すればいいだけですよね。
まずは、色んな角度に発射できることを確認し、
それから同時に色んな角度で発射してみてはどうでしょう?
作ったプログラムが比較的短いものなら、ここにアップしたほうが回答が得られやすいかもしれません。
初めまして^^
うちのサイトをご覧下さりありがとうございます☆
まず、発射と軌道計算はどのようにしていますか?
弾.x++;
みたいな撃ち方だとすぐに変えられないかもしれませんが、
「角度」を持って
弾.x += cos(弾.角度) * 弾.スピード;
みたいに計算していれば、その角度を変更すればいいだけですよね。
まずは、色んな角度に発射できることを確認し、
それから同時に色んな角度で発射してみてはどうでしょう?
作ったプログラムが比較的短いものなら、ここにアップしたほうが回答が得られやすいかもしれません。
プログラムです
/方向キー入力で変数mukiに0~3を入れる
if( Key[ KEY_INPUT_UP ]==1)
muki=0;
if( Key[ KEY_INPUT_LEFT ]==1)
muki=1;
if( Key[ KEY_INPUT_DOWN ]==1)
muki=2;
if( Key[ KEY_INPUT_RIGHT ]==1)
muki=3;
// yを減らす
// ↑
// ↑
// ↑
// xを減らす ←←←★→→→ xを増やす
// ↓
// ↓
// ↓
// yを増やす
//
switch (muki){
case 0://キャラクターが上を向いていたら
for(i=0;i<SHOTMAX;i++){
if(tama.flag==1){ //発射している玉なら
tama.y-=SHOTSPEED; //y座標を減らす
DrawGraph( tama.x , tama.y , image[muki] , TRUE );//玉を描画
if(tama.y < -32){ //もし画面外まで来たら
tama.x=320; //初期値に戻し
tama.y=240;
tama.flag=0; //発射フラグを戻す
}
}
}
break;
このような感じで4方に打てるようにがんばっているのですが、うまくいかないのでアドバイスお願いします。
また、弾は始点から発射されたらその場所から画面の端まで方向を変えず、進むようにしたいと思っています。
if( Key[ KEY_INPUT_UP ]==1)
muki=0;
if( Key[ KEY_INPUT_LEFT ]==1)
muki=1;
if( Key[ KEY_INPUT_DOWN ]==1)
muki=2;
if( Key[ KEY_INPUT_RIGHT ]==1)
muki=3;
// yを減らす
// ↑
// ↑
// ↑
// xを減らす ←←←★→→→ xを増やす
// ↓
// ↓
// ↓
// yを増やす
//
switch (muki){
case 0://キャラクターが上を向いていたら
for(i=0;i<SHOTMAX;i++){
if(tama.flag==1){ //発射している玉なら
tama.y-=SHOTSPEED; //y座標を減らす
DrawGraph( tama.x , tama.y , image[muki] , TRUE );//玉を描画
if(tama.y < -32){ //もし画面外まで来たら
tama.x=320; //初期値に戻し
tama.y=240;
tama.flag=0; //発射フラグを戻す
}
}
}
break;
このような感じで4方に打てるようにがんばっているのですが、うまくいかないのでアドバイスお願いします。
また、弾は始点から発射されたらその場所から画面の端まで方向を変えず、進むようにしたいと思っています。