私はファンゲーム制作と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;
};
#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;
}
#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; // 死んだか?
};
#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