存储在内存中时位置无效?

Locations not valid when stored in memory?

我在让存储在 creep 内存中的位置正常工作时遇到了一些问题。例如,这段代码:

var sources = creep.room.find(FIND_SOURCES);
if(creep.memory.sourceLocationIndex == null) {
    creep.memory.sourceLocationIndex = Math.floor(Math.random() * sources.length);
}
return sources[creep.memory.sourceLocationIndex];

完美运行,但是这段代码:

if(creep.memory.sourceLocation == null) {
    var sources = creep.room.find(FIND_SOURCES);
    var sourceLocationIndex = Math.floor(Math.random() * sources.length);
    creep.memory.sourceLocation = sources[sourceLocationIndex];
}
return creep.memory.sourceLocation;

似乎一旦 creep 移动就会失败。为什么会发生这种情况?我应该做些什么不同的事情?

bame53 在我的 Reddit post 中给出了一个很好的答案: https://www.reddit.com/r/screeps/comments/6jfjob/locations_not_valid_when_stored_in_memory/djdzgn1/

我花了很长时间才弄清楚,但是一旦你知道哪里出了问题,它为什么不起作用就很有意义了。

您不能在内存中存储游戏对象。

我看到其他人也使用的替代方法是存储 ID。

creep.memory.sourceId = sources[sourceLocationIndex].id;

以后

var source = Game.getObjectById(creep.memory.sourceId);