我正在尝试进行某些对象的定期快照。为了实现此目的
-
调用TakeNapShot()的GameManager在我想保存的对象(std :: list对象;)它迭代槽槽,将其删除,并制作一个新对象复制我感兴趣的值的类型。
-
复制后,将新对象推到向量上,并创建一个新的gamestate对象(gamestate是"快照")。
-
然后将矢量存储在新的GameState对象中,并将GameState对象推入游戏机队列,如果队列的大小超过了一些预定的数量,则以FIFO的方式丢弃。
我遇到的问题是,对于游戏的以后计算,我需要将工作指针提供给游戏的最新快照。我尝试将其存储在公共游戏中*,但是当我从主函数中取出它时,它不会返回正确的值(?)。但是,如果我尝试在takeNapShot()中将其解释,则它将返回正确的值
fps.cpp
// FPS.cpp : Defines the entry point for the console application.
class GameState {
public:
std::vector<Object> objects;
};
class GameManager {
public:
int tick = 0;
int tickrate = 150;
int memorySize = tickrate;
std::list<Object*> objects;
std::queue<GameState> snapshots;
GameState * latestSnapshot;
void AddObject(Object* object) {
objects.push_back(object);
}
void TakeSnapshot() {
GameState snapshot;
std::vector<Object> objectsCopy;
std::list<Object*>::const_iterator it;
for (it = objects.begin(); it != objects.end(); ++it) {
Object copyObject;
copyObject.position = (*it)->position;
objectsCopy.push_back(copyObject);
}
snapshot.objects = objectsCopy;
latestSnapshot = &snapshot;
snapshots.push(snapshot);
if (snapshots.size() > memorySize) {
snapshots.pop();
}
cout << (*latestSnapshot).objects.size() << endl; // <--- RETURNS 2
}
};
int main(){
GameManager gameManager;
Object player;
Object player2;
player.position = Vector(154, 0, 0);
gameManager.AddObject(&player);
gameManager.AddObject(&player2);
GameState latestSnapshot = *gameManager.latestSnapshot;
cout << latestSnapshot.objects.size() << endl;// <--- RETURNS 0
}
编辑仅留下代码的相关部分。
正如@tesseractbird所说,发生了错误,因为指针指向被摧毁的对象,这使我指出了我添加到队列解决的最后一个值解决了问题。