首先,XNA也使用C#,因此它是相同的编程语言。而且尽管底层API可能与DirectX有所不同,但与跳转无关,因此此处应使用相同的教程或答案。另外,取决于许多因素,有很多方法可以实现此目的。我将在下面描述的只是可能性之一。
基本物理要求
首先,在更新循环中需要一些基本的物理变量和计算。特别是,您需要定义位置,速度和重力,并且更新循环应该执行与此大致相似的操作(为简单起见,省略了碰撞检测和响应):
float positionX, positionY; // Position of the character
float velocityX, velocityY; // Velocity of the character
float gravity = 0.5f; // How strong is gravity
void Update(float time)
{
positionX += velocityX * time; // Apply horizontal velocity to X position
positionY += velocityY * time; // Apply vertical velocity to X position
velocityY += gravity * time; // Apply gravity to vertical velocity
}
固定高度跳
现在,无论按多长时间,实现始终具有相同高度的跳转的最简单方法就是更改垂直速度一次。这将使角色开始上升,而重力将自动照顾将其放下:
void OnJumpKeyPressed()
{
velocityY = -12.0f; // Give a vertical boost to the players velocity to start jump
}
重要提示如果您的角色不在地面上,您将不希望开始跳跃,因此您需要为此添加一个检查。
可变高度跳
但是像Mario和Sonic这样的游戏具有可变的跳跃,跳跃的高度取决于您按下按钮的时间。在这种情况下,您需要同时按下和释放跳转键。您可以添加如下内容:
void OnJumpKeyReleased()
{
if(velocityY < -6.0f) // If character is still ascending in the jump
velocityY = -6.0f; // Limit the speed of ascent
}
在上面的代码中调整所有这些值(例如0.5
,-12.0f
或-6.0f
),您可以更改跳动的感觉,跳高程度,即使松开跳动按钮后仍保持多少动力,跌落速度等等。 。
重要不要在每一帧都调用这些函数。按下或释放键时仅调用一次。否则,您的角色将飞行而不是跳跃。
工作范例
我刚刚创建了一个上述技术的快速示例,您可以在此处的浏览器上尝试该示例(按鼠标键进行跳转,将其释放到中间以控制跳转的高度)。它在JS中,但是就像我前面提到的,在这种情况下,语言是无关的。
http://jsfiddle.net/LyM87/