编辑:已解决:我只是没有初始化 currLevel,这导致数据成员上的指针错误。
我正在使用 SDL 编写一个简单的游戏。游戏以解决迷宫为中心。每个迷宫都有一个相应的文本文件,我的程序会读取该文件并相应地设置一个 MazeMap 对象。
我单独测试了它,它似乎初始化得很好。但是,当我创建我的引擎类并在其中创建我的 MazeMap 对象时,我遇到了这个访问冲突,并且 Maze 的名称在调试器中被标记为错误指针。这是代码:
迷宫地图.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){
}
}
任何帮助表示赞赏。我意识到这里有很多代码,为此我深表歉意。我只想彻底。谢谢。