★プレイヤーキャラクター アニメーション★


今回のキャラクター画像は1つの方向につき、2枚のアニメーションが用意されています。

この2つの絵を交互に転送する事で、キャラクターがうごいているように見せます。


変数の用意


「Player.h」を開き、アニメーション切り替え用の変数を追加します。

private:

    const int WIDTH;
    const int HEIGHT;

    const int SPEED_NORMAL;
    const int SPEED_HIGH;

    int m_x;
    int m_y;

    int m_speed;

    enum {
        UP = 0,
        RIGHT = 32,
        DOWN = 64,
        LEFT = 96,
    };

    int m_direction;

    int m_animation;

    RECT m_sour;
    RECT m_dest;

「Player.cpp」の「Initialize関数」で初期値を設定します。

void Player::Initialize()
{
    m_x = 0;
    m_y = 0;

    m_speed = SPEED_NORMAL;

    m_direction = DOWN;

    m_animation = 0;
}

変数の切り替え


この変数をどのように使うかがポイントになります。

アニメーションの切り替えは「転送元のX座標」の切り替えです。

左の画像は「転送元X座標が0」であり、右の画像は「転送元X座標が32」です。

「0」と「32」を切り替えて転送するようにすれば上手くいきそうです。

ただし、前回と同じように「32」は画像の幅ですから、仕様変更を考慮した形で作っていきます。


「Player.h」を開き、アニメーションを切り替えるためのprivateメンバ関数を追加します。

    //移動
    void Move(Engine *pEngine);

    //スピードアップ
    void SpeedUp(Engine *pEngine);

    //アニメーションの変更
    void ChangeAnimation();
};

「Player.cpp」を開き、「SpeedUp関数」の下に「ChangeAnimation関数」の本体を追加します。

void Player::ChangeAnimation()
{
    if (m_animation == 0) {
        m_animation = 1;
    }
    else {
        m_animation = 0;
    }
}

アニメーション切り替え用変数を「0」「1」と切り替える関数です。


この変数の数値を元に「転送元座標」を変更します。

「Draw関数」を変更しましょう。

void Player::Draw(Engine *pEngine)
{
    SetRect(&m_sour,
        m_animation * WIDTH,
        m_direction * HEIGHT,
        m_animation * WIDTH + WIDTH,
        m_direction * HEIGHT + HEIGHT);

    SetRect(&m_dest, 
        m_x, 
        m_y, 
        m_x + WIDTH,
        m_y + HEIGHT);
    
    pEngine->Blt(&m_dest, TEXTURE_CHARACTER, &m_sour);
}

m_animationの値に画像の幅を掛ける事で転送元座標を計算しています。


最後に「ChangeAnimation関数」を「Update関数」から呼び出しましょう。

void Player::Update(Engine *pEngine)
{
    Move(pEngine);

    SpeedUp(pEngine);

    ChangeAnimation();
}

実行してみてください。

上の静止画からは分かりませんが、小刻みに震えているように見えるはずです。


時間の計測


これは、ものすごい速さでアニメーションを切り替えている事が原因で発生している不具合です。

実際に体感する事は難しいですが、ゲームの画面はものすごい速さで切り替わっています。

最大で1秒間に60回も画面を更新しています。

※60FPSとも言います(60フレーム/秒)。

画面が更新される都度アニメーションを切り替えると早すぎて何をしているか分からなくなります。

そこで、以前使った時間の計測を追加しましょう。

「Player.h」にIntervalManageクラスを追加します。

private:

    const int WIDTH;
    const int HEIGHT;

    const int SPEED_NORMAL;
    const int SPEED_HIGH;

    int m_x;
    int m_y;

    int m_speed;

    enum {
        UP = 0,
        RIGHT = 32,
        DOWN = 64,
        LEFT = 96,
    };

    int m_direction;

    int m_animation;

    IntervalManage m_imAnimation;

    RECT m_sour;
    RECT m_dest;

「Player.cpp」を開き、「Initialize関数」で初期値を設定します。

void Player::Initialize()
{
    m_x = 0;
    m_y = 0;

    m_speed = SPEED_NORMAL;

    m_direction = DOWN;

    m_animation = 0;

    m_imAnimation.SetInterval(500);
}

500ミリ秒経過するのを計る、と言う設定です。


「ChangeAnimation関数」にタイミングを調べるコードを追加します。

void Player::ChangeAnimation()
{
    if (m_imAnimation.GetTiming()) {
    
        if (m_animation == 0) {
            m_animation = 1;
        }
        else {
            m_animation = 0;
        }
    }
}

実行してみましょう。

500ミリ秒(0.5秒)に1回アニメーションが切り替われば成功です。

※静止画からは分からないので、画像は載せません。


次回は移動の制限について説明します。


次へ

戻る

目次へ