前回は弾を「右方向」に動かすプログラムを作りました。
しかし、プレイヤーキャラクターは上下左右を向く事が出来るため「左方向を向いて右へ弾を撃つ」など違和感があります。
ちゃんとプレイヤーキャラクターが向いている方向に弾が撃てるよう改良しましょう。
弾を上下左右に移動させるには、「どちらを向いて発射したか」と言う情報が必要です。
プレイヤーキャラクターが弾を発射した瞬間の方向を「Shotクラス」に伝え、「Shotクラス」はそのデータを元に移動方向を決定しなければなりません。
方向を表す定数は、「Playerクラス」のprivateに列挙体として用意されています。
この列挙体を「Shotクラス」でも使えるよう、publicに移動させましょう。
「Player.h」を開き、方向用列挙体をpublicに移動してください。
class Player { public: enum { UP, RIGHT, DOWN, LEFT, }; Player(); //初期化 void Initialize(); |
プレイヤーキャラクターの方向を受け取れるよう、「Shotクラス」に方向用の変数を追加しましょう。
「Shot.h」を開き、privateメンバ変数を追加します。
private:
const int SPEED;
bool m_bShooting;
int m_x;
int m_y;
int m_direction;
RECT m_sour;
RECT m_dest;
|
この変数の初期値は、弾が発射された瞬間に決まりますから「Shoot関数」に引数を追加しなければなりません。
「Shot.h」を開き「Shoot関数」に引数を追加します。
//初期化 void Initialize(); //発射 void Shoot(const int x, const int y, const int direction); //更新 void Update(); |
「Shot.cpp」を開き、「Shoot関数」本体にも引数を追加します。
また、受け取った引数をメンバ変数に格納するコードも加えておきましょう。
void Shot::Shoot(const int x, const int y, const int direction) { if (!m_bShooting) { m_x = x; m_y = y; m_bShooting = true; m_direction = direction; } } |
上の関数は「Player.cpp」の「Shoot関数」から呼び出されますので、そちらも変更しなければなりません。
void Player::Shoot(Engine *pEngine, Shot &refShot)
{
if (pEngine->GetKeyState(DIK_Z)) {
int adjustX = (WIDTH - refShot.WIDTH) / 2;
int adjustY = (HEIGHT - refShot.HEIGHT) / 2;
refShot.Shoot(m_x + adjustX, m_y + adjustY, m_direction);
}
}
|
プレイヤーキャラクターが弾を発射する時に、座標とともに方向も渡せるようになりました。
発射した瞬間の方向を受け取る事が出来ましたので、その方向へ弾を移動させましょう。
まず「Shot.cpp」の「Move関数」を確認してください。
void Shot::Move() { if (m_bShooting) { m_x += SPEED; if (m_x >= WindowSetting::WINDOW_WIDTH) { m_bShooting = false; } } } |
これは「右方向」へ移動し、画面外に出たら「発射中フラグ」をOFFにするプログラムです。
方向を考慮するよう変更しなければなりませんので、メンバ変数「m_direction」を調べるコードが必要です。
switch文を使って移動する方向を分けてみます。
void Shot::Move() { if (m_bShooting) { switch (m_direction) { case Player::UP: m_y -= SPEED; break; case Player::RIGHT: m_x += SPEED; break; case Player::DOWN: m_y += SPEED; break; case Player::LEFT: m_x -= SPEED; break; } if (m_x >= WindowSetting::WINDOW_WIDTH) { m_bShooting = false; } } } |
方向を表す定数は「Playerクラス」のpublicに用意してあります。
それぞれの方向に応じた座標の増減を行う事により、それぞれの方向へ弾が移動します。
一度実行してみましょう。
上下左右に発射出来るようになっていますが、「右以外」は1発しか撃てません。
原因は↓にあります。
if (m_x >= WindowSetting::WINDOW_WIDTH) { m_bShooting = false; } |
画面外をチェックするプログラムですが、「右方向」しかチェックしていません。
上も、左も、下もチェック出来るようにしなければなりませんので、次のように変更してみましょう。
if (m_x >= WindowSetting::WINDOW_WIDTH || m_x <= -WIDTH || m_y >= WindowSetting::WINDOW_HEIGHT || m_y <= -HEIGHT) { m_bShooting = false; } |
右左下上の順ですが4方向全てを調べ、画面外に出たら「発射中フラグ」をOFFにします。
実行してみましょう。
上下左右に発射して、どの方向から画面外に出ても次の弾が撃てるようになっていればOKです。
※静止画では分かりませんので、画像は割愛します。
次回は敵となるキャラクターを用意してみましょう。