同心円状に広がるように弾を一斉に発射



Space キーを押すと、同心円状に広がるように24発の弾を一斉に発射します。
C#でも 弾丸を発射 を作成しています。
Java Applet で 弾丸の発射と爆発 が楽しめます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 背景画像のスクロールには BMP Object Class を使います。
    弾の発射には SPRITE Object Class を継承した SHOOT Object Class を使います。
    ID_TIMER は背景画像をスクロールするタイマのIDで、ID_TIMER1 は弾を発射するタイマのIDです。
    Shoot が SHOOT Object Class で、Bmp が BMP Object Class の定義です。
    g_Pos は背景画像のオフセットで g_Leng は発射した弾の時間(広がり)を記憶する変数です。
        #include    "Shoot.h"
        #include    "Bmp.h"
        #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
        #define     SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
        #define     ID_TIMER    (WM_APP + 0)
        #define     ID_TIMER1   (WM_APP + 1)
    
        SHOOT*      Shoot= NULL;
        BMP*        Bmp= NULL;
        long        g_Pos= 0;       //Back Scroll の位置
        int         g_Leng= 0;      //Tama の広がり
        
  2. WM_CREATE: で Object をインスタンス化して、背景の画像と弾の画像を入力します。
    背景画像のスクロールと弾を発射するタイマの間隔を設定します。
            case WM_CREATE:
                Bmp= new BMP(hWnd);
                Bmp->Load("星空.bmp");
                Shoot= new SHOOT(hWnd);
                Shoot->Load("tama.bmp",2,1);
                SetTimer(hWnd,ID_TIMER,50,NULL);
                SetTimer(hWnd,ID_TIMER1,120,NULL);
                break;
        
  3. WM_PAINT: では g_Pos(背景画像のオフセット)を使って背景をスクロールします。
    前のフレームで描画されていた弾の画像は、背景の描画によって消去されます。
    g_Leng は発射した弾を描画する時間を示す値で、最初24に設定されゼロになるまで弾が描画されます。
    len は、座標(220,320)を中心とする24個の弾の広がりを指示する値です。
    弾の画像は 32×32 の二種類の弾を横に並べていますが、今回は1番の画像を使用しています。
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                Bmp->Show(0,0,640-g_Pos,480,g_Pos,0);
                Bmp->Show(640-g_Pos,0,g_Pos,480,0,0);
                if (g_Leng)
                {   len= (24-g_Leng--)*8;
                    //Shoot->View(0,320,220,len);
                    Shoot->View(1,320,220,len);
                }
                EndPaint(hWnd, &ps);
                break;
        
  4. WM_TIMER: には二種類のタイマがポストされます。
    ID_TIMER1 が弾を発射するタイマのIDで、Space キーが押されたときに弾を発射します。
    ID_TIMER が背景画像をスクロールするタイマのIDです。
            case WM_TIMER:
                if (wParam == ID_TIMER1)
                //{   if (GetKeyState(VK_SPACE)<0)    g_Leng= 24; }
                {   if (GetKeyState(VK_SPACE)<0 && g_Leng==0)   g_Leng= 24; }
                if (wParam == ID_TIMER)
                {   g_Pos= (g_Pos+1)%640;
                    InvalidateRect(hWnd,NULL,FALSE);    //クリアしない
                }
                break;
        
  5. WM_DESTROY: ではタイマを止めて Object を開放して下さい。
            case WM_DESTROY:
                KillTimer(hWnd,ID_TIMER);
                KillTimer(hWnd,ID_TIMER1);
                SAFE_DELETE(Bmp);
                SAFE_DELETE(Shoot);
                PostQuitMessage(0);
                return 0L;
        

SHOOT Object Class

ここでは簡単に SHOOT Object Class に付いて説明します。
  1. View() は弾を発射する SHOOT Object Class のメンバー関数(メソッド)です。
    Shoot->View(1,320,220,len);
    ソースコード説明
    View() 同心円状に弾を描画するメソッド
    1 Sprite(弾)の番号
    320,220 描画の中心座標
    len 中心からの広がり(半径)
  2. 中心座標と len から同心円状に24発の弾の座標を計算して、背景画像の上から透明色を設定して弾を描画します。
    座標の回転は 5本の線で星の形を描きます を参照して下さい。

超初心者のプログラム入門(Win32API C++)