#1
by keito94 » 7年前
Stage.cppでCPlayerを初期化しようとすると、GameがNullptrだったという例外がスローされてしまいます。
これを解消するにはどうすればいいのでしょうか?
Stage.h
コード:
#pragma once
class CStage {
public:
const char* Name;
CStage(const char* name) : Name(name) {}
virtual void Init() {}
virtual void Destroy() {}
virtual bool Move() { return true; }
virtual void Draw() {}
void DrawStage();
};
class CFirstStage : public CStage {
public:
CFirstStage() : CStage("FirstStage"){}
void Init();
void Destroy();
bool Move();
void Draw();
};
Stage.cpp(例外がスローされた部分のみ)
コード:
void CFirstStage::Init() {
Game->Player = new CPlayer(240.0F, 215.0F);
}
Scene.h
コード:
#pragma once
#include "Mover.h"
//シーン
class CScene : public CMover {
protected:
bool FirstLoop;
int Time, MenuPos;
public:
CScene()
:CMover(0, 0),Time(0),MenuPos(0)
{}
};
class CGameStage : public CScene {
protected:
bool StageActive;
public:
CGameStage();
virtual ~CGameStage();
bool Move();
void Draw();
};
extern CGameStage* Scene;
Scene.cpp
コード:
#include "Scene.h"
#include "Main.h"
#include "Stage.h"
CGameStage::CGameStage()
{
}
CGameStage::~CGameStage() {
Game->Stage[Game->StageIndex]->Destroy();
}
bool CGameStage::Move() {
bool stage_active = Game->Stage[Game->StageIndex]->Move();
if (FirstLoop) {
FirstLoop = false;
}
Game->OffSetPlayer();
return stage_active;
}
void CGameStage::Draw() {
Game->Stage[Game->StageIndex]->Draw();
}
Main.h
コード:
#pragma once
#include "DxLib.h"
#include <vector>
using namespace std;
class CStage;
class CPlayer;
class CGameStage;
class CGameMain {
int Time;
public:
CPlayer* Player;
vector<CStage*> Stage;
CGameStage* Scene;
int PlayerGh[32];
int MapGraph;
int StageIndex;
float Scroll, Vit;
float ViewX, ViewY;
CGameMain();
~CGameMain();
void ErrMes(LPCSTR str, ...);
int MapLoad(const char* mapdata,const char* mapchip);
void Run();
void OffSetPlayer();
void MakeStage();
virtual void Move();
virtual void Draw();
void SetStage(int stage);
void SetPlayer(CPlayer* player) { Player = player; }
CPlayer* GetPlayer() { return Player; }
};
const float GRAVMAX = 20.0f;
const float GRAV = 0.25F;
const float GOFF = 0.5F;
const int MOTION_MAX = 5;
const int ANIM_MAX = 8;
extern CGameMain *Game;
Main.cpp
コード:
#include "Main.h"
#include "Mapping.h"
#include "Scene.h"
#include "Stage.h"
#include "Player.h"
CFmfMap MapObj;
CGameMain* Game;
CStage* Stage;
FILE* out;
HANDLE Stdout;
int BitCount;
CGameMain::CGameMain() : StageIndex(0){
//AllocConsole(); out = 0; freopen_s(&out, "CON", "w", stdout); Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
ChangeWindowMode(TRUE); SetGraphMode(320, 240, 32), SetUseCharSet(DX_CHARSET_UTF8);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
LoadDivGraph("自作キャラ.bmp", 32, 8, 4, 16, 16, PlayerGh);
MapLoad("スクロール.fmf", "マップチップ.bmp");
MakeStage();
SetStage(0);
}
void CGameMain::MakeStage() {
Stage.push_back(new CFirstStage());
}
void CGameMain::SetStage(int stage) {
StageIndex = stage;
Stage[StageIndex]->Init();
Scene = new CGameStage();
}
void CGameMain::Run() {
//system("cls");
Player->Move();
Player->Draw();
Scene->Move();
Scene->Draw();
}
int CGameMain::MapLoad(const char* mapdata, const char* mapchip) {
if (!MapObj.Open(mapdata)) {
ErrMes("Error Code 30: MapData is Not Loading.");
return -1;
}
BYTE* layer = (BYTE*)MapObj.GetLayerAddr(0);
if (layer == NULL) {
ErrMes("Error Code 31: Null Layer.");
MapObj.Close();
return -1;
}
if ((MapGraph = LoadGraph(mapchip)) == -1) {
ErrMes("Error Code 41: MapChip is Not Loading.");
return -1;
}
MapGraph = LoadGraph(mapchip);
BitCount = MapObj.GetLayerBitCount() == 8 ? 16 : 256;
return 0;
}
void CGameMain::OffSetPlayer() {
//プレイヤーが居るかどうか確認
CPlayer* player = GetPlayer();
if (player == NULL) return;
Scroll = (player->X - ((20 * 16) / 2));
int width = MapObj.GetMapWidth();
Scroll = max(Scroll, 0);
Scroll = min(Scroll, ((width-20) * MAP_CELL));
Vit = (player->Y - ((15 * 16) / 2));
int height = MapObj.GetMapHeight();
Vit = max(Vit, 0);
Vit = min(Vit, ((height-15) * MAP_CELL));
ViewX = player->X - Scroll;
ViewY = player->Y - Vit;
}
void CGameMain::ErrMes(LPCSTR str, ...) {
char buf[1024];
wsprintf(buf, str, (char*)(&str + 1));
MessageBox(NULL, buf, "Error!!", MB_OK);
}
void CGameMain::Move() {
}
void CGameMain::Draw() {
}
CGameMain::~CGameMain() {
DxLib_End();
//fclose(out); FreeConsole();
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPervInstance, LPSTR lpCmdLine, int nCmdShow) {
Game = new CGameMain;
while(ScreenFlip()==0&&ProcessMessage()==0&&ClearDrawScreen()==0) {
Game->Run();
}
delete Game;
}
Stage.cppでCPlayerを初期化しようとすると、GameがNullptrだったという例外がスローされてしまいます。
これを解消するにはどうすればいいのでしょうか?
Stage.h
[code]
#pragma once
class CStage {
public:
const char* Name;
CStage(const char* name) : Name(name) {}
virtual void Init() {}
virtual void Destroy() {}
virtual bool Move() { return true; }
virtual void Draw() {}
void DrawStage();
};
class CFirstStage : public CStage {
public:
CFirstStage() : CStage("FirstStage"){}
void Init();
void Destroy();
bool Move();
void Draw();
};
[/code]
Stage.cpp(例外がスローされた部分のみ)
[code]
void CFirstStage::Init() {
Game->Player = new CPlayer(240.0F, 215.0F);
}
[/code]
Scene.h
[code]
#pragma once
#include "Mover.h"
//シーン
class CScene : public CMover {
protected:
bool FirstLoop;
int Time, MenuPos;
public:
CScene()
:CMover(0, 0),Time(0),MenuPos(0)
{}
};
class CGameStage : public CScene {
protected:
bool StageActive;
public:
CGameStage();
virtual ~CGameStage();
bool Move();
void Draw();
};
extern CGameStage* Scene;
[/code]
Scene.cpp
[code]
#include "Scene.h"
#include "Main.h"
#include "Stage.h"
CGameStage::CGameStage()
{
}
CGameStage::~CGameStage() {
Game->Stage[Game->StageIndex]->Destroy();
}
bool CGameStage::Move() {
bool stage_active = Game->Stage[Game->StageIndex]->Move();
if (FirstLoop) {
FirstLoop = false;
}
Game->OffSetPlayer();
return stage_active;
}
void CGameStage::Draw() {
Game->Stage[Game->StageIndex]->Draw();
}
[/code]
Main.h
[code]
#pragma once
#include "DxLib.h"
#include <vector>
using namespace std;
class CStage;
class CPlayer;
class CGameStage;
class CGameMain {
int Time;
public:
CPlayer* Player;
vector<CStage*> Stage;
CGameStage* Scene;
int PlayerGh[32];
int MapGraph;
int StageIndex;
float Scroll, Vit;
float ViewX, ViewY;
CGameMain();
~CGameMain();
void ErrMes(LPCSTR str, ...);
int MapLoad(const char* mapdata,const char* mapchip);
void Run();
void OffSetPlayer();
void MakeStage();
virtual void Move();
virtual void Draw();
void SetStage(int stage);
void SetPlayer(CPlayer* player) { Player = player; }
CPlayer* GetPlayer() { return Player; }
};
const float GRAVMAX = 20.0f;
const float GRAV = 0.25F;
const float GOFF = 0.5F;
const int MOTION_MAX = 5;
const int ANIM_MAX = 8;
extern CGameMain *Game;
[/code]
Main.cpp
[code]
#include "Main.h"
#include "Mapping.h"
#include "Scene.h"
#include "Stage.h"
#include "Player.h"
CFmfMap MapObj;
CGameMain* Game;
CStage* Stage;
FILE* out;
HANDLE Stdout;
int BitCount;
CGameMain::CGameMain() : StageIndex(0){
//AllocConsole(); out = 0; freopen_s(&out, "CON", "w", stdout); Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
ChangeWindowMode(TRUE); SetGraphMode(320, 240, 32), SetUseCharSet(DX_CHARSET_UTF8);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
LoadDivGraph("自作キャラ.bmp", 32, 8, 4, 16, 16, PlayerGh);
MapLoad("スクロール.fmf", "マップチップ.bmp");
MakeStage();
SetStage(0);
}
void CGameMain::MakeStage() {
Stage.push_back(new CFirstStage());
}
void CGameMain::SetStage(int stage) {
StageIndex = stage;
Stage[StageIndex]->Init();
Scene = new CGameStage();
}
void CGameMain::Run() {
//system("cls");
Player->Move();
Player->Draw();
Scene->Move();
Scene->Draw();
}
int CGameMain::MapLoad(const char* mapdata, const char* mapchip) {
if (!MapObj.Open(mapdata)) {
ErrMes("Error Code 30: MapData is Not Loading.");
return -1;
}
BYTE* layer = (BYTE*)MapObj.GetLayerAddr(0);
if (layer == NULL) {
ErrMes("Error Code 31: Null Layer.");
MapObj.Close();
return -1;
}
if ((MapGraph = LoadGraph(mapchip)) == -1) {
ErrMes("Error Code 41: MapChip is Not Loading.");
return -1;
}
MapGraph = LoadGraph(mapchip);
BitCount = MapObj.GetLayerBitCount() == 8 ? 16 : 256;
return 0;
}
void CGameMain::OffSetPlayer() {
//プレイヤーが居るかどうか確認
CPlayer* player = GetPlayer();
if (player == NULL) return;
Scroll = (player->X - ((20 * 16) / 2));
int width = MapObj.GetMapWidth();
Scroll = max(Scroll, 0);
Scroll = min(Scroll, ((width-20) * MAP_CELL));
Vit = (player->Y - ((15 * 16) / 2));
int height = MapObj.GetMapHeight();
Vit = max(Vit, 0);
Vit = min(Vit, ((height-15) * MAP_CELL));
ViewX = player->X - Scroll;
ViewY = player->Y - Vit;
}
void CGameMain::ErrMes(LPCSTR str, ...) {
char buf[1024];
wsprintf(buf, str, (char*)(&str + 1));
MessageBox(NULL, buf, "Error!!", MB_OK);
}
void CGameMain::Move() {
}
void CGameMain::Draw() {
}
CGameMain::~CGameMain() {
DxLib_End();
//fclose(out); FreeConsole();
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPervInstance, LPSTR lpCmdLine, int nCmdShow) {
Game = new CGameMain;
while(ScreenFlip()==0&&ProcessMessage()==0&&ClearDrawScreen()==0) {
Game->Run();
}
delete Game;
}
[/code]