C++とシューティングの練習にとインベーダーゲームを作ろうとしています。
しかし、自機を表示、移動はすぐに出来たのですが、自機の弾が異常な動きをしてしまいます。
以下の通りに作っているのですが、弾の速度が弾の最大数が増えるにつれどんどん早くなってしまうのです。
おそらくクラスの管理がおかしいのだと思いますが、どうにもわかりません。
どこが間違っているのか教えていただけないでしょうか。
必要であれば他の.cppや.hも書きます。
#include"DxLib.h"
#include"Const.h"
#include"key.h"
#include"player.h"
// プレイヤーショットクラス
class CPlayerShot
{
public:
int img; // 画像
int flag; // フラグ
double x,y; // 座標
double sp; // 移動速度
public:
void Load(); // 読み込み
void Initialize(); // 初期化
void Move(); // 移動
void Draw(); // 描画
void Enter(); // データ登録
};
CPlayer player; // プレイヤー
CPlayerShot playerShot[PLAYER_SHOT_MAX]; // プレイヤーショット
//----------------------------------------------
// プレイヤーショット読み込み
//----------------------------------------------
void CPlayerShot::Load()
{
for(int i = 0; i < PLAYER_SHOT_MAX; ++i)
{
// プレイヤーショット画像
playerShot[i].img = LoadGraph("画像/p_bullet.png");
}
}
//----------------------------------------------
// プレイヤーショット初期化
//----------------------------------------------
void CPlayerShot::Initialize()
{
for(int i = 0; i < PLAYER_SHOT_MAX; ++i)
{
playerShot[i].x = 0.0; // 座標x
playerShot[i].y = 0.0; // 座標y
playerShot[i].flag = 0; // フラグ
playerShot[i].sp = 7.0; // 移動速度
}
}
//----------------------------------------------
// プレイヤーショット描画
//----------------------------------------------
void CPlayerShot::Draw()
{
for(int i = 0; i < PLAYER_SHOT_MAX; ++i)
{
// フラグが立っていたら
if(playerShot[i].flag == 1)
{
// プレイヤーショット(座標は画像の中心)
DrawRotaGraphF(playerShot[i].x, playerShot[i].y, 1.0f, 0.0f, playerShot[i].img, true);
}
}
}
//----------------------------------------------
// プレイヤーショット移動
//----------------------------------------------
void CPlayerShot::Move()
{
for(int i = 0; i < PLAYER_SHOT_MAX; ++i)
{
// フラグが立っていたら
if(playerShot[i].flag == 1)
{
// 上へ
playerShot[i].y -= playerShot[i].sp;
// 画面外
if(playerShot[i].y < (0 - PLAYER_SHOT_SIZE / 2))
playerShot[i].flag = 0;// フラグ初期化
}
}
}
//----------------------------------------------
// プレイヤーショットデータ登録
//----------------------------------------------
void CPlayerShot::Enter()
{
// Zキーが押された
if(CKey::KeyState(KEY_INPUT_Z) == 1)
{
for(int i = 0; i < PLAYER_SHOT_MAX; ++i)
{
// フラグが立っていなかったら
if(playerShot[i].flag == 0)
{
playerShot[i].flag = 1; // フラグを立てる
playerShot[i].x = player.x; // プレイヤーの座標xに合わせる
playerShot[i].y = player.y; // プレイヤーの座標yに合わせる
break;
}
}
}
}
// プロトタイプ宣言=========================================================
void WindowModeCheck(); // ウィンドウモードorフルスクリーンチェック
//===========================================================================
// メイン
//===========================================================================
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
//===========================================================================
// 三大初期化
//===========================================================================
//WindowModeCheck(); // ウィンドウモードorフルスクリーンチェック
ChangeWindowMode(true); // ウィンドウモード
DxLib_Init(); // DXライブラリ初期化
SetDrawScreen(DX_SCREEN_BACK); // 裏画面設定
//===========================================================================
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(); // プレイヤーショットデータ登録
playerShot[i].Move(); // プレイヤーショット移動
playerShot[i].Draw(); // プレイヤーショット描画
}
// デバッグ用
DrawFormatString(0,0,GetColor(255,255,255),"player.x = %f",player.x);
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}