我正在編程SDL中的基於圖塊的地圖,並且Map
類的構造函數正在用於設置用於表示其中包含的每個對象的圖像。然而,我正在用我的Sprite
類的析構函數解決這個問題,這個類正在被用來釋放對象持有的SDL_Surface*
。析構函數被調用得很早,我不完全確定爲什麼。這是我的Map
構造函數的精簡版本,只是顯示瞭如何分配單元格的sprite。SDL析構函數調用太早
Map::Map(string fileName, int tileWidth, int tileHeight)
{
string mapData = ReadMap(fileName);
_cells = new MapCell[_width*_height];
for(int y = 0; y < _height; y++)
{
for(int x = 0; x < _width; x++)
{
int currentCell = y*_width+x;
if(mapData[currentCell] == '0' || mapData[currentCell] == 'P' || mapData[currentCell] == 'X')
{
_cells[currentCell]._sprite = Sprite(Point2D(x*tileWidth, y*tileHeight), "Assets/Graphics/Grass.bmp");
if(mapData[currentCell] == 'P')
_cells[currentCell]._sprite = Sprite(Point2D(x*tileWidth, y*tileHeight), "Assets/Graphics/Player.bmp");
if (mapData[currentCell] == 'X')
_cells[currentCell]._sprite = Sprite(Point2D(x*tileWidth, y*tileHeight), "Assets/Graphics/Target.bmp");
}
else if(mapData[currentCell] == '1')
_cells[currentCell]._sprite = Sprite(Point2D(x*tileWidth, y*tileHeight), "Assets/Graphics/Wall.bmp");
}
}
}
析構函數似乎在創建Sprite對象後立即調用。我在這裏錯過了什麼?我也試着在堆上分配MapCell
的_sprite
成員,但它會導致同樣的問題。據我所知,它不會超出範圍,因爲創建的Sprite
對象是Map
對象的一部分。
以下是我的構造函數和析構函數Sprite
類:
Sprite::Sprite(void)
{
_texture = NULL;
_position = Point2D::Zero();
}
Sprite::Sprite(Point2D position, std::string texPath)
{
_texture = Content::LoadBMP(texPath);
_position = position;
}
Sprite::~Sprite(void)
{
SDL_FreeSurface(_texture);
}
這裏是我的主,如果有幫助的所有:
int main(int argc, char* args[])
{
const int TILEWIDTH = 32;
const int TILEHEIGHT = 32;
// Initialization
InitSDL();
Map map = Map("Assets/Maps/Map3.txt", TILEWIDTH, TILEHEIGHT);
Window::SetSize(Rectangle(0, 0, map.GetWidth()*TILEWIDTH, map.GetHeight()*TILEHEIGHT));
PathFinder pathFinder = PathFinder();
List<Point2D> path = pathFinder.FindPath(map, map.GetPlayerStart(), map.GetTarget());
List<Sprite> PathNodes = List<Sprite>();
for(int i = 0; i < path.GetCount(); i++)
PathNodes.Add(Sprite(*path(i)*32, "Assets/Graphics/PathNode.bmp"));
bool quit = false;
SDL_Event Event;
while(quit == false)
{
while(SDL_PollEvent(&Event))
{
if(Event.type == SDL_QUIT)
quit = true;
}
map.Draw();
for(int i = 0; i < path.GetCount(); i++)
{
if(PathNodes(i)->GetPosition() != map.GetPlayerStart()*32 && PathNodes(i)->GetPosition() != map.GetTarget()*32)
PathNodes(i)->Blit();
}
Window::Flip();
}
//Quit SDL
SDL_Quit();
return 0;
}
準確地說:「3規則」和boost :: noncopyable是這裏的重要部分。 – Roddy 2013-02-27 13:17:29