BMP の背景画像をスクロール

タイマ割り込みで BMP の背景画像を横にスクロールします。
シューティングゲームの背景は、ゲームが終了するまでスクロールが続きます。

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

プログラムの説明

  1. 背景画像の表示に BMP Object Class を使います。
    Bmp.cpp と Bmp.h をプロジェクトに追加して下さい。
    ID_TIMER はタイマのIDです。
    *Img は BMP Object Class の定義です。
    g_Pos は背景画像のオフセットです。
        #include    "Bmp.h"
        #define     ID_TIMER    (WM_APP + 0)
        #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
    
        BMP         *Img= NULL;
        long        g_Pos= 0;
        
  2. 背景画像をスクロールするとき、ウインドウサイズが変更されることまで考慮するとプログラムが難しくなります。
    そこでゲームプログラムではウインドウサイズを固定する方法がお勧めです。
    ウインドウのスタイルに WS_OVERLAPPEDWINDOW に代えて WS_SYSMENU を設定して下さい。
  3. WM_CREATE: で背景の画像を入力します。
    背景画像は左にスクロールするので「背景を2枚横に並べた画像」を用意して下さい。
    背景画像をスクロールするタイミングをタイマで設定します。
        case WM_CREATE:
            Bmp= new BMP(hWnd);
            Bmp->Load("utyu.bmp");
            SetTimer(hWnd,ID_TIMER,30,NULL);
            break;
        
  4. WM_PAINT: で背景画像をスクロールしながら描画します。
    BMP Object Class には背景を描画するためのメンバー関数が用意されています。
    もし該当するメンバー関数が無い時は、BitBlt() 関数の仕様を調べて追加して下さい。
    X方向のオフセットに g_Pos が使われていることに注目して下さい。
        case WM_PAINT:
            hdc= BeginPaint(hWnd,&ps);
            Img->Show(0,0,640,480,g_Pos,0);
            EndPaint(hWnd, &ps);
            break;
        
    ソースコード説明
    Show() 画像をスクロールするメンバー関数
    0,0 描画する左上座標
    640 描画の幅
    480 描画の高さ
    g_Pos X方向のオフセット
    0 Y方向のオフセット
  5. WM_TIMER: で背景画像のオフセットを右にずらして行きます。
    オフセットが画像の中央にくると先頭に戻します。このとき背景が連続しているように画像を作成して下さい。
    画面をクリアするとチラツクことがあるので、InvalidateRect() の最後の引数は FALSE にして下さい。
        case WM_TIMER:
            g_Pos= (g_Pos+1)%640;
            InvalidateRect(hWnd,NULL,FALSE);    //クリアしない
            break;
        
  6. WM_DESTROY: ではタイマを止めて Object を開放して下さい。
        case WM_DESTROY:
            KillTimer(hWnd,ID_TIMER);
            SAFE_DELETE(Img);
            PostQuitMessage(0);
            return 0L;
        
  7. Windows 10 でも W32 Image Scroll 背景画像をスクロールしています。

【演習】

  1. プログラムを完成させて下さい。
  2. フルスクリーンモードで実行して下さい。
  3. 現在は背景が左に流れるようにスクロールしています。
    右に流れるようにスクロールして下さい。
  4. 今は横幅が2倍の画像を使っていますが、画面サイズと同じ画像を使って左側と右側に分けて描画する方法もあります。
    画面サイズと同じ画像で下に流れるようにスクロールして下さい。
  5. ステージによって背景画像を切り替える方法も良く使われます。
    例えば、1ステージは平原、2ステージは海上、3ステージは空中、4ステージは宇宙などと切り替えます。
  6. 本格的な背景画像は BG(Back Ground) を使って、画面サイズの何十倍もの大きな画像をスクロールします。
    BG(Back Ground) を使った背景画像のスクロールは、また改めて説明しましょう。

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