这可能是非常基本的东西,但我似乎无法看到我搞砸了。
我有一个Cubes的向量(抽象类Node的子类),每个都包含一个包含其在平面上的位置的x和z位置的body对象。我试图将每个人都按照“跟随领导者”的方式移动,就像一个立方体的新位置是前任所在的样式。
由于我正在使用指针,这是我现在有点困惑的地方,它们都会到达相同的位置(snake.x和snake.z所在的位置)所以我知道它们都指向相同的数据。
想知道我需要改变什么,以便每个都能反映出正确的坐标。
void updateChildren()
{
Node * prevPiece;
typedef std::vector<Node*>::iterator It;
for(It curNode=nodes.begin(); curNode!=nodes.end(); ++curNode)
{
if (curNode == nodes.begin())
{
prevPiece = *curNode;
dynamic_cast<Cube*>(*curNode)->body.xPos = snake.xPos;
dynamic_cast<Cube*>(*curNode)->body.zPos = snake.zPos;
}
else
{
Node * tmp = *curNode;
dynamic_cast<Cube*>(*curNode)->body.xPos = dynamic_cast<Cube*>(prevPiece)->body.xPos;
dynamic_cast<Cube*>(*curNode)->body.zPos = dynamic_cast<Cube*>(prevPiece)->body.zPos;
prevPiece = tmp;
}
}
}
答案 0 :(得分:1)
您将第一个立方体的位置指定给蛇位置,然后将每个后续立方体分配到此位置。
基本上每次迭代都是这样做的:
current.position = previous.position.
previous = current; // The "previous position" has been overwritten
... next iterationn ...
current.position = previous.position; // previous.position is the new vlaue
previous = current;
...
您需要在分配之前暂时保存以前的位置,否则只需将所有内容分配给该位置。
答案 1 :(得分:0)
您正在修改头部,然后将任何后续元素设置为相同的头部值。
快速解决方法是从底部向上反向执行,以便在为元素分配新值时,我们知道不再需要旧值。这是使用reverse_iterator
s:
void updateChildren()
{
for(auto curNode = nodes.rbegin(); curNode!=nodes.rend()-1; ++curNode)
{
dynamic_cast<Cube*>(*curNode)->body.xPos = dynamic_cast<Cube*>(*(curNode+1))->body.xPos;
dynamic_cast<Cube*>(*curNode)->body.zPos = dynamic_cast<Cube*>(*(curNode+1))->body.zPos;
}
dynamic_cast<Cube*>(nodes.front())->body.xPos = snake.xPos;
dynamic_cast<Cube*>(nodes.front())->body.zPos = snake.zPos;
}