次はスピードの調整を行ってみます。
現在はインクリメント、デクリメント演算子を使っていますので「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キー」であれば問題無く全ての方向に高速移動出来ます。
このように、複数のキーを同時押しする必要があるゲームを作る時は注意して作りましょう。
今回はスピード調整について書きました。
他の方法として「アイテムを取得する度にスピードが上がる」などの方法もあります。
スピードを変数にしてあれば色々と工夫が出来ると思いますので、皆さんで試してみてください。
次回は「方向」について説明します。