★敵キャラクター アニメーションと敵種の変更★


続いてプレイヤーキャラクターと同じようにアニメーションを設定します。

基本的にはプレイヤーキャラクターと同じですから、サクサク進めましょう。


アニメーション


「Enemy.h」を開き、必要なメンバ関数と変数を追加します。

class Enemy : public Base {
public:

    Enemy();

    void Initialize();

    void Update();

    void Draw(Engine *pEngine);

private:

    IntervalManage m_imAnimation;

    int m_animation;

    void ChangeAnimation();
};

「Enemy.cpp」を開き、「Initialize関数」の下に「Update関数」を追加します。

void Enemy::Update()
{
    ChangeAnimation();
}

とりあえずは「ChangeAnimation関数」を呼び出すだけです。


「Initialize関数」でアニメーションの初期設定を行います。

void Enemy::Initialize()
{
    m_x = 576;
    m_y = 256;

    m_direction = LEFT;

    m_imAnimation.SetInterval(500);

    m_animation = 0;
}

0.5秒に1回アニメーションを切り替えるよう設定しました。


続いて「Draw関数」の下に「ChangeAnimation関数」を追加します。

void Enemy::ChangeAnimation()
{
    if (m_imAnimation.GetTiming()) {

        if (m_animation == 0) {
            m_animation = 1;
        }
        else {
            m_animation = 0;
        }
    }
}

プレイヤーキャラクターと同じ内容です。


最後に「Draw関数」の転送元座標を変更します。

void Enemy::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_ENEMY, &m_sour);
}

「SceneGame.cpp」を開き、「Update関数」から敵クラスの「Update関数」を呼び出します。

void SceneGame::Update()
{
    m_player.Update(m_pEngine, m_shot);

    m_shot.Update();

    m_enemy.Update();
}

実行してみましょう。

静止画では分かりませんが、敵キャラクターもアニメーションをしていればOKです。


敵種の変更


敵キャラクターのグラフィックは↓の通り8種類用意されています。

現在は一番左のキャラクターを表示させていますが、他のキャラクターを表示させたい場合は転送元のX座標を変更する必要があります。

キャラクターの幅は「32ピクセル」ですから、左から2番目のスケルトンを表示しようと思うと、転送元X座標は「64」になります。

「64ピクセル」単位で種類が変わりますから、これまでの知識を使ってプログラムを作りましょう。


「Enemy.h」を開き、敵の種類を格納する変数と種類の最大数を設定する定数を追加しましょう。

private:

    const int KIND_MAX;

    int m_kind;

    IntervalManage m_imAnimation;

    int m_animation;

    void ChangeAnimation();
};

「Enemy.cpp」を開き、コンストラクタ関数で定数の初期値を設定します。

Enemy::Enemy()
    : KIND_MAX(8)
    , Base(32, 32)
{

}

次に「Initialize関数」で変数の初期値を設定しましょう。

void Enemy::Initialize()
{
    m_x = 576;
    m_y = 256;

    m_direction = LEFT;

    m_imAnimation.SetInterval(500);

    m_animation = 0;

    m_kind = 0;
}

敵の種類の初期値は「0」にしていますので、一番左のキャラクターを表示すると言う意味になります。

この数値を変更する事で表示するキャラクターを変えようと思います。


上の方で「64ピクセル」ごとに敵のグラフィックが変わると書きました。

これは敵キャラクターの幅が「32ピクセル」だと言う事が元になっています。

キャラクターの幅は「WIDTH」と言う定数が用意されていますので、計算するときにも定数を使って計算しましょう。


現在の「Draw関数」を見てみましょう。

SetRect(&m_sour,
    m_animation * WIDTH,
    m_direction * HEIGHT,
    m_animation * WIDTH + WIDTH,
    m_direction * HEIGHT + HEIGHT);

転送元だけ抜き出しました。

青文字の部分が「転送元の左座標」を表す部分です。

「m_animation」は「ChangeAnimation関数」で「0」「1」と切り替わっています。

定数「WIDTH」を掛けていますので「0」「32」と切り替わっています。

実際の座標として考えると、一番左のスライムのようなキャラクターのアニメーションが切り替わるようになっています。

ここに「64」を加えると、

SetRect(&m_sour,
    64 + m_animation * WIDTH,
    m_direction * HEIGHT,
    64 + m_animation * WIDTH + WIDTH,
    m_direction * HEIGHT + HEIGHT);

座標的には「64」「96」と切り替わるようになりますので、スケルトンのアニメーションが表示されます。


とりあえず、これで実行してみましょう。

スケルトンが表示されています。


「64」のままではスケルトンしか表示出来ませんから変数に変えます。

SetRect(&m_sour,
    m_kind + m_animation * WIDTH,
    m_direction * HEIGHT,
    m_kind + m_animation * WIDTH + WIDTH,
    m_direction * HEIGHT + HEIGHT);

これで「m_kind」の初期値を「64」や「128」と変える事で表示する敵キャラクターを変更する事が出来そうです。

しかし、上にも書いたようにこの数字は敵キャラクターの幅「32ピクセル」が元になっています。

そこで、次のように変更します。

SetRect(&m_sour,
    m_kind * WIDTH * 2 + m_animation * WIDTH,
    m_direction * HEIGHT,
    m_kind * WIDTH * 2 + m_animation * WIDTH + WIDTH,
    m_direction * HEIGHT + HEIGHT);

変数「m_kind」に「幅の2倍(64)」を掛ける事にしました。

こうする事で「m_kind」が「1」であれば「64」に、「2」であれば「128」に変化します。


「Initialize関数」で「m_kind」の初期値を「2」にして実行してみましょう。

左から3番目のキャラクターが表示されました。


乱数を使う


全部で8種類のキャラクターが用意されていますから、乱数を使って初期値を決めたいと思います。

void Enemy::Initialize()
{
    m_x = 576;
    m_y = 256;

    m_direction = LEFT;

    m_imAnimation.SetInterval(500);

    m_animation = 0;

    m_kind = rand() % KIND_MAX;
}

実行する度にキャラクターが変わればOKです。


次回は「当たり判定」を説明します。


次へ

戻る

目次へ