編集: 解決済み: currLevel を初期化していなかったため、データ メンバーに不適切なポインターが発生しました。
SDLを使って簡単なゲームを書いています。ゲームは迷路を解くことが中心です。各迷路には対応するテキスト ファイルがあり、プログラムがそれを読み取り、それに応じて MazeMap オブジェクトを設定します。
単独でテストしたところ、正常に初期化されているように見えました。しかし、エンジン クラスを作成し、その中に MazeMap オブジェクトを作成すると、このアクセス違反が発生し、デバッガーで Maze の名前が不良ポインターとしてマークされます。コードは次のとおりです。
MazeMap.h:
class MazeMap{
public:
MazeMap() {}
~MazeMap();
/*Initializes all the data members using a text file of the following format:
1 |-First line is the level number of the maze
level.png |-Background image for the level
Level Name |-Name of the level
4x4 |-Number of rows x cols
S.XX |-The actual map:
X... | -S: start location
XXX. | -X: Wall, .: passable ground
E... | -E: end of the level*/
void init(std::string level_file);
//Prints the maze to std::cout
void print() const;
//Calls uti::apply_surface() on all the surfaces to prepare them for blitting
// Surfaces are created for each tile.
// Will be called in Engine::render()
void drawMaze(SDL_Surface *screen) const;
private:
std::string MazeName; //THE CULPRIT!
int level,
rows,
cols;
std::vector< std::vector<Tile> > tiles;
SDL_Surface* background;
//Used in init() to get level, rows, cols, and MazeName,
// as well as initialize the background image.
void initMapInfo(std::fstream& map_in);
//Used in init() to convert the characters in the text file
// to tiles for the tile vector.
Tile convert_char_to_tile(char t) const;
//Used in print() to convert the tiles back to chars for
// printing.
char convert_tile_to_char(Tile t) const;
};
ランタイム エラーが発生している initMapInfo 関数:
void MazeMap::initMapInfo(std::fstream& map_in){
char x;
std::string holder;
//First line: get level number
std::getline(map_in, holder);
level = uti::string_to_int(holder);
//Second line: get background image file name
std::getline(map_in, holder);
background = uti::load_image(holder);
//Third line: get name of the level
std::getline(map_in, MazeName); //THIS LINE IS FAILING
//Fourth line: get rows and cols
std::getline(map_in, holder);
std::stringstream s(holder);
s >> rows >> x >> cols;
}
エンジンクラス:
class Engine{
public:
Engine();
void run();
private:
SDL_Surface *screen;
GameState currentState;
int currLevel;
MazeMap levels[NUM_LEVELS];
Player player;
//Initializes the screen and sets the caption.
void initSDL();
/******************************************************/
/* Primary functions to be used in the main game loop */
//First, input from the player will be taken
void processInput();
//Based on the user input, various game world elements will be updated.
void update();
//Based on what was updated, the screen will be redrawn accordingly.
void render();
/////////////////////////////////////////////////////////
};
run() 関数:
void Engine::run(){
bool play = true;
MazeMap *curr = &levels[currLevel];
curr->init(TEST_MAZE);
curr->drawMaze(screen);
while(play){
}
}
どんな助けでも大歓迎です。ここには多くのコードがあることを認識しています。そのため、お詫び申し上げます。徹底したいだけです。ありがとう。