26. シューティング基本


さてさて長いプログラムを見て疲れたでしょう。

次は一風変わってRPGからシューティングの基本を勉強しましょう。別にシューティングに限ったことではありません。

RPGの中でも何か弾丸が飛ぶようなシーンを作りたければ参考になることでしょう。

まず、画面に表示する玉を構造体で書きます。

struct shot{
  int x,y;
  int flag;
};

x、yは玉の座標。 flagは玉が発射したかどうかを示すフラグです。画面内に表示したいだけ、これを用意しましょう。

struct shot tama[10];

で宣言し、玉を10個作ります。

for(i=0;i<10;i++){
  tama[i].x=640/2; tama[i].y=480;
  tama[i].flag=0;
}

で初期化し、flagに0を入れます。0が発射していない状態。1が発射している状態を示します。

if(counter<5) //前にエンターを押してから5カウント未満なら
  counter++; //カウントアップ

エンターを押した瞬間がcounter=0;で、順に値が増加します。

これは、エンターを押したときに連続で発射してしまわないようにする処置です。

5回処理が回ってくるまで発射されません。

else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
  counter=0; //カウンターを戻す
  for(i=0;i<10;i++){
    if(tama[i].flag==0){ //発射していない玉を探し、
      tama[i].flag=1; //発射フラグを立てる
      break;
    }
  }
}

前回発射してから5カウント以上たっていて、かつエンターが押されていれば、カウンターを戻し、

発射されていないフラグの玉を捜して発射フラグを立てる。

for(i=0;i<10;i++){
  if(tama[i].flag==1){ //発射している玉なら
    tama[i].y-=8; //座標を8減らす
    DrawGraph( tama[i].x , tama[i].y , image[1] , TRUE );//玉を描画
    if(tama[i].y < -32){ //もし画面外まで来たら
      tama[i].y=480; //初期値に戻し、
      tama[i].flag=0; //発射フラグを戻す
    }
  }
}

発射フラグを探して、発射フラグのたっている玉の座標を減らし、描画する。

もし画面外に出ていたら発射フラグを戻し、初期値に戻す。

このプログラムをくっつけて完成したのがサンプルプログラムです。


#include "DxLib.h"
 
struct shot{
        int x,y;
        int flag;
};
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;          // ウインドウモードに変更
        if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了 
 
        int image[16],i,counter=0; //counter=発射してからのカウントをする変数。
        char Key[256];
        struct shot tama[10];               //tamaを10個作る。
 
        for(i=0;i<10;i++){                  //初期化処理
                tama[i].x=640/2; tama[i].y=480; //座標代入
                tama[i].flag=0;                 //飛んでいない事を示すフラグ=0
        }
 
        SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定
 
        LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
                                
        while(1){
                ClearDrawScreen();                   //裏画面のデータを全て削除
                GetHitKeyStateAll( Key ) ;           // すべてのキーの状態を得る
 
                if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
 
                if(counter<5)                        //前にエンターを押してから5カウント未満なら
                        counter++;                       //カウントアップ
 
                else if( Key[ KEY_INPUT_RETURN ]  == 1 ){//5カウント以上たっていたら
                        counter=0;                       //カウンターを戻す
                        for(i=0;i<10;i++){             
                                if(tama[i].flag==0){     //発射していない玉を探し、
                                        tama[i].flag=1;  //発射フラグを立てる
                                        break;
                                }
                        }
                }
                for(i=0;i<10;i++){
                        if(tama[i].flag==1){              //発射している玉なら
                                tama[i].y-=8;             //座標を8減らす
                                DrawGraph( tama[i].x , tama[i].y , image[1] , TRUE );//玉を描画
                                if(tama[i].y < -32){      //もし画面外まで来たら
                                        tama[i].y=480;    //初期値に戻し、
                                        tama[i].flag=0;   //発射フラグを戻す
                                }
                        }
                }
                
                if( Key[ KEY_INPUT_ESCAPE ]  == 1 ) break;//Escボタンが押されたらブレイク
 
                ScreenFlip() ;//裏画面データを表画面へ反映
        }
        DxLib_End() ;// DXライブラリ使用の終了処理
        return 0 ;// ソフトの終了
}

実行結果

注意)黄色い線は表示されません。

→掲示板で質問する



- Remical Soft -