第10章 背景表示の様々なテクニック

10-3 キャラクタの動きにあわせて一枚絵をスクロールさせる

背景スクロールを応用し、キャラクタが移動すると背景がスクロールさせることを考える。
キャラクタは左右のカーソルを押しても動かないようにし、代わりに背景をスクロールさせることにより、移動しているように見せる。

キャラクタの動きにあわせたスクロールの考え方

【背景描画処理】

カーソルキーの右を押せば左に、左を押せば右に背景が流れるようにするため、スクロール幅を増やす処理をはずす。

【キャラクタ移動処理】

カーソルキーの右を押したらスクロール幅を−1し、左を押したら+1する。

プログラム例(Game.cpp)

【初期化処理】

//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: スタート処理初期化
//-----------------------------------------------------------------------------
void GameInit(HWND hWnd)
{
    //------------------------------------------------------- 各変数の初期化
    /* 背景スクロール */
    Back_X = 0;
    /* 自キャラ(カーソルキーで移動) */
    StatusInit(&MyChara, 0, 0, 40, 40, 310, 230, 4, 4);
    /* ゴキブリ(動かない) */
    StatusInit(&Goki, 64, 394, 96, 426, 400, 300, 0, 0);

    //------------------------------------------------------- フレームナンバーセット
    g_FrameNo = GAME_FRAME;

}

※10-2と同じ

【背景描画処理】

//-----------------------------------------------------------------------------
// 関数名 : BackDraw()
// 機能概要: 背景描画処理
//-----------------------------------------------------------------------------
static void BackDraw(void)
{
    HRESULT      hRet;
    RECT         rcBack;

    /* 1枚目を描画 */
    SetRect(&rcBack, Back_X, 0, 640, 480); // 左側に表示する画像の矩形をセット
    hRet = g_pDDSBack->BltFast(0, 0, g_pDDSGame, &rcBack, DDBLTFAST_NOCOLORKEY);
    if (hRet != DD_OK)
        return;

    /* 2枚目を描画 */
    if (Back_X > 0)
    {
        SetRect(&rcBack, 0, 0, Back_X, 480); // 右側に表示する画像の矩形をセット
        hRet = g_pDDSBack->BltFast((640 - Back_X), 0, g_pDDSGame, &rcBack, DDBLTFAST_NOCOLORKEY);
        if (hRet != DD_OK)
            return;
    }

}

※背景の移動処理を削除した

【キャラクタ移動処理】

//-----------------------------------------------------------------------------
// 関数名 : CharMove()
// 機能概要: キャラクタ移動処理
//-----------------------------------------------------------------------------
static void CharMove(void)
{
    /* 天使の移動 */
    if (KeyTbl[VK_LEFT] & 0x80)
    {
        Back_X--;
        if (Back_X <= 0)
            Back_X = 640;
    }
    if (KeyTbl[VK_RIGHT] & 0x80)
    {
        Back_X++;
        if (Back_X >= 640)
            Back_X = 0;
    }
    if (KeyTbl[VK_UP] & 0x80)
        MyChara.y -= MyChara.move_y;
    if (KeyTbl[VK_DOWN] & 0x80)
        MyChara.y += MyChara.move_y;

}

※スクロール幅の増減を行う処理を追加した
※キャラクタは真ん中から動かない(上下は可)

10章3練習問題1(必須)

第10章2のプログラムを改造する。上記修正を行い、キャラクタの左右の移動に背景が流れることを確認しなさい。

[ 実行結果サンプル ]

10章3練習問題2(自由)

練習問題1のプログラムを修正する。左右の幅100ピクセルまでは通常の移動を行い、それ以降は背景がスクロールするように改造しなさい。

[ 実行結果サンプル ]


[ TOP ] [ NEXT ]