C++のクラスについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クールアイス
記事: 34
登録日時: 12年前

C++のクラスについて

#1

投稿記事 by クールアイス » 12年前

こんばんは。
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 ;					// ソフトの終了
}

あと、先日ここに登録したのですが、毎回自分の環境とか技術力を書いたほうがいいでしょうか?

クールアイス
記事: 34
登録日時: 12年前

Re: C++のクラスについて

#2

投稿記事 by クールアイス » 12年前

試しに構造体で以下のように書き直してみたところ、異常は見られませんでした。
先ほどのものは配列のループで毎回関数を呼び出しているのが原因なのかな?と思うのですが、上手く書き方が分かりません。
どのように書けばクラスを用いた状態でも解決するでしょうか。

また、あくまでもクラスの練習なので、出来るなら構造体でいいじゃないか、と思われる方はご了承してください。

コード:

#include"DxLib.h"
#include"Const.h"
#include"key.h"
#include"player.h"



//	プレイヤーショットクラス
struct PlayerShot_t
{
	int img;	//	画像
	int flag;	//	フラグ
	double x,y;	//	座標
	double sp;	//	移動速度
};

CPlayer player;								//	プレイヤー
PlayerShot_t playerShot[PLAYER_SHOT_MAX];	//	プレイヤーショット

//----------------------------------------------
//	プレイヤーショット読み込み
//----------------------------------------------
void PlayerShotLoad()
{
	for(int i = 0; i < PLAYER_SHOT_MAX; ++i)
	{
		//	プレイヤーショット画像
		playerShot[i].img = LoadGraph("画像/p_bullet.png");
	}
}

//----------------------------------------------
//	プレイヤーショット初期化
//----------------------------------------------
void PlayerShotInitialize()
{
	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 PlayerShotDraw()
{
	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 PlayerShotMove()
{
	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 PlayerShotEnter()
{
	//	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);	//	裏画面設定
	//===========================================================================
	
	PlayerShotLoad();		//	プレイヤーショット読み込み
	PlayerShotInitialize();	//	プレイヤーショット初期化
	player.Load();			//	プレイヤー読み込み
	player.Initialize();	//	プレイヤー初期化

	//===========================================================================
	//	メインループ
	//===========================================================================
    while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0)
	{
		CKey::UpdateKey();									//	キー処理
		if(CKey::KeyState(KEY_INPUT_ESCAPE) == 1)	break;	//	エスケープで終了
		
		PlayerShotEnter();	//	プレイヤーショットデータ登録
		PlayerShotMove();	//	プレイヤーショット移動
		PlayerShotDraw();	//	プレイヤーショット描画

		player.Move();		//	プレイヤー移動
		player.Draw();		//	プレイヤー描画

		//	デバッグ用
		DrawFormatString(0,0,GetColor(255,255,255),"player.x = %f",player.x);	
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;					// ソフトの終了
}

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: C++のクラスについて

#3

投稿記事 by へにっくす » 12年前

クールアイス さんが書きました:以下の通りに作っているのですが、弾の速度が弾の最大数が増えるにつれどんどん早くなってしまうのです。
おそらくクラスの管理がおかしいのだと思いますが、どうにもわかりません。
そりゃそうでしょ
自分のクラスで

コード:

//----------------------------------------------
//  プレイヤーショット移動
//----------------------------------------------
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;//   フラグ初期化
        }
    }
}
こうやっときながら

コード:

    //===========================================================================
    //  メインループ
    //===========================================================================
    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);   
    }
ここでまたplayerShotの配列ぶんやってるんだから。。
そもそもクラスの中でグローバル変数使っているのが間違いです。
上記のMoveメソッドはこうなるはず。
他、Load、Initialize、Draw、Enterも同様です。

コード:

//----------------------------------------------
//  プレイヤーショット移動
//----------------------------------------------
void CPlayerShot::Move()
{
    //  フラグが立っていたら
    if(flag == 1)
    {
        //  上へ
        y -= sp;

        //  画面外
        if(y < (0 - PLAYER_SHOT_SIZE / 2))
            flag = 0;//   フラグ初期化
    }
}
written by へにっくす

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++のクラスについて

