如何处理360度蛇

我最近进入XNA,必须说我喜欢它。 作为一个你好的世界游戏,我决定创建经典游戏“蛇”。 90度的版本非常简单,易于实现。 但是,当我尝试制作一个允许使用左右箭头进行360度旋转的版本时,我遇到了一些问题。

现在我所做的是从90度的版本开始:每个蛇身部分从尾部开始迭代,直到头部前面。 每100毫秒移动一次,效果很好。 与此相关的问题是,它使游戏的风格变得波涛汹涌,因为技术上游戏的进展速度只有6fps,而不是60的潜力。

我想在每个游戏循环中移动蛇。 但不幸的是,由于蛇的速度与头部的大小相同,速度太快了。 这意味着头部将需要向更小的增量(如(2,2))方向移动,而不是我现在所拥有的(32,32)。 因为在管理学校的时候,我一直在关注这个游戏几个星期,所以我觉得我一直在想如何做到这一点。 这可能是一个简单的解决scheme,我只是没有抓住它。

这里有一些伪代码,基于对我有意义的东西,我试过了。 我真的不能想到另一种方式来做到这一点。

for(int i = SnakeLength - 1; i > 0; i--){ current = SnakePart[i], next = SnakePart[i - 1]; current.x = next.x - (current.width * cos(next.angle)); current.y = next.y - (current.height * sin(next.angle)); current.angle = next.angle; } SnakeHead.x += cos(SnakeAngle) * SnakeSpeed; SnakeHead.y += sin(SnakeAngle) * SnakeSpeed; 

这产生这样的事情: Code in Action 。 正如你所看到的,每个部分总是留在脑后,不会产生“跟踪”效应。

数据蠕虫是一个完美的例子,可以在这里find。 不是视口旋转,而是三角形的尾随效果。

谢谢你的帮助!

使用该algorithm,您可以使每个线段与其前面的线段具有相同的角度。 这就是为什么他们最终直接落后于头,他们最终都面临着同样的角度。 正如您在链接的数据蠕虫游戏中所看到的,每个段都面向前面的段 。 确定从当前片段到next片段的角度,并使片段指向该片段,而不是将其设置为next.angle

对于那个实现,你可能想要实际上从前到后迭代。 行为将根据您通过列表的方向而有所不同。 试试他们两个,看看哪个更好。

过去我曾经使用类似的方式创建项目原型( Unity WebPlayer链接 )。 我使用了类似的(尽管是3D)代码来让每个片段转向它前面的片段,并保持一定的距离。 像魅力一样工作。