今回は、前回の最後の問題点「弾がまとめて出てしまう」という点についての質問です。
現在、自機の弾であるCPlayerShotクラスを、 のように配列で用意しています。
このクラスは「移動」「描画」「呼び出し」などを含んでいるのですが、どうやらすべてが同じ動作をしてしまいます。
原因として、クラスの設計及びループの回し方に問題があるのではと考えています。
しかしそれ以外に複数の弾を管理する方法が分からず困っています。
以下コードを載せますので、「クラスのここがおかしい」「ループの回し方が変だ」など、ご指摘があったらお願いいたします。
main.cpp
#include"DxLib.h"
#include"Const.h"
#include"key.h"
#include"player.h"
#include"playerShot.h"
// プロトタイプ宣言=========================================================
void WindowModeCheck(); // ウィンドウモードorフルスクリーンチェック
//===========================================================================
// メイン
//===========================================================================
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
//===========================================================================
// 三大初期化
//===========================================================================
//WindowModeCheck(); // ウィンドウモードorフルスクリーンチェック
ChangeWindowMode(true); // ウィンドウモード
DxLib_Init(); // DXライブラリ初期化
SetDrawScreen(DX_SCREEN_BACK); // 裏画面設定
//===========================================================================
CPlayer player; // プレイヤー
CPlayerShot playerShot[PLAYER_SHOT_MAX]; // プレイヤーショット
for(int i = 0; i < PLAYER_SHOT_MAX; ++i)
{
playerShot[i].Load(); // プレイヤーショット読み込み
playerShot[i].Initialize(); // プレイヤーショット初期化
}
player.Load(); // プレイヤー読み込み
player.Initialize();// プレイヤー初期化
//===========================================================================
// メインループ
//===========================================================================
while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0)
{
CKey::UpdateKey(); // キー処理
if(CKey::KeyState(KEY_INPUT_ESCAPE) == 1) break; // エスケープで終了
player.Move(); // プレイヤー移動
player.Draw(); // プレイヤー描画
for(int i = 0; i < PLAYER_SHOT_MAX; ++i)
{
playerShot[i].Enter(player.GetPosX(), player.GetPosY()); // プレイヤーショットデータ登録
playerShot[i].Move(); // プレイヤーショット移動
playerShot[i].Draw(); // プレイヤーショット描画
}
}
DxLib_End();// DXライブラリ終了
return 0; // ソフトの終了
}
#pragma once
// プレイヤーショットクラス
class CPlayerShot
{
private:
int img; // 画像
int flag; // フラグ
double x,y; // 座標
double sp; // 移動速度
public:
void Load(); // 読み込み
void Initialize(); // 初期化
void Move(); // 移動
void Draw(); // 描画
void Enter(double px, double py); // データ登録
};
#include"DxLib.h"
#include"Const.h"
#include"key.h"
#include"playerShot.h"
//----------------------------------------------
// プレイヤーショット読み込み
//----------------------------------------------
void CPlayerShot::Load()
{
// プレイヤーショット画像
img = LoadGraph("画像/p_bullet.png");
}
//----------------------------------------------
// プレイヤーショット初期化
//----------------------------------------------
void CPlayerShot::Initialize()
{
x = 0.0; // 座標x
y = 0.0; // 座標y
flag = 0; // フラグ
sp = 7.0; // 移動速度
}
//----------------------------------------------
// プレイヤーショット描画
//----------------------------------------------
void CPlayerShot::Draw()
{
// フラグが立っていたら
if(flag == 1)
{
// プレイヤーショット(座標は画像の中心)
DrawRotaGraphF(x, y, 1.0f, 0.0f, img, true);
}
}
//----------------------------------------------
// プレイヤーショット移動
//----------------------------------------------
void CPlayerShot::Move()
{
// フラグが立っていたら
if(flag == 1)
{
// 上へ
y -= sp;
// 画面外
if(y < (0 - PLAYER_SHOT_SIZE / 2))
flag = 0;// フラグ初期化
}
}
//----------------------------------------------
// プレイヤーショットデータ登録
//----------------------------------------------
void CPlayerShot::Enter(double px, double py)
{
// Zキーが押された
if(CKey::KeyState(KEY_INPUT_Z) == 1)
{
// フラグが立っていなかったら
if(flag == 0)
{
flag = 1; // フラグを立てる
x = px; // プレイヤーの座標xに合わせる
y = py - PLAYER_SHOT_SIZE; // プレイヤーの座標y(弾サイズ分上)に合わせる
}
}
}