我正在努力做这个人正在做的事情,但我认为他的要求可能比我少,因为那篇文章中的答案似乎不适用于我的游戏。让我内联他的算法,这样我的问题就更容易理解了:
最简单的解决方案是从尾到头循环并将当前的位置设置为下一段的位置,即:
segment[i].position = segment[i - 1].position
我认为我们的要求之间的主要区别是我希望在每个刻度上移动每块小于它自己的宽度/高度。例如:
假装这些正方形水平对齐(我把它画成未对齐的,因为我认为这样更容易看到发生了什么)。红色H
是头部当前所在的位置。红色T
是尾巴当前所在的位置。黑色H'
是头部应该下一个刻度的位置。所以蛇从右向左移动。如果我使用上述算法,这些段不会重叠或开始分开吗?让我一步一步来玩:
- 创建 H'.position
- T.位置 = H.位置
- H.position = H'.position
这样做的结果将变为:
我可以使用什么算法来确保所有部件以相同的速度移动并保持相同的距离?
我会给出我的想法,但我对此持怀疑态度,因为我的研究没有显示其他人使用它:
每个段将存储它的坐标和方向。例如:[[50, 50, LEFT], [100, 50, LEFT]]
。头部是索引 0,尾部是索引 1。 蛇移动的速度是 10,即使分段是 50x50。
每个刻度我都会这样做:
- 如果按下鼠标,则用按下的方向覆盖
nextDirection
变量。否则,nextDirection
无论它是最后一个勾号。在此示例中,假设有人按下UP
。 - 迭代数组并将方向应用于每个刻度。例如:
[[40, 50, LEFT], [90, 50, LEFT]]
- 将方向从头转移到尾,并将头的新方向设置为
nextDireciton
。例如:[[40, 50, UP], [90, 50, LEFT]]
- 重复每个刻度。
这个算法看起来可行吗?我问的部分原因是因为它比其他人的算法更复杂,所以我觉得我做错了什么。而且,我对他的算法思考得越多,它似乎就越行不通。
改写我的问题
假设蛇的每个部分都是一个 20x20 像素的矩形。每个刻度,我希望头部向某个方向移动 5 个像素。 如何确保所有部分保持相互接触?
@Rafe 在下面的评论中的描述是:
考虑蛇在 step 占据的有序位置集,
t
最左边是尾巴,最右边是头部:{A, B, C, D, E}
。在 stept+1
处,蛇所占据的有序位置集是{B, C, D, E, F}
尾巴从哪里移动A
到哪里B
,头部从哪里移动E
到哪里F
。
而且我认为这个算法不起作用,因为:
是的,但如果
A = B = C = D = E = F = 20px
. 移动{A, B, C, D, E}
,使其{B, C, D, E, F}
仅在右侧添加 20px 并从左侧移除 20px。这不是说他移动了 20px,而不是 5px? 我想移动 5px,而不是 20px 如果您说这是通过您的建议完成的,请说明如何。我没看到。