★プレイヤーキャラクター スピード調整★


次はスピードの調整を行ってみます。

現在はインクリメント、デクリメント演算子を使っていますので「1ピクセル」ずつ移動しています。

「1ピクセル」ずつ移動させるよりも「2ピクセル」ずつ移動させた方がスピードが上がります。

やってみましょう。


スピード定数を使う


まずはスピード用の定数を用意します。

「Player.h」を開き、private定数を追加しましょう。

class Player {
public:

    Player();

    //初期化
    void Initialize();

    //更新
    void Update(Engine *pEngine);

    //描画
    void Draw(Engine *pEngine);

private:

    const int WIDTH;
    const int HEIGHT;

    const int SPEED_NORMAL;

    int m_x;
    int m_y;

    RECT m_sour;
    RECT m_dest;

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

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

Player::Player()
    : WIDTH(32)
    , HEIGHT(32)
    , SPEED_NORMAL(2)
{

}

この定数を使って座標の増減を行ってみます。

「Player.cpp」の「Move関数」を次のように変更してみましょう。

void Player::Move(Engine *pEngine)
{
    if (pEngine->GetKeyState(DIK_UP)) {

        m_y -= SPEED_NORMAL;
    }

    if (pEngine->GetKeyState(DIK_RIGHT)) {

        m_x += SPEED_NORMAL;
    }

    if (pEngine->GetKeyState(DIK_DOWN)) {

        m_y += SPEED_NORMAL;
    }

    if (pEngine->GetKeyState(DIK_LEFT)) {

        m_x -= SPEED_NORMAL;
    }
}

実行して、前回よりも早いスピードで移動する事を確認してください。

<実行結果 クライアント領域のみ>


スピード用変数の追加


スピードを定数にしましたので、定数の値を変えればもっと早くする事も出来ます。

ただ、定数ですから値を変える度にコンパイル、ビルドする必要があります。

そこで、スピードを変数にしてみましょう。

「Player.h」を開き、private変数を追加しましょう。

class Player {
public:

    Player();

    //初期化
    void Initialize();

    //更新
    void Update(Engine *pEngine);

    //描画
    void Draw(Engine *pEngine);

private:

    const int WIDTH;
    const int HEIGHT;

    const int SPEED_NORMAL;

    int m_x;
    int m_y;

    int m_speed;

    RECT m_sour;
    RECT m_dest;

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

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

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

    m_speed = SPEED_NORMAL;
}

「Move関数」を↓のように書き換えます。

void Player::Move(Engine *pEngine)
{
    if (pEngine->GetKeyState(DIK_UP)) {

        m_y -= m_speed;
    }

    if (pEngine->GetKeyState(DIK_RIGHT)) {

        m_x += m_speed;
    }

    if (pEngine->GetKeyState(DIK_DOWN)) {

        m_y += m_speed;
    }

    if (pEngine->GetKeyState(DIK_LEFT)) {

        m_x -= m_speed;
    }
}

実行しても特にスピードが変わる訳でも無く、一定のスピードで移動します。


スピードの変更


この変数の値を変更すれば、ゲーム中にスピードを変える事が出来るはずです。

方法は色々とありますが、最初は「何かキーを押すとスピードアップ」する方法を書きます。

「Player.h」を開き、private定数を1つ追加します。

class Player {
public:

    Player();

    //初期化
    void Initialize();

    //更新
    void Update(Engine *pEngine);

    //描画
    void Draw(Engine *pEngine);

private:

    const int WIDTH;
    const int HEIGHT;

    const int SPEED_NORMAL;
    const int SPEED_HIGH;

    int m_x;
    int m_y;

    int m_speed;

    RECT m_sour;
    RECT m_dest;

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

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

Player::Player()
    : WIDTH(32)
    , HEIGHT(32)
    , SPEED_NORMAL(2)
    , SPEED_HIGH(4)
{

}

これで「通常速度(SPEED_NORMAL)」と「高速(SPEED_HIGH)」が用意されました。

スーパーマリオブラザーズの「Bダッシュ」のように、何かキーを押している間はスピードが上がるようにしたいと思います。

まず「Player.h」を開き、privateメンバ関数を追加します。

class Player {
public:

    Player();

    //初期化
    void Initialize();

    //更新
    void Update(Engine *pEngine);

    //描画
    void Draw(Engine *pEngine);

private:

    const int WIDTH;
    const int HEIGHT;

    const int SPEED_NORMAL;
    const int SPEED_HIGH;

    int m_x;
    int m_y;

    int m_speed;

    RECT m_sour;
    RECT m_dest;

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

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

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

void Player::SpeedUp(Engine *pEngine)
{
    if (pEngine->GetKeyState(DIK_B)) {

        m_speed = SPEED_HIGH;
    }
    else {

        m_speed = SPEED_NORMAL;
    }
}

「Bボタン」を押している間は「高速」、話したら「通常速度」に設定する関数です。


最後に、「Player.cpp」の「Update関数」から「SpeedUp関数」を呼び出します。

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

    SpeedUp(pEngine);
}

実行してみましょう。

スクリーンショットからは何も分かりませんので、実行画像は載せません。

「Bキー」を押している間、スピードアップすればOKです。


キーの同時押し


ここで1つ注意点を上げておきます。

このキャラクターは「カーソルキー」で移動します。

「↑→↓←」に移動しますが、2つのキーを同時に押すと斜めに移動します。

「↑→」で右上、「↑←」で左上、「↓→」で右下、「↓←」で左下です。

試してない方は、実行して試してください。

私の環境では、「通常速度」の場合は問題無いのですが「高速」の時に不具合が発生します。

「↑←」キーを押すと左上に移動しますが、同時に「Bキー」を押してもスピードアップしません。

逆に「Bキー」を押しっぱなしにしている時に「↑←」キーを押しても左上に移動しません。

皆さんの環境で発生するかどうかは不明です・・・

なぜこのような事が起こるかと言うと、

 キーボードは3つ以上のキーの同時押しを判断出来ないケースがある

からです。

外部リンクですが、分かりやすいのはここです。

特殊なキーボードで無い限り、上記のような不具合が発生すると言う事です。

私の環境では「↑←B」キーは同時押しを判断してくれません。

別のキーであれば大丈夫なケースもありますので試してみます。

「SpeedUp関数」のキーを変えてみます。

void Player::SpeedUp(Engine *pEngine)
{
    if (pEngine->GetKeyState(DIK_V)) {

        m_speed = SPEED_HIGH;
    }
    else {

        m_speed = SPEED_NORMAL;
    }
}

「Vキー」であれば問題無く全ての方向に高速移動出来ます。

このように、複数のキーを同時押しする必要があるゲームを作る時は注意して作りましょう。


今回はスピード調整について書きました。

他の方法として「アイテムを取得する度にスピードが上がる」などの方法もあります。

スピードを変数にしてあれば色々と工夫が出来ると思いますので、皆さんで試してみてください。


次回は「方向」について説明します。


次へ

戻る

目次へ