我正在尝试使用某些对象的定期快照。为此,我使用TakeSnapshot()方法,其工作方式如下:
调用TakeSnapshot()的游戏管理器有一个指向我想保存的对象的指针列表(std :: list objects;)它通过指针迭代,取消引用它们并创建一个新的复制我感兴趣的值的相同类型的对象。
复制后,新对象被推送到矢量上,并创建一个新的GameState对象(游戏状态是'快照')。
然后它将向量存储在新的GameState对象中,并将GameState对象推送到游戏状态队列中,如果队列大小超过某个预定量,则以FIFO方式丢弃。
我遇到的问题是,为了以后的游戏计算,我需要有一个指向游戏最新快照的工作指针。我试图将它存储在公共GameState *中,但是当我从Main函数中取消引用它时,它不会返回正确的值(?)。但是如果我尝试在TakeSnapshot()中取消引用它,它将返回正确的值
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
}
编辑只留下代码的相关部分。
答案 0 :(得分:0)
正如@tesseractBird所说,错误是由于指针指向一个被破坏的对象引起的,使得它指向我添加到队列中的最后一个值解决了问题。