ページ 11

全方向型シューティングゲーム2

Posted: 2009年9月30日(水) 13:35
by 電気屋
前回のアドバイスに「プログラムをのせると解説しやすい」とかかれていたので乗せます。

/方向キー入力で変数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方に打てるようにがんばっているのですが、うまくいかないのでアドバイスお願いします。
また、弾は始点から発射されたらその場所から画面の端まで方向を変えず、進むようにしたいと思っています。

Re:全方向型シューティングゲーム2

Posted: 2009年9月30日(水) 14:01
by zwi
弾の構造体に方向を持っていないと、常にカーソルの押されている方向になっちゃいますね。
1.まずカーソルの押された方向では無く常に自機の向きを覚えている変数を作る事。
2.カーソルを押されたら自機の向きを覚えている変数を更新する事。
3.弾の構造体に弾の向きを覚える変数を追加する事。
4.弾の発射時に、自機の向きを弾の向きにコピーする事。
5.弾の移動処理の移動方向は弾の向きを見て行う事。

弾の移動処理はこんな感じで。
for(i=0;i<SHOTMAX;i++){
 switch (tama.muki){
 case 0://弾が上を向いていたら
  if(tama.flag==1){ //発射している玉なら
   tama.y-=SHOTSPEED; //y座標を減らす
   if(tama.y < -32){ //もし画面外まで来たら
    tama.x=320; //初期値に戻し
    tama.y=240;
    tama.flag=0; //発射フラグを戻す
   } else { 
    DrawGraph( tama.x , tama.y , image[muki] , TRUE );//玉を描画
   }
  }
  break;
  case 1:
   ・
   ・
   ・
 }
}

Re:全方向型シューティングゲーム2

Posted: 2009年9月30日(水) 23:21
by チルチル
少し気になったんですが弾は4方向にしか撃てないのでしょうか?
右と上を押したら右上に撃てたりする方が便利だと思うのですが・・

あと方向より角度の方が簡単ではないでしょうか?
mukiでスイッチ文を行う必要も無くなりますし・・

tama.x=320; //初期値に戻し
tama.y=240;
↑これって必要なんでしょうか?
弾が自機から出ても中心から出ても登録時に初期化すれば良いような気がするのですが・・

tama.y-=SHOTSPEED; //y座標を減らす
↑弾の速度って不変なんでしょうか?
色々な速度の弾があった方が良いような気もしますが・・

DrawGraph( tama.x , tama.y , image[muki] , TRUE );//玉を描画
↑これも角度使った方が効率良くないでしょうか?

Re:全方向型シューティングゲーム2

Posted: 2009年10月01日(木) 07:15
by DVDM
弾の移動処理ですが、弾を打ち出す角度(ラジアン)と弾の速さを与えてやることで
このように書くことができます。

弾のX座標 += 弾の速さ * cos(打ち出したい角度);
弾のY座標 += 弾の速さ * sin(打ち出したい角度);

角度はラジアンです。
ラジアンの求め方は、「角度*円周率PI/180」で求められます。
また、cos、sin は「#include <math.h>」 が必要です。


■速度5で、90度(下)の方向に打ちたい場合
弾のX座標 += 5 * cos(90*3.14/180);
弾のY座標 += 5 * sin(90*3.14/180);


■速度3で、225度(左上)の方向に打ちたい場合
弾のX座標 += 3 * cos(225*3.14/180);
弾のY座標 += 3 * sin(225*3.14/180);