★プレイヤーキャラクター 弾の方向★


前回は弾を「右方向」に動かすプログラムを作りました。

しかし、プレイヤーキャラクターは上下左右を向く事が出来るため「左方向を向いて右へ弾を撃つ」など違和感があります。

ちゃんとプレイヤーキャラクターが向いている方向に弾が撃てるよう改良しましょう。


弾クラスへデータを追加


弾を上下左右に移動させるには、「どちらを向いて発射したか」と言う情報が必要です。

プレイヤーキャラクターが弾を発射した瞬間の方向を「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です。

※静止画では分かりませんので、画像は割愛します。


次回は敵となるキャラクターを用意してみましょう。


次へ

戻る

目次へ