dxlibのゲームでエラーがなくなりません!たすけてください!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kou0126

dxlibのゲームでエラーがなくなりません!たすけてください!

#1

投稿記事 by kou0126 » 9年前

重大度レベル コード 説明 プロジェクト ファイル 10行 抑制状態
エラー C2061 構文エラー: 識別子 'SceneMgr'


重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C2143 構文エラー: ';' が '*' の前にありません。

重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C4430 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません


重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C2238 ';' の前に無効なトークンがあります。

kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#2

投稿記事 by kou0126 » 9年前

コード
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;    //次のシーンをセットする
}

kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#3

投稿記事 by kou0126 » 9年前

コード 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);

	

};


kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#4

投稿記事 by kou0126 » 9年前

コード BaseScene.cpp

コード:

#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);

	

};

BaseScene.h

コード:

#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;
    

};

kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#5

投稿記事 by kou0126 » 9年前

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;        // ソフトの終了
}

kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#6

投稿記事 by kou0126 » 9年前

コード
 Menu.cpp

コード:

#include "Menu.h"
#include "DxLib.h"

Menu::Menu(SceneMgr* changer) : BaseScene(changer) {
}

//初期化
void Menu::Initialize(){
    
}

//更新
void Menu::Update(){
   
}

//描画
void Menu::Draw(){

}
Menu.h

コード:

#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;            //描画処理をオーバーライド。

};
Task.h

コード:

#pragma once

//タスククラス。何かのモジュールはすべてこのTaskクラスを継承する。
class Task {
public:
    virtual ~Task(){}
    virtual void Initialize(){}        //初期化処理は実装してもしなくてもいい
    virtual void Finalize(){}        //終了処理は実装してもしなくてもいい
    virtual void Update()     = 0;    //更新処理は必ず継承先で実装する
    virtual void Draw()       = 0;    //描画処理は必ず継承先で実装する
};

kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#7

投稿記事 by kou0126 » 9年前

以上ですべてです
わかったことがあったら教えてください
よろしくお願いします。。。

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

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#8

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

とりあえずすぐにわかることは、SceneMgr.hとBaseScene.hの間で循環参照が発生していますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#9

投稿記事 by kou0126 » 9年前

返信ありがとうございます
たしかに循環してしまってますね
よろしければどうすればよりよくなるか教えてもらえませんか?
なにしろ初心者なものでして。。。

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

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#10

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

ポインタの指す先として使う型を、インクルードではなく前方宣言で宣言するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kou0126

#11

投稿記事 by kou0126 » 9年前

ありがとうございます!
やってみます!

kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#12

投稿記事 by kou0126 » 9年前

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;
	
    

};
BaseScene.cppを

コード:

#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);
}
にかえたのですがまだ重大度レベル コード 説明 プロジェクト ファイル 8行 抑制状態
エラー C2061 構文エラー: 識別子 'SceneMgr' 2016.07.02hourekiden d:\danmakuproject\backup\2016.07.02hourekiden\basescene.h

というエラーが出ます

また前方宣言の使い方はあっていますか?

何度も何度も申し訳ないですがご教授ください

kou0126

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#13

投稿記事 by kou0126 » 9年前

SceneMgr mSceneChanger;

SceneMgr *mSceneChanger;としてもだめでした

kou0126
記事: 6
登録日時: 9年前

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#14

投稿記事 by kou0126 » 9年前

わけがわからなくなってきましたー。。。
ヘルプミー

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

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#15

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

includeの循環が問題になっているのに、問題のincludeを消していない時点で、ダメだと思いませんでしたか?
クラスhogeのポインタを宣言するときは、hoge全体の定義が無くても、class hoge;と宣言しておくだけでhogeのポインタ(や参照)を宣言できるようになります。
kou0126 さんが書きました:また前方宣言の使い方はあっていますか?
mSceneChangerメンバを消しただけで前方宣言を使った改善をしていないようなので、使い方があっているかを言うことはできません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kou0126
記事: 6
登録日時: 9年前

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#16

投稿記事 by kou0126 » 9年前

コード:

#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のゲームでエラーがなくなりません!たすけてください!

#17

投稿記事 by Dixq (管理人) » 9年前

ヘッダファイルには全て先頭に
#pragma once
を付けましょう。

kou0126
記事: 6
登録日時: 9年前

Re: dxlibのゲームでエラーがなくなりません!たすけてください!

#18

投稿記事 by kou0126 » 9年前

返信ありがとうございます
つけているのですがコピペミスでついていないようになっています、すいません
当初のエラーは解決しましたので解決済みとしておきます
皆さまありがとうございました

閉鎖

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