キーの操作でキャラクタを動かす



キーの操作で「前後左右」にアニメーションしながらキャラクタを動かします。

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

プログラムの説明

  1. RPG ゲームでは「前後左右」に2枚ずつの画像(合計8枚)を交互に切り替えながらキャラクタを動かすことが良くあります。
    ここでは SPRITE Object Class を使ってプログラムを作成します。
    SPRITE Object Class は CARD Object Class に「透明色や回転やオフセット機能」を追加したクラスです。
    CARD Object Class は カードイメージを入力して、一枚のカードを表示する を参照して下さい。
  2. Main() プログラムです。
    sprite.cpp をプロジェクトに追加して sprite.h を include して下さい。
    私有 Library(My.lib) に登録されている Sprite Class を使うこともできます。
    SPRITE *Char が Object Class の定義です。
    g_xp, g_yp がキャラクタを表示する座標です。
    g_n はキャラクタの進行方向を格納する領域です。
    g_chg は二枚の画像を切り替えるフラグです。
        #include    "sprite.h"
        #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
        #define     ID_TIMER    (WM_APP + 0)
    
        SPRITE       *Char= NULL;
        long         g_xp,g_yp;                 //表示する座標
        WORD         g_n= 0;                    //進行方向(0 ~ 3)
        WORD         g_chg= 0;                  //画像切り替えフラグ
        
  3. WM_CREATE: で SPRITE Class をインスタンス化して、画像を入力します。
    タイマを起動してキーの押し下げを検出するタイミングを設定します。
            case WM_CREATE:
                Char= new SPRITE(hWnd);
                Char->Load("chr47.bmp",1,8);
                SetTimer(hWnd,ID_TIMER,100,NULL);
                g_xp=g_yp= 100;
                break;
        
  4. WM_PAINT: では進行方向の画像と座標を指定して Char->Show() でキャラクタを描画します。
    g_n*2+g_chg が Sprite の番号で、g_chg^=1; で交互に「0と1」を切り替えます。
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                Char->Show(g_n*2+g_chg,g_xp,g_yp);
                g_chg^= 1;
                EndPaint(hWnd, &ps);
                break;
        
  5. WM_TIMER: でキーの押し下げを検出して進行方向とキャラクタの座標を設定します。
    キーが操作されたとき InvalidateRect() で WM_PAINT をポストします。
            case WM_TIMER:
                mov= 0;
                if (GetAsyncKeyState(VK_ESCAPE)<0)
                {   PostMessage(hWnd,WM_CLOSE,0,0);   return 0L;  }
                if (GetAsyncKeyState(VK_UP)<0)
                {   g_n=0;  g_yp-= 4;  mov= 1;  }
                if (GetAsyncKeyState(VK_RIGHT)<0)
                {   g_n=1;  g_xp+= 4; mov= 1;  }
                if (GetAsyncKeyState(VK_DOWN)<0)
                {   g_n=2;  g_yp+= 4;  mov= 1;  }
                if (GetAsyncKeyState(VK_LEFT)<0)
                {   g_n=3;  g_xp-= 4; mov= 1;  }
                if (mov)    InvalidateRect(hWnd,NULL,TRUE);
                break;
        
  6. WM_CLOSE: でタイマを停止して、Object を開放して下さい。
            case WM_CLOSE:
                KillTimer(hWnd,ID_TIMER);
                SAFE_DELETE(Char);
                DestroyWindow(hWnd);
                break;
        

【演習】

  1. Sprite Object Class または、これに代わる Object Class を作成してプログラムを完成させて下さい。
  2. 画面の背景をグレイに設定して、透明色で描画されていることを確かめて下さい。

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