将尾巴添加到贪吃蛇游戏 [c++ sfml]
Adding tail to snake game [c++ sfml]
我想移动蛇的尾巴来填补它每次头部移动时产生的空隙:
.ooox
.ooo x
. ooox
所以基本上最后一个元素移动到间隙中。我可以获得间隙的位置并在那里创建一个尾巴但是一旦我有超过 1 个尾巴 object 它就无法正常工作。我相信它会在与其他尾巴相同的位置创建新的尾巴 object,因此存在差距。尾 = rep
尾部
//If tail exists
if(imamoRep)
{
rep[repCount-1].setPosition(gap);
temp[0] = rep[repCount-1]; //Remember last element
for(int i=1;i<repCount;i++)
{
rep[i] = rep[i-1];
}
rep[0]=temp[0]; //assign last element to first
}
绘图
for(int i=0; i<repCount; i++)
{
window.draw(rep[i]);
}
我猜我对数组做错了什么,最后一个元素应该放在第一位,所有其他元素应该向左移动,所以有一个新的最后一个尾巴。我在开始时创建了 100 个尾部元素,所以我只需要正确绘制它们即可。如果我删除除了设置位置的第一行之外的尾部代码,那么我会得到这个结果:
尾巴被留在后面,因为只有最后一个元素的位置发生变化,否则如前所述所有尾巴都在同一位置。我真的很想得到帮助。
你几乎成功了。想想这个循环对你的职位做了什么:
for(int i = 1; i < repCount; ++i)
{
rep[i] = rep[i - 1];
}
从 i=1
开始,它会分配 rep[1]
rep[0]
的值。接下来对于 i=2
它将分配 rep[2]
rep[1]
的值,该值在上一次迭代中被 rep[0]
覆盖。等等...
您需要做的是在写入 i
处的元素之前反转在 i+1
处写入元素的循环:
for(int i = repCount - 1; i > 0; --i)
{
rep[i] = rep[i - 1];
}
请注意 std::copy_backward 通常实现此行为。 IE。您可以将上面的循环重写为:
if(repCount > 0)
{
// Assuming rep is a std::vector using std::vector::begin
std::copy_backward(rep.begin(), rep.begin() + repCount - 1, rep.begin() + repCount);
}
我想移动蛇的尾巴来填补它每次头部移动时产生的空隙:
.ooox
.ooo x
. ooox
所以基本上最后一个元素移动到间隙中。我可以获得间隙的位置并在那里创建一个尾巴但是一旦我有超过 1 个尾巴 object 它就无法正常工作。我相信它会在与其他尾巴相同的位置创建新的尾巴 object,因此存在差距。尾 = rep
尾部
//If tail exists
if(imamoRep)
{
rep[repCount-1].setPosition(gap);
temp[0] = rep[repCount-1]; //Remember last element
for(int i=1;i<repCount;i++)
{
rep[i] = rep[i-1];
}
rep[0]=temp[0]; //assign last element to first
}
绘图
for(int i=0; i<repCount; i++)
{
window.draw(rep[i]);
}
我猜我对数组做错了什么,最后一个元素应该放在第一位,所有其他元素应该向左移动,所以有一个新的最后一个尾巴。我在开始时创建了 100 个尾部元素,所以我只需要正确绘制它们即可。如果我删除除了设置位置的第一行之外的尾部代码,那么我会得到这个结果:
尾巴被留在后面,因为只有最后一个元素的位置发生变化,否则如前所述所有尾巴都在同一位置。我真的很想得到帮助。
你几乎成功了。想想这个循环对你的职位做了什么:
for(int i = 1; i < repCount; ++i)
{
rep[i] = rep[i - 1];
}
从 i=1
开始,它会分配 rep[1]
rep[0]
的值。接下来对于 i=2
它将分配 rep[2]
rep[1]
的值,该值在上一次迭代中被 rep[0]
覆盖。等等...
您需要做的是在写入 i
处的元素之前反转在 i+1
处写入元素的循环:
for(int i = repCount - 1; i > 0; --i)
{
rep[i] = rep[i - 1];
}
请注意 std::copy_backward 通常实现此行为。 IE。您可以将上面的循环重写为:
if(repCount > 0)
{
// Assuming rep is a std::vector using std::vector::begin
std::copy_backward(rep.begin(), rep.begin() + repCount - 1, rep.begin() + repCount);
}