ページ 1 / 1
dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 11:33
by kou0126
重大度レベル コード 説明 プロジェクト ファイル 10行 抑制状態
エラー C2061 構文エラー: 識別子 'SceneMgr'
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C2143 構文エラー: ';' が '*' の前にありません。
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C4430 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
重大度レベル コード 説明 プロジェクト ファイル 19行 抑制状態
エラー C2238 ';' の前に無効なトークンがあります。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 11:34
by kou0126
コード
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のゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 11:35
by kou0126
コード 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のゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 11:36
by kou0126
コード 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;
};
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 11:37
by kou0126
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のゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 11:39
by kou0126
コード
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; //描画処理は必ず継承先で実装する
};
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 11:40
by kou0126
以上ですべてです
わかったことがあったら教えてください
よろしくお願いします。。。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 12:25
by みけCAT
とりあえずすぐにわかることは、SceneMgr.hとBaseScene.hの間で循環参照が発生していますね。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 12:58
by kou0126
返信ありがとうございます
たしかに循環してしまってますね
よろしければどうすればよりよくなるか教えてもらえませんか?
なにしろ初心者なものでして。。。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 13:03
by みけCAT
ポインタの指す先として使う型を、インクルードではなく前方宣言で宣言するといいでしょう。
Posted: 2016年7月03日(日) 13:05
by kou0126
ありがとうございます!
やってみます!
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 13:14
by kou0126
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
というエラーが出ます
また前方宣言の使い方はあっていますか?
何度も何度も申し訳ないですがご教授ください
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 13:21
by kou0126
SceneMgr mSceneChanger;
を
SceneMgr *mSceneChanger;としてもだめでした
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 13:58
by kou0126
わけがわからなくなってきましたー。。。
ヘルプミー
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 14:21
by みけCAT
includeの循環が問題になっているのに、問題のincludeを消していない時点で、ダメだと思いませんでしたか?
クラスhogeのポインタを宣言するときは、hoge全体の定義が無くても、class hoge;と宣言しておくだけでhogeのポインタ(や参照)を宣言できるようになります。
kou0126 さんが書きました:また前方宣言の使い方はあっていますか?
mSceneChangerメンバを消しただけで前方宣言を使った改善をしていないようなので、使い方があっているかを言うことはできません。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 18:37
by kou0126
コード:
#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
というエラーが出ました
前方宣言の使い方は理解したつもりなのですが。。。
まだ何か間違っているのでしょうか?
何度もすいませんが再度教えていただけたら幸いです
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 22:58
by Dixq (管理人)
ヘッダファイルには全て先頭に
#pragma once
を付けましょう。
Re: dxlibのゲームでエラーがなくなりません!たすけてください!
Posted: 2016年7月03日(日) 23:21
by kou0126
返信ありがとうございます
つけているのですがコピペミスでついていないようになっています、すいません
当初のエラーは解決しましたので解決済みとしておきます
皆さまありがとうございました