#4

投稿記事 by softya(ソフト屋) » 12年前

クラスとメンバ変数は一体のものと言う理解が出来ていないと思われます。
へにっくすさんの指摘された通り、グローバル変数を使っている所とか、クラスのインスタンスとか理解不足の所が多数見受けられますね。
クラスのインスタンスはWinMainで定義してみては? そうすれば不用意な処理はコンパイルエラーしますので問題が明確になります。

あと気になるところ。
・PLAYER_SHOT_MAXは#defineされてませんか? C++では避けたほうが良いと思います。
・CPlayerShotのメンバ変数をpublicにしないでください。privateにしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

クールアイス
記事: 34
登録日時: 12年前

Re: C++のクラスについて

#5

投稿記事 by クールアイス » 12年前

>>へにっくすさん

ご指摘ありがとうございます。自分で書いときながら、確かにこれは変だなと思っていましたが、やはり間違いでしたか・・・。

ご指摘のあった所は修正しました。

>> softya(ソフト屋) さん

ご指摘ありがとうございます。そうですね、まだまだクラスの理解が足りないようで、参考書などを解きながらもっと勉強していこうと思います。

クラスのインスタンスというのは、私のこのプログラムの場合

コード:

CPlayer player;								//	プレイヤー
CPlayerShot playerShot[PLAYER_SHOT_MAX];	//	プレイヤーショット
これのことという認識で合っているでしょうか?

>>・PLAYER_SHOT_MAXは#defineされてませんか? C++では避けたほうが良いと思います。
const int で定義しています。

>>・CPlayerShotのメンバ変数をpublicにしないでください。privateにしましょう。
修正いたしました。


以下のように修正しましたが、
error C2065: 'player' : 定義されていない識別子です。
error C2228: '.x' の左側はクラス、構造体、共用体でなければなりません
error C2065: 'player' : 定義されていない識別子です。
'.y' の左側はクラス、構造体、共用体でなければなりません

とエラーが出ました。

ということはCplayerの宣言位置がおかしいか、CPLayerShotの関数がおかしいのか、どちらかなのでしょうか。

コード:

#include"DxLib.h"
#include"Const.h"
#include"key.h"
#include"player.h"


//	プレイヤーショットクラス
class CPlayerShot
{
private:
	int img;	//	画像
	int flag;	//	フラグ
	double x,y;	//	座標
	double sp;	//	移動速度

public:
	void Load();		//	読み込み
	void Initialize();	//	初期化
	void Move();		//	移動
	void Draw();		//	描画
	void Enter();		//	データ登録
};

//----------------------------------------------
//	プレイヤーショット読み込み
//----------------------------------------------
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()
{
	//	Zキーが押された
	if(CKey::KeyState(KEY_INPUT_Z) == 1)
	{
		//	フラグが立っていなかったら
		if(flag == 0)
		{
			flag = 1;		//	フラグを立てる
			x = player.x;	//	プレイヤーの座標xに合わせる
			y = player.y;	//	プレイヤーの座標yに合わせる
		}
	}
}

//	プロトタイプ宣言=========================================================
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();	//	プレイヤーショットデータ登録
			playerShot[i].Move();	//	プレイヤーショット移動
			playerShot[i].Draw();	//	プレイヤーショット描画
		}

		//	デバッグ用
		DrawFormatString(0,0,GetColor(255,255,255),"player.x = %f",player.x);		
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;					// ソフトの終了
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++のクラスについて

#6

投稿記事 by softya(ソフト屋) » 12年前

CPlayerShot::Enter()で参照しているPlayerの情報はPlayerクラスのインスタンスがグローバルである前提で作られています。
Playerクラスのメンバ変数xが直接参照可能であるのも問題ですね。Playerクラスと言う存在に依存している事になります。
Playerクラスのx,yをまずprivateにしてPlayerクラスに座標を取得するメンバ関数を追加して、CPlayerShot::Enter()の引数に座標だけ渡せば良いと思いますが如何でしょうか?
CPlayerShot::Enter(int x,int y);って事ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

