前回は弾を「右方向」に動かすプログラムを作りました。
しかし、プレイヤーキャラクターは上下左右を向く事が出来るため「左方向を向いて右へ弾を撃つ」など違和感があります。
ちゃんとプレイヤーキャラクターが向いている方向に弾が撃てるよう改良しましょう。
弾を上下左右に移動させるには、「どちらを向いて発射したか」と言う情報が必要です。
プレイヤーキャラクターが弾を発射した瞬間の方向を「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です。
※静止画では分かりませんので、画像は割愛します。
次回は敵となるキャラクターを用意してみましょう。