VisualC++(2010Express)/DxLibでゲームを作りたい素人です。お世話になります。
今回はアクセス違反が起きてしまい、原因がまるで分からないので見ていただけませんか。
余計な部分が多々あるので、3つ目のコードmap.cppの59行目、MapData::LoadMapまで飛ばして読んでください。
翌日の追記:実行すると、そこの//エラーと書いている部分でブレークします
投稿直後の追記:同じ構造のつもりで1から書きなおすと、エラーが出なかったためこの形にさせていただきました。
//main.cpp
#include "DxLib.h"
#include "map.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
ChangeWindowMode(TRUE),DxLib_Init();
MapData::LoadMap("Picture/BasePipo.png");//呼び出し先でエラー
//入力待ち
while( CheckHitKeyAll() == 0 )
{
if( ProcessMessage() == -1 )
{
break;
}
}
DxLib_End();
return 0;
}
//map.h
#ifndef MAP_H //二重include防止
#define MAP_H
class MapBase
{//インタフェースクラス
public:
virtual void DrawMap() = 0;
virtual void ScrollUpdate() = 0;
virtual void SetThisLayer(char*,int) = 0;
virtual void FreeThisLayer() = 0;
virtual void ToScreen(int,int,int*,int*,int=1) = 0;
virtual void ToCell(int,int,int*,int*) = 0;//【警告】絶対位置を引数に取る
virtual bool IsPassable(int,int) = 0;//このレイヤのマスが通行可能か
virtual void SetCell_chipID(int,int,int) = 0;
virtual ~MapBase() = 0 {}
};
//マップ定義、全レイヤで共通
namespace MapData
{
//宣言のみ【警告】定義はcpp
extern int allLayerNum;
extern MapBase *layer;
//マップ定義用
void LoadMap(char*);
void DeleteMap();
void GetScroll(int *x,int *y);
void SetScroll(int x, int y);
void GetMapSize(int *width, int *height);
bool IsInsideMap(int x, int y);
bool IsPassable(int x,int y);
}
struct Layer
{
int chipID;
};
class MapBase_2 : public MapBase
{
protected:
int thisLayerNum;
Layer *thisLayer;//コンストラクタ内で動的に確保する
public:
void SetThisLayer(char*,int);
void FreeThisLayer();
//インタフェイス系の定義
int GetCell_chipID(int x, int y);
void SetCell_chipID(int x,int y,int chipID);
bool IsPassable(int x,int y);
};
class DMap : public MapBase_2
{
public:
//オーバーライド
void DrawMap();
void ScrollUpdate();
void ToScreen(int,int,int*,int*,int=1);
void ToCell(int screenX,int screenY,int *cellX,int *cellY);//絶対位置を引数に取る
};
class QMap : public MapBase_2
{
private:
public:
//オーバーライド
void DrawMap();
void ScrollUpdate();
void ToScreen(int,int,int*,int*,int=1);
void ToCell(int screenX,int screenY,int *cellX,int *cellY);//絶対位置を引数に取る
};
#endif //MAP_H
//map.cpp
#include "map.h"
#include <DxLib.h>
using namespace MapData;
namespace MapData
{
//定義
MapBase *layer;
//一時情報
int scrollX,scrollY;
//map
char *mapFile;
int mapWidth,mapHeight;
int allLayerNum;
int mapShiftX,mapShiftY;
//cell
int cellWidth,cellHeight;
//tile
char *tileGraph;
int tileWidth,tileHeight;//ピクセル
int *tileDiv;
//QMap用
int qCellWidth,qCellHeight;
int leftBlank,rightBlank,upBlank,downBlank;
int minScrollX,minScrollY;
int maxScrollX,maxScrollY;
void DeleteMap()
{
delete []layer;
}
void GetScroll(int *x,int *y)
{
*x = scrollX; *y = scrollY;
}
void SetScroll(int x, int y)
{
scrollX = x; scrollY = y;
}
void GetMapSize(int *width, int *height)
{
*width = mapWidth; *height = mapHeight;
}
bool IsInsideMap(int x, int y)
{
if(x >= 0 && x < mapWidth &&
y >= 0 && y < mapWidth )
{
return(TRUE);
}else
{
return(FALSE);
}
} bool IsPassable(int x,int y){return(TRUE);}
}
void MapData::LoadMap(char* file)
{
//map
mapFile = file;
allLayerNum = 3;
layer = new QMap[allLayerNum];
for(int i = 0; i < allLayerNum; i++)
{
layer[i].SetThisLayer("Picture/testmap1.txt",i);//エラー!
}
}
void MapBase_2::SetThisLayer(char *file,int a){}
void MapBase_2::FreeThisLayer(){}
int MapBase_2::GetCell_chipID(int x, int y)
{
if( IsInsideMap(x,y) == 1 )
{
return( thisLayer[x + y*mapWidth].chipID );
}else
{
return(-1);
}
}
void MapBase_2::SetCell_chipID(int x,int y,int chipID){}
bool MapBase_2::IsPassable(int x,int y){return(TRUE);}
//DMap
void DMap::DrawMap(){}
void DMap::ScrollUpdate(){}
void DMap::ToScreen(int cellX, int cellY,int *screenX, int *screenY, int returnType){}
void DMap::ToCell(int screenX,int screenY,int *cellX,int *cellY){}
//QMap
void QMap::DrawMap(){}
void QMap::ScrollUpdate(){}
void QMap::ToScreen(int cellX,int cellY,int *screenX,int *screenY,int returnType){}
void QMap::ToCell(int screenX,int screenY,int *cellX,int *cellY){}