クールアイス
記事: 34
登録日時: 12年前

Re: C++のクラスについて

#7

投稿記事 by クールアイス » 12年前

>> softya(ソフト屋) さん

CPlayerの事をすっかり忘れていました・・・。こちらもprivateにし、外部からは見えないように修正しました。

問題のCPlayerShot::Enter()については、CPlayerクラスに「GetPosX()」「GetPosY()」というメンバ関数を追加し、double型のプレイヤー座標を返すことでどうにか成功しました。以下が修正された後のコードです。

player.h

コード:

#pragma once

//	プレイヤークラス
class CPlayer
{
private:
	double x,y;	//	座標
	double sp;	//	移動速度
	int img;	//	画像

public:
	void Load();		//	読み込み
	void Initialize();	//	初期化
	void Move();		//	移動
	void Draw();		//	描画
	double GetPosX();	//	座標取得x
	double GetPosY();	//	座標取得x
};	
player.cpp

コード:

#include"DxLib.h"
#include"Const.h"
#include"key.h"
#include"player.h"

//----------------------------------------------
//	プレイヤー読み込み
//----------------------------------------------
void CPlayer::Load()
{
	//	プレイヤー画像
	img = LoadGraph("画像/player.png");
}

//----------------------------------------------
//	プレイヤー初期化
//----------------------------------------------
void CPlayer::Initialize()
{	
	x = 300.0;	//	座標x
	y = 400.0;	//	座標y
	sp = 5.0;	//	移動速度
}

//----------------------------------------------
//	プレイヤー移動
//----------------------------------------------
void CPlayer::Move()
{	
	//	移動範囲内なら
	if(x >= (0 + PLAYER_SIZE / 2) && x <= (WINDOW_WIDTH - PLAYER_SIZE / 2))
	{
		//	左キー
		if(CKey::KeyState(KEY_INPUT_LEFT) != 0)
			x -= sp;//	左へ

		//	右キー
		if(CKey::KeyState(KEY_INPUT_RIGHT) != 0)
			x += sp;//	右へ
	}

	//	画面端補正
	if(x <= (0 + PLAYER_SIZE / 2)) x = (0 + PLAYER_SIZE / 2);						//	左端
	if(x >= (WINDOW_WIDTH - PLAYER_SIZE / 2)) x = (WINDOW_WIDTH - PLAYER_SIZE / 2);	//	右端
}

//----------------------------------------------
//	プレイヤー描画
//----------------------------------------------
void CPlayer::Draw()
{
	//	プレイヤー(座標は画像の中心)
	DrawRotaGraphF(x, y, 1.0f, 0.0f, img, true);
}

//----------------------------------------------
//	プレイヤー座標x取得
//----------------------------------------------
double CPlayer::GetPosX()
{
	return x;
}

//----------------------------------------------
//	プレイヤー座標y取得
//----------------------------------------------
double CPlayer::GetPosY()
{
	return y;
}

main.cpp

コード:

#include"DxLib.h"
#include"Const.h"
#include"key.h"
#include"player.h"


//	プレイヤーショットクラス
class CPlayerShot
{
private:
	int img;	//	画像
	int flag;	//	フラグ
	double x,y;	//	座標
	double sp;	//	移動速度

public:
	void Load();		//	読み込み
	void Initialize();	//	初期化
	void Move();		//	移動
	void Draw();		//	描画
	void Enter(double x, double y);		//	データ登録
};

//----------------------------------------------
//	プレイヤーショット読み込み
//----------------------------------------------
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;	//	プレイヤーの座標yに合わせる
		}
	}
}

//	プロトタイプ宣言=========================================================
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 ;					// ソフトの終了
}
弾が全部1度に発射されるというバグを発見しましたが、これから頑張って修正していこうと思います。

ご指摘くださった皆様、本当にありがとうございました。

クールアイス
記事: 34
登録日時: 12年前

Re: C++のクラスについて

#8

投稿記事 by クールアイス » 12年前

解決にするのを忘れていました・・・。何度も申し訳ありません。

閉鎖

“C言語何でも質問掲示板” へ戻る