我正在为我的俯视2D游戏制作移动引擎,但我在尝试解决以下问题时遇到了困难:
我可以解决摩擦问题(获取移动向量的长度,减少它的摩擦力,以相同的x:y比例进行投影),但我无法理解如何实现最大速度。我尝试了一种解决方案,即当玩家超过最大速度时根本不允许行走,但这违反了第4点。而且,它还有一个不好的副作用,当你向左以最大速度移动并开始按下时,移动方向几乎没有改变。然后,我开始思考各种向量之间的差异和其他问题,但我大多数情况下已经无法跟上或遇到早期问题。因此,总之,有人能解释一下如何实现满足以上所有要求的系统,或者指出一篇解释如何实现这样的系统的文章吗?不用担心建议某些复杂的东西,只要给我一些时间,我就能掌握甚至困难的概念。感谢您的帮助!
- 玩家可以使用箭头键移动,这将使您在各自方向上加速。有摩擦力,所以释放键后您会停止移动,但不会立即停止。
- 当您按住两个垂直的键时,您以45°的方向加速,速度与在一个轴上相同
- 有一个最大速度,超过这个速度您不能通过步行来加速,这也限制了您的最大步行速度。然而,如果您被撞飞,就可能超过这个速度。
- 如果您移动得比最大步行速度快,如果您按反方向的键,您可以更快地减速
gameTick(){
tempX += LeftKeyHeld ? -1 : 0;
tempX += RightKeyHeld ? 1 : 0;
tempY += UpKeyHeld ? -1 : 0;
tempY += DownKeyHeld ? 1 : 0;
ratio = 0.71;
if( |tempX| == |tempY| ) {
tempX =tempX* ratio;
tempY =tempY* ratio;
}
player.x += tempX;
player.y += tempY;
}
我可以解决摩擦问题(获取移动向量的长度,减少它的摩擦力,以相同的x:y比例进行投影),但我无法理解如何实现最大速度。我尝试了一种解决方案,即当玩家超过最大速度时根本不允许行走,但这违反了第4点。而且,它还有一个不好的副作用,当你向左以最大速度移动并开始按下时,移动方向几乎没有改变。然后,我开始思考各种向量之间的差异和其他问题,但我大多数情况下已经无法跟上或遇到早期问题。因此,总之,有人能解释一下如何实现满足以上所有要求的系统,或者指出一篇解释如何实现这样的系统的文章吗?不用担心建议某些复杂的东西,只要给我一些时间,我就能掌握甚至困难的概念。感谢您的帮助!
If (|tempX, tempY| > maxSpeed) { tempX = sign(tempX)*maxSpeed*ratio; tempY=sign(tempY)*maxSpeed*ratio; }
应该可以解决这个问题。 - JABsign(x)
来指出需要考虑tempX/tempY的符号。 - JAB