dxlibのゲームでエラーがなくなりません!たすけてください!
dxlibのゲームでエラーがなくなりません!たすけてください!
重大度レベル コード 説明 プロジェクト ファイル 10行 抑制状態
エラー C2061 構文エラー: 識別子 'SceneMgr'
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C2143 構文エラー: ';' が '*' の前にありません。
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C4430 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C2238 ';' の前に無効なトークンがあります。
エラー C2061 構文エラー: 識別子 'SceneMgr'
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C2143 構文エラー: ';' が '*' の前にありません。
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C4430 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C2238 ';' の前に無効なトークンがあります。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
コード
SceneMgr.cpp
SceneMgr.cpp
#include "SceneMgr.h"
#include "Dxlib.h"
#include "BaseScene.h"
#include "Menu.h"
SceneMgr::SceneMgr() :
mNextScene(eScene_None) //次のシーン管理変数
{
mScene = (BaseScene*) new Menu(this);
}
//初期化
void SceneMgr::Intialize() {
mScene->Initialize();
}
//終了処理
void SceneMgr::Finalize() {
mScene->Finalize();
}
//更新
void SceneMgr::Update() {
if (mNextScene != eScene_None) { //次のシーンがセットされていたら
mScene->Finalize();//現在のシーンの終了処理を実行
delete mScene;
switch (mNextScene) { //シーンによって処理を分岐
case eScene_Menu: //次の画面がメニューなら
mScene = (BaseScene*) new Menu(this); //メニュー画面のインスタンスを生成する
break;//以下略
case eScene_Game:
break;
case eScene_Config:
break;
}
mNextScene = eScene_None; //次のシーン情報をクリア
mScene->Initialize(); //シーンを初期化
}
mScene->Update(); //シーンの更新
}
//描画
void SceneMgr::Draw() {
mScene->Draw(); //シーンの描画
}
// 引数 nextScene にシーンを変更する
void SceneMgr::SceneChanger(eScene NextScene) {
mNextScene = NextScene; //次のシーンをセットする
}
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
コード SceneMgr.h
#pragma once
#include "Task.h"
#include "BaseScene.h"
enum eScene {
eScene_Menu,
eScene_Game,
eScene_Config,
eScene_None,
};
class SceneMgr : public Task
{
private:
BaseScene* mScene;
eScene mNextScene;
public:
SceneMgr();
void Intialize();
void Update();
void Draw();
void Finalize();
void SceneChanger(eScene NextScene);
};
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
コード BaseScene.cpp
BaseScene.h
#pragma once
#include "Task.h"
#include "BaseScene.h"
enum eScene {
eScene_Menu,
eScene_Game,
eScene_Config,
eScene_None,
};
class SceneMgr : public Task
{
private:
BaseScene* mScene;
eScene mNextScene;
public:
SceneMgr();
void Intialize();
void Update();
void Draw();
void Finalize();
void SceneChanger(eScene NextScene);
};
#pragma once
#include "SceneMgr.h"
#include "Task.h"
//シーンの基底クラス。
class BaseScene : public Task {
public:
BaseScene(SceneMgr*);
virtual ~BaseScene() {}
virtual void Initialize() override{}
virtual void Finalize() override;
virtual void Update() override{}
virtual void Draw() override;
protected:
int mImageHandle;
SceneMgr* mSceneChanger;
};
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Main.cpp コード
#include "DxLib.h"
#include "Define.h"
#include "SceneMgr.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
bool WindowMode = true;
bool DebugMode = false;
/*****************************************************************************************/
/*ウィンドウ設定 */
/*****************************************************************************************/
SetMainWindowText("HOUREKIDEN");//タイトル指定
SetBackgroundColor(0, 0, 0);
SetGraphMode(WINDOW_WSIZE_X, WINDOW_SIZE_Y, 32);//画面モードの変更
ChangeWindowMode(WindowMode);// ウインドウモードに変更
/*---------------------------------------------------------*/
SetFullScreenResolutionMode(DX_FSRESOLUTIONMODE_DESKTOP);
/*
DX_FSRESOLUTIONMODE_NATIVE
モニターの解像度を SetGraphMode で指定した解像度に変更するモード(デフォルト)
DX_FSRESOLUTIONMODE_DESKTOP
モニターの解像度をデスクトップ画面と同じにして
SetGraphMode で指定した解像度の画面を拡大して表示するモード
DX_FSRESOLUTIONMODE_MAXIMUM
モニターの解像度を最大にして、SetGraphMode で指定した解像度の画面を
拡大して表示するモード
*/
/*****************************************************************************************/
/*DXライブラリ初期化処理 */
/*****************************************************************************************/
if (DxLib_Init() == -1)
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面に設定
SceneMgr sceneMgr;
sceneMgr.Initialize();
/*****************************************************************************************/
/*ゲームループ */
/*****************************************************************************************/
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ClearDrawScreen() == 0){
sceneMgr.Update(); //更新
sceneMgr.Draw(); //描画
}
/*****************************************************************************************/
sceneMgr.Finalize();
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
コード
Menu.cpp
Menu.h
Task.h
Menu.cpp
#include "Menu.h"
#include "DxLib.h"
Menu::Menu(SceneMgr* changer) : BaseScene(changer) {
}
//初期化
void Menu::Initialize(){
}
//更新
void Menu::Update(){
}
//描画
void Menu::Draw(){
}
#pragma once
#include "BaseScene.h"
//メニュー画面クラス
class Menu : public BaseScene {
public :
Menu(SceneMgr* changer);
void Initialize() override; //初期化処理をオーバーライド。
//void Finalize() override ; //終了処理をオーバーライド。
void Update() override; //更新処理をオーバーライド。
void Draw() override; //描画処理をオーバーライド。
};
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
とりあえずすぐにわかることは、SceneMgr.hとBaseScene.hの間で循環参照が発生していますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
返信ありがとうございます
たしかに循環してしまってますね
よろしければどうすればよりよくなるか教えてもらえませんか?
なにしろ初心者なものでして。。。
たしかに循環してしまってますね
よろしければどうすればよりよくなるか教えてもらえませんか?
なにしろ初心者なものでして。。。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
ポインタの指す先として使う型を、インクルードではなく前方宣言で宣言するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
BaseScene。hを
BaseScene.cppを
にかえたのですがまだ重大度レベル コード 説明 プロジェクト ファイル 8行 抑制状態
エラー C2061 構文エラー: 識別子 'SceneMgr' 2016.07.02hourekiden d:\danmakuproject\backup\2016.07.02hourekiden\basescene.h
というエラーが出ます
また前方宣言の使い方はあっていますか?
何度も何度も申し訳ないですがご教授ください
#pragma once
#include "SceneMgr.h"
//シーンの基底クラス。
class BaseScene : public Task {
public:
BaseScene(SceneMgr*);
virtual ~BaseScene() {}
virtual void Initialize() override{}
virtual void Finalize() override;
virtual void Update() override{}
virtual void Draw() override;
protected:
int mImageHandle;
};
#include "BaseScene.h"
#include "DxLib.h"
#include "SceneMgr.h"
BaseScene::BaseScene(SceneMgr* changer) :
mImageHandle(0) {
SceneMgr mSceneChanger;
mSceneChanger = changer;
}
void BaseScene::Finalize(){
DeleteGraph(mImageHandle);
}
void BaseScene::Draw(){
DrawGraph(0,0,mImageHandle,FALSE);
}
エラー C2061 構文エラー: 識別子 'SceneMgr' 2016.07.02hourekiden d:\danmakuproject\backup\2016.07.02hourekiden\basescene.h
というエラーが出ます
また前方宣言の使い方はあっていますか?
何度も何度も申し訳ないですがご教授ください
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
SceneMgr mSceneChanger;
を
SceneMgr *mSceneChanger;としてもだめでした
を
SceneMgr *mSceneChanger;としてもだめでした
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
includeの循環が問題になっているのに、問題のincludeを消していない時点で、ダメだと思いませんでしたか?
クラスhogeのポインタを宣言するときは、hoge全体の定義が無くても、class hoge;と宣言しておくだけでhogeのポインタ(や参照)を宣言できるようになります。
クラスhogeのポインタを宣言するときは、hoge全体の定義が無くても、class hoge;と宣言しておくだけでhogeのポインタ(や参照)を宣言できるようになります。
mSceneChangerメンバを消しただけで前方宣言を使った改善をしていないようなので、使い方があっているかを言うことはできません。kou0126 さんが書きました:また前方宣言の使い方はあっていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
#pragma once
class SceneMgr;
//シーンの基底クラス。
class BaseScene : public Task {
protected:
int mImageHandle;
SceneMgr* mSceneChanger;
public:
BaseScene(SceneMgr* changer);
virtual ~BaseScene() {}
virtual void Initialize() override{}
virtual void Finalize() override;
virtual void Update() override{}
virtual void Draw() override;
};
#include "BaseScene.h"
#include "DxLib.h"
#include "SceneMgr.h"
BaseScene::BaseScene(SceneMgr* changer) :
mImageHandle(0) {
mSceneChanger = changer;
}
void BaseScene::Finalize(){
DeleteGraph(mImageHandle);
}
void BaseScene::Draw(){
DrawGraph(0,0,mImageHandle,FALSE);
}
#include "Task.h"
enum eScene {
eScene_Menu,
eScene_Game,
eScene_Config,
eScene_None,
};
class BaseScene;
class SceneMgr : public Task
{
private:
BaseScene* mScene;
eScene mNextScene;
public:
SceneMgr();
void Intialize();
void Update();
void Draw();
void Finalize();
void SceneChanger(eScene NextScene);
};
#include "SceneMgr.h"
#include "BaseScene.h"
#include "Menu.h"
SceneMgr::SceneMgr() :
mNextScene(eScene_None) //次のシーン管理変数
{
mScene = (BaseScene*) new Menu(this);
}
//初期化
void SceneMgr::Intialize() {
mScene->Initialize();
}
//終了処理
void SceneMgr::Finalize() {
mScene->Finalize();
}
//更新
void SceneMgr::Update() {
if (mNextScene != eScene_None) { //次のシーンがセットされていたら
mScene->Finalize();//現在のシーンの終了処理を実行
delete mScene;
switch (mNextScene) { //シーンによって処理を分岐
case eScene_Menu: //次の画面がメニューなら
mScene = (BaseScene*) new Menu(this); //メニュー画面のインスタンスを生成する
break;//以下略
case eScene_Game:
break;
case eScene_Config:
break;
}
mNextScene = eScene_None; //次のシーン情報をクリア
mScene->Initialize(); //シーンを初期化
}
mScene->Update(); //シーンの更新
}
//描画
void SceneMgr::Draw() {
mScene->Draw(); //シーンの描画
}
// 引数 nextScene にシーンを変更する
void SceneMgr::SceneChanger(eScene NextScene) {
mNextScene = NextScene; //次のシーンをセットする
}
エラー LNK2019 未解決の外部シンボル "public: __thiscall SceneMgr::SceneMgr(void)" (??0SceneMgr@@QAE@XZ) が関数 _WinMain@16 で参照されました。 Dxlib c:\Users\morim\documents\visual studio 2015\Projects\Dxlib\main.obj 1
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK2019 未解決の外部シンボル "public: virtual void __thiscall SceneMgr::Update(void)" (?Update@SceneMgr@@UAEXXZ) が関数 _WinMain@16 で参照されました。 Dxlib c:\Users\morim\documents\visual studio 2015\Projects\Dxlib\main.obj 1
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK2019 未解決の外部シンボル "public: virtual void __thiscall SceneMgr::Draw(void)" (?Draw@SceneMgr@@UAEXXZ) が関数 _WinMain@16 で参照されました。 Dxlib c:\Users\morim\documents\visual studio 2015\Projects\Dxlib\main.obj 1
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK2019 未解決の外部シンボル "public: virtual void __thiscall SceneMgr::Finalize(void)" (?Finalize@SceneMgr@@UAEXXZ) が関数 _WinMain@16 で参照されました。 Dxlib c:\Users\morim\documents\visual studio 2015\Projects\Dxlib\main.obj 1
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK1120 4 件の未解決の外部参照 Dxlib c:\users\morim\documents\visual studio 2015\Projects\Dxlib\Debug\Dxlib.exe 1
というエラーが出ました
前方宣言の使い方は理解したつもりなのですが。。。
まだ何か間違っているのでしょうか?
何度もすいませんが再度教えていただけたら幸いです
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
ヘッダファイルには全て先頭に
#pragma once
を付けましょう。
#pragma once
を付けましょう。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
返信ありがとうございます
つけているのですがコピペミスでついていないようになっています、すいません
当初のエラーは解決しましたので解決済みとしておきます
皆さまありがとうございました
つけているのですがコピペミスでついていないようになっています、すいません
当初のエラーは解決しましたので解決済みとしておきます
皆さまありがとうございました