エラーの原因がわかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
やふう!
記事: 4
登録日時: 10年前

エラーの原因がわかりません

#1

投稿記事 by やふう! » 9年前

初めまして。初投稿です。

私はファンゲーム制作とC++の勉強を兼ねてSTGのプログラムを組んでいました。
しかし、さっきまで実行できていたプログラムが突然、特定のクラスだけ認識しなくなり実行できなくなる状況です。
前にも何度も同様のことがあり、その都度作り直して解決しました。
自前の知識だけでは解決できなかったのでどうか皆様の力をお貸しください。m(__)m


開発環境は Visual Studio 2015 と DxLib です。
Game.hpp の38行目の BossA に赤い波線が引かれます。


問題のコードとエラーの詳細は以下の通りです。


【Game.hpp】

コード:

#pragma once
#include "DxLib.h"

#include "BaseScene.hpp"
#include "ISceneChanger.hpp"

#include "Player.hpp"
#include "Graphic.hpp"
#include "Stage.hpp"
#include "Pshot.hpp"
#include "BossA.hpp"
#include "Score.hpp"

#include <memory>


//ゲーム画面クラス
class Game : public BaseScene
{
public:
	Game::Game(ISceneChanger* changer);
	~Game();

	void Update() override;     // 更新処理をオーバーライド
	void Draw() override;       // 描画処理をオーバーライド
	void GetPlayerPosition(double* x, double* y);
	void GetEnemyPosition(int index, double *x, double *y){}

	static Player& GetStaticPlayer();

private:
	void CopyPlayer();

	std::unique_ptr<Player>		player;
	std::unique_ptr<Graphic>    graphic;
	std::unique_ptr<Stage>      stage;
	std::unique_ptr<Pshot>		pshot;
	std::unique_ptr<BossA>		bossA;
	std::unique_ptr<Score>		score;
	
	static Player sPlayer;

	bool f_pause;
	int	 gh_bomb;
	int  gh_life;
	double mPlayer_x, mPlayer_y;
};
【Game.cpp】

コード:

#include "DxLib.h"

#include "Game.hpp"


static int push_count;
static int count_fol;


Player Game::sPlayer;

Game::Game(ISceneChanger* changer)
	: BaseScene(changer)
	, player(new Player)
	, graphic(new Graphic)
	, stage(new Stage)
	, pshot(new Pshot)
	, bossA(new BossA)
	, score(new Score)
	, f_pause(false)
	, mPlayer_x(0.0)
	, mPlayer_y(0.0)
{
	gh_bomb = LoadGraph("GRAPH/GAME/iBomb2.png");

	// TEST
	push_count = 0;
	count_fol = 0;
}


Game::~Game()
{
	DeleteGraph(gh_bomb);
}


//更新
void Game::Update()
{
	const bool PUSH_PAUSE	= ( Keyboard_Get(KEY_INPUT_Q) == 1 || Keyboard_Get(KEY_INPUT_F1) == 1 );
	const bool PUSH_KEY_P	= ( Keyboard_Get(KEY_INPUT_P) == 1 );
	const bool isReturn		= ( PUSH_KEY_P && f_pause == true );
	 
	// ポーズ
	if (PUSH_PAUSE)	f_pause = !f_pause;

	if (f_pause)
	{
		if(Keyboard_Get(KEY_INPUT_P) == 1)
		{
			mSceneChanger->ChangeScene(eScene_Menu);
		}
	}
	// ---------------------------------------------------
	
	if (f_pause)	return;							// ポーズならスルー
	score->Update();								// スコアデータ更新
	stage->Update();
	bossA->Update();
	player->Update();
	pshot->Update();

	CopyPlayer();

	// TEST
	if (Keyboard_Get(KEY_INPUT_Z) == 1)
	{
		count_fol = push_count;
		push_count = 0;
	}
	push_count++;
}


//描画
void Game::Draw()
{
	// -------------------------------------------------------------------------------------------------------
	stage->Draw();
	bossA->Draw();
	player->Draw();
	pshot->Draw();

	// Stage.cpp にこの処理を書いた方が良い
	if (!player->ShowIsStart())
	{
		const int    X_MSG = 290, Y_MSG = 240, SPACE_MSG = 16;
		const double EXRATE_MSG = 2.0;
		const bool   isSTAGE_1 = stage->nowStage == eStage::stage1;


		if (isSTAGE_1)	graphic->DrawMyString2(X_MSG, Y_MSG, "STAGE 1", SPACE_MSG, true, EXRATE_MSG);
	}
	if (f_pause)
	{
		graphic->DrawMyString2(290, 262, "PAUSE", 16, false, 2.0);
		graphic->DrawMyString2(20, 460, "(P) TITLE", 16, true, 2.0);
	}

	// 「あいまいです」と言われるからスコープ解決演算子を使った。解決したけどイミフ...
	DxLib::DrawRotaGraph(40, 32, 2.0, 0.0, gh_bomb, true);
	// -------------------------------------------------------------------------------------------------------

	score->Draw();

	// TEST
	DrawFormatString(0, 30, GetColor(0, 255, 0), "%d", count_fol);
//	DrawFormatString(0, 50, GetColor(0, 255, 0), "%lf", sPlayer.x);
}


void Game::GetPlayerPosition(double* x, double* y)
{
	double tempX, tempY;
	player->GetPosition(&tempX, &tempY);
	*x = tempX;
	*y = tempY;
}


Player& Game::GetStaticPlayer(){
	return sPlayer;
}


void Game::CopyPlayer()
{
	player->GetPosition(&sPlayer.x, &sPlayer.y);
	sPlayer.powlv	= player->powlv;
	sPlayer.bombNum = player->bombNum;
	sPlayer.isDead	= player->isDead;
	sPlayer.f_start = player->f_start;
	sPlayer.isHit	= player->isHit;
}
【BossA.hpp】

コード:

#pragma once

#include "BossChara.hpp"
#include "Counter.hpp"
#include "Eshot.hpp"

#include <memory>


class BossA : public BossChara
{
public:
	BossA();
	~BossA();
	void Update();
	void Draw();

private:
	void Move1();		// 動き1
	void AttackMng();	// 攻撃管理
	void Attack1();		// 攻撃1
	void Attack2();

	const int MAX_HP;
	const float SPEED;
	static const float SC_LIMIT_XL, SC_LIMIT_XR;
	static const float SC_LIMIT_YT, SC_LIMIT_YB;
	const float HIT_RANGE;
	
	std::unique_ptr<Counter>	c_start;
	std::unique_ptr<Counter>	c_end;
	std::unique_ptr<Eshot>		shot;
	
	int		hp;								// 体力
	int		hm;								// モデリングデータ用ハンドル
	int		hg_shield;						// シールド画像
	int		in_time, stop_time, out_time;	// 登場、停止、退場の時間
	float	targetX, targetY;				// 目的地
	float	angle;							// 体当たりの方向用
	VECTOR	camera;
	VECTOR	mPos;							// モデルのワールド座標
	VECTOR	rota;							// モデルの回転値
	VECTOR	pos;							// モデルのスクリーン座標
	VECTOR	startPos;						// ワールド座標をスクリーン座標にするため
	bool	isStart;						// 攻撃開始しているか?
	bool	isEnd;							// 退場したか?
	bool	isDead;							// 死んだか?
};
【BossA.cpp】

コード:

#include "DxLib.h"

#include "BossA.hpp"
#include "Game.hpp"		// Playerの情報を取得するため
#include "Keyboard.hpp"

#include <cmath>


/// TEST 変数
static int h_test;


const float BossA::SC_LIMIT_XL = 78.0f;
const float BossA::SC_LIMIT_XR = 560.0f;
const float BossA::SC_LIMIT_YT = 74.0f;
const float BossA::SC_LIMIT_YB = 406.0f;


BossA::BossA()
	: MAX_HP(3000)
	, SPEED(2.0f)
	, HIT_RANGE(62.0f)
	, c_end(new Counter(3600))
	, hp(MAX_HP)
	, angle(0.0f)
	, isStart(false)
	, isEnd(false)
	, isDead(false)
{
	hm = MV1LoadModel("GRAPH/MODEL/BossA_2.x");
	h_test = LoadGraph("GRAPH/GAME/Eshot/eshot01.png");

	mPos.x = 320.0f;
	mPos.y = 300.0f;
	mPos.z = -300.0f;

	rota.x = 1.5f;
	rota.y = 0.0f;
	rota.z = 0.0f;

	pos.x = 320.0f;
	pos.y = -20.0f;
	pos.z = 0.0f;

	MV1SetRotationXYZ(hm, rota);							// 回転値を設定
	MV1SetPosition(hm, mPos);								// 座標を設定
	MV1SetScale(hm, VGet(13.0f, 13.0f, 13.0f));				// モデル拡大
}


BossA::~BossA()
{
	MV1DeleteModel(hm);
	DeleteGraph(h_test);
}


void BossA::Update()
{
	rota.z += 0.03f;	// モデルを回転
	c_end->Update();
	startPos = ConvScreenPosToWorldPos(VGet(pos.x, pos.y, 0.5f));

	mPos = startPos;	// モデルをスクリーン座標にあてがる
	
	if (!isStart)
	{
		pos.x -= SPEED;
		pos.y += SPEED / 2.0f;
		if (pos.x < SC_LIMIT_XL)	isStart = true;
		return;
	}

	Move1();			// 動き
	AttackMng();		// 攻撃

	// TEST
	/*
	if (Keyboard_Get(KEY_INPUT_RIGHT) == 1) {
		mXrota += 0.1f;
	}
	if (Keyboard_Get(KEY_INPUT_LEFT) == 1) {
		mXrota -= 0.1f;
	}
	if (Keyboard_Get(KEY_INPUT_UP) == 1) {
		mYrota += 0.1f;
	}
	if (Keyboard_Get(KEY_INPUT_DOWN) == 1) {
		mYrota -= 0.1f;
	}

	if (Keyboard_Get(KEY_INPUT_RIGHT) >= 1) {
		mX += SPEED;
	}
	if (Keyboard_Get(KEY_INPUT_LEFT) >= 1) {
		mX -= SPEED;
	}
	if (Keyboard_Get(KEY_INPUT_UP) >= 1) {
		mY += SPEED;
	}
	if (Keyboard_Get(KEY_INPUT_DOWN) >= 1) {
		mY -= SPEED;
	}

	if (Keyboard_Get(KEY_INPUT_RIGHT) >= 1) {
		pos.x += SPEED;
	}
	if (Keyboard_Get(KEY_INPUT_LEFT) >= 1) {
		pos.x -= SPEED;
	}
	if (Keyboard_Get(KEY_INPUT_UP) >= 1) {
		pos.y -= SPEED;
	}
	if (Keyboard_Get(KEY_INPUT_DOWN) >= 1) {
		pos.y += SPEED;
	}
	*/
}


void BossA::Draw()
{
	MV1SetRotationXYZ(hm, rota);	// 回転値設定
	MV1SetPosition(hm, mPos);		// 座標を設定
	MV1DrawModel(hm);				// 3Dオブジェクト描画

	// TEST
/*
	DrawFormatString(0, 60, GetColor(0, 255, 0), "mXrota = %f", mXrota);
	DrawFormatString(0, 80, GetColor(0, 255, 0), "mYrota = %f", mYrota);
	DrawFormatString(0, 100, GetColor(0, 255, 0), "mZrota = %f", mZrota);
	
	DrawFormatString(0, 60, GetColor(0, 255, 0), "mX = %f", mX);
	DrawFormatString(0, 80, GetColor(0, 255, 0), "mY = %f", mY);

	DrawFormatString(0, 60, GetColor(0, 255, 0), "posX = %f", pos.x);
	DrawFormatString(0, 80, GetColor(0, 255, 0), "posY = %f", pos.y);
	DrawFormatString(0, 100, GetColor(0, 255, 0), "posZ = %f", pos.z);
	*/
	DrawCircle(pos.x, pos.y, HIT_RANGE, GetColor(0, 255, 0), false);
	DrawFormatString(pos.x, pos.y, GetColor(0, 255, 0), "%d", hp);
	DrawRotaGraph(pos.x, pos.y, 2.0, 0.0, h_test, true);
}


void BossA::Move1()
{
	const bool IS_OVER_LIMIT = (pos.x < SC_LIMIT_XL || SC_LIMIT_XR < pos.x || pos.y < SC_LIMIT_YT || SC_LIMIT_YB < pos.y);

	if(IS_OVER_LIMIT)
	{
		const float tarX = static_cast<float>(Game::GetStaticPlayer().x);
		const float tarY = static_cast<float>(Game::GetStaticPlayer().y);

		if (pos.x < SC_LIMIT_XL)	pos.x = SC_LIMIT_XL;
		if (pos.x > SC_LIMIT_XR)	pos.x = SC_LIMIT_XR;
		if (pos.y < SC_LIMIT_YT)	pos.y = SC_LIMIT_YT;
		if (pos.y > SC_LIMIT_YB)	pos.y = SC_LIMIT_YB;

		angle = std::atan2(tarY - pos.y, tarX - pos.x);
	}
	pos.x += std::cos(angle) * SPEED;
	pos.y += std::sin(angle) * SPEED;
}


void BossA::AttackMng()
{
	const bool isFINE = ( hp >= MAX_HP / 2 );

	if (isFINE) {
		Attack1();
	}
	else {
		Attack2();
	}
}


void BossA::Attack1()
{

}

void BossA::Attack2()
{
}
【エラー内容】
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) 型指定子が必要です Gek-iRen-Sha c:\Users\SHOHEI\Desktop\激連射バックアップ\Vol2\Game.cpp 18

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) constant "BossA" は型の名前ではありません Gek-iRen-Sha c:\Users\SHOHEI\Desktop\激連射バックアップ\Vol2\Game.hpp 38
最後に編集したユーザー やふう! on 2016年2月29日(月) 11:54 [ 編集 1 回目 ]
ドット絵修行中 . . .

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: エラーの原因がわかりません

#2

投稿記事 by amehirune » 9年前

オフトピック
エラー表示のところでもろに本名さらしてる気がするのですが大丈夫ですか?
因みに私はC専門なのでC++はよくわかりません\(^o^)/
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: エラーの原因がわかりません

#3

投稿記事 by みけCAT » 9年前

includeの関係が循環しているかもしれません。
各ヘッダでそれぞれ何をincludeしているかを教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
やふう!
記事: 4
登録日時: 10年前

Re: エラーの原因がわかりません

#4

投稿記事 by やふう! » 9年前

SHOHEIは日本にごまんといるので気にしませんw
一応全ファイルを載せておきます。

・Game.hpp
#include "DxLib.h"
#include "BaseScene.hpp"
#include "ISceneChanger.hpp"
#include "Player.hpp"
#include "Graphic.hpp"
#include "Stage.hpp"
#include "Pshot.hpp"
#include "BossA.hpp"
#include "Score.hpp"
#include <memory>

・BaseScene.hpp
#include "DxLib.h"
#include "BaseScene.hpp"

・IISceneChanger.hpp
#include "ISceneChanger.hpp"

・Player.hpp
#include "Task.hpp"
#include "Keyboard.hpp"
#include "Graphic.hpp"
#include "Range.hpp"
#include "Counter.hpp"
#include "Enemy.hpp"
#include "Effector.hpp"
#include <memory>

・Graphic.hpp
なし

・Stage.hpp
#include "Task.hpp"
#include "Counter.hpp"
#include <memory>
#include <array>

・Pshot.hpp
#include "Bullet.hpp"
#include "Player.hpp"
#include "Counter.hpp"
#include <array>
#include <memory>

・BossA
#include "BossChara.hpp"
#include "Counter.hpp"
#include "Eshot.hpp"
#include <memory>

・Score.hpp
#include "Task.hpp"
#include "Graphic.hpp"
#include <memory>

・Task.hpp
なし

・Keyboard.hpp
なし

・Range.hpp
#include "DxLib.h"

・Counter.hpp
なし

・Enemy.hpp // ←こいつもBossAと同じ症状です
#include "Task.hpp"
#include "Counter.hpp"
#include <memory>

・Effector.hpp
#include "Counter.hpp"
#include <memory>
#include <array>

・Task.hpp
なし

・BossChara.hpp
なし

・Eshot.hpp
なし

・Pshot.hpp
#include "Bullet.hpp"
#include "Player.hpp"
#include "Counter.hpp"
#include <array>
#include <memory>

・Bullet.hpp
なし

ざっとこのような感じです。
何もいじっていないのに目を離したすきにこんなエラーが出てて本当に不思議です。
最後に編集したユーザー やふう! on 2016年2月29日(月) 12:03 [ 編集 1 回目 ]
ドット絵修行中 . . .

アバター
やふう!
記事: 4
登録日時: 10年前

Re: エラーの原因がわかりません

#5

投稿記事 by やふう! » 9年前

残念ながらファイル送付はできませんでした。
ドット絵修行中 . . .

アバター
やふう!
記事: 4
登録日時: 10年前

Re: エラーの原因がわかりません

#6

投稿記事 by やふう! » 9年前

結局あれから作り直して、謎のエラーもなく順調にゲーム開発できました。
循環参照は無く、その他の重大な誤りも無かったです。エラー原因は未だ分からりませんが作り直しで解決したことにします・・・
このように作り直しすることを防ぐためにもバージョン管理は大切だと改めて感じました。(非効率ですがバックアップはとっています)

回答してくださった方ありがとうございましたm(__)m
ドット絵修行中 . . .

閉鎖

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