BG を切り替える

秘密の通路をくぐると、ダンジョンの BG に切り替わります。
また、BG を利用して宝箱の画像を切り替えます。

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

プログラムの説明

  1. ここまでプログラム出来ればダンジョンの BG に切り替えるのは簡単でしょう。
    また宝箱のような簡単な画像は Sprite で独立して表示するよりも BG に貼り付けた方が簡単で手間もかかりません。
    宝箱が閉じている画像と開いている画像をマップチップ上に並べて「+2」すれば切り替わるようにしています。

  2. Bg が下の BG Class で Bgu が上から重ねる BG Class で Bg2 がダンジョンの BG です。
    *Char は GIF 画像を使った Sprite Class です。
    Chenge が BG を切り替えるフラグです。
        BACKBUF     *Back= NULL;        //Back Buffer Object
        BG          *Bg= NULL;          //Back Ground Object
        BG          *Bgu= NULL;         //Back Ground Object Upper
        BG          *Bg2= NULL;         //Back Ground Object Upper
        GSPRITE     *Char= NULL;        //Charcter Object
        WORD        g_xp, g_yp;         //キャラクタの座標
        WORD        xoff=0, yoff=0;     //背景のスクロール値
        WORD        g_n= 0;             //進行方向(0 ~ 3)
        WORD        g_chg= 0;           //アニメーション画像の切り替え
        int         Att[256];           //Mapchip の属性
        int         Chenge= 0;
        
  3. Back Class, Bg Class に続いて Bgu Class と Bg2 Class を設定します。
    GSPRITE Class は My.lib に登録されている GIF 画像を使った Sprite Class です。
    Double.csv, Double2.csv, 迷路.csv は BG 情報が記録されている TEXT 形式のファイルです。
    拡張子 csv は Comma Separated Value の略で、項目をカンマで区切りレコードを改行で区切るフォーマットです。
    Map2att.txt は Mapchip の属性(通れる/通れない/宝箱/入口)が記録された TEXT 形式のファイルです。
            case WM_CREATE:
                Back= new BACKBUF(hWnd);
                Bg= new BG(hWnd);
                Bg->SetCsv("Double.csv");
                Bg->SetTable("MapSatt.txt",Att,256);
                Bgu= new BG(hWnd);
                Bgu->SetCsv("Double2.csv");
                Bg2= new BG(hWnd);
                Bg2->SetCsv("迷路.csv");
                Char= new GSPRITE(hWnd);
                Char->Load("chr17.gif",1,8);
                g_xp=g_yp= 200;
                Back->SetMode(WIDTH,HEIGHT,32);
                SetTimer(hWnd,ID_TIMER,100,NULL);
                break;
        
  4. キャラクタの移動/宝箱/ダンジョンの切り替えを設定する関数です。
    セルの属性 Att[ChipNo] に「宝箱/ダンジョン」の属性を追加しています。
    キャラクタが宝箱の前に立ったとき MessageBox() を表示して画像を切り替えます。
    Bgu->MapP() が画像番号の領域で +2 すると蓋が開いた画像に切り替わります。
    蓋が開くと宝箱の属性をリセットします。
    秘密の通路の前に立ったとき MessageBox() を表示してダンジョンに切り替えます。
        void  move()
        {   int     xp,yp;
            int     ChipNo;
                   :
                   :
            switch(Att[ChipNo])
            {   case 1:      //通行可
                    switch(g_n)
                    {   case 0:      //上
                            g_yp-= 2;
                                :
                                :
                    }
                    break;
                case 2:      //宝箱
                    Att[ChipNo]= 0;
                    MessageBox(NULL,"宝箱から秘密の通路の鍵を見つけた","Debug Message Box",MB_OK);
                    *(Bgu->MapP(xp,yp))+= 2;
                    *(Bgu->MapP(xp+16,yp))+= 2;
                    *(Bgu->MapP(xp,yp-16))+= 2;
                    *(Bgu->MapP(xp+16,yp-16))+= 2;
                    *(Bgu->MapP(xp,yp-32))+= 2;
                    *(Bgu->MapP(xp+16,yp-32))+= 2;
                    break;
                case 3:      //秘密の通路
                    Att[ChipNo]= 0;
                    MessageBox(NULL,"ここが秘密の通路の入り口らしい","Debug Message Box",MB_OK);
                    Chenge= 1;
                    break;
            }
        }
        
  5. Render() 関数では Chenge フラグを調べて描画する BG を決めています。
        VOID  Render()
        {   Back->Clear((HBRUSH)GetStockObject(LTGRAY_BRUSH));
            if (Chenge==0)  Bg->View(Back->hBackDC,xoff,yoff);
            else            Bg2->View(Back->hBackDC,xoff,yoff);
            Char->Show(Back->hBackDC,g_n*2+g_chg,g_xp,g_yp);
            if (Chenge==0)  Bgu->View(Back->hBackDC,xoff,yoff);
            Back->Blt();
        }
        

【演習】

  1. Full Screen Mode に設定してプログラムを完成させて下さい。
  2. 複数のマップチップ画像を使って、宝箱が開く簡単なアニメーションをすることもできます。
  3. 宝箱を開けて鍵を取ったときに限り、秘密の通路を開けて下さい。

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