c# XNA 2D平台跳跃逻辑
本文关键字:跳跃 平台 XNA 2D | 更新日期: 2023-09-27 18:01:50
我正在制作一款2D平台游戏作为学习实验,目前在跳跃逻辑上遇到了一点麻烦。我理解重力应该作用于玩家身上,这会影响跳跃和下降的过程。以下是我目前如何实现它的。
isJumping
只是一个bool
,我用它来知道玩家是应该向上还是向下,以及他们目前是否在跳跃中,所以他们不会再跳了。
spriteJumpPosition
是我用来限制玩家跳跃的高度的值(默认为0,上限为10在下面硬编码)。
void UpdateGravity()
{
// Check if player is currently jumping
if (isJumping == true)
{
if (spriteJumpPosition < 10)
{
spritePosition.Y += (float)gravity;
spriteJumpPosition += gravity;
}
else if ( spriteJumpPosition >= 10 )
{
isJumping = false;
spritePosition.Y -= (float)gravity;
spriteJumpPosition -= gravity;
}
}
else if ( isJumping == false )
{
if (spriteJumpPosition > 0)
{
spriteJumpPosition -= (int)gravity;
spritePosition.Y -= (float)gravity;
}
}
}
使用上述代码,当前的行为是玩家向下移动一点(可能是2-3帧),然后开始向上移动,使用isJumping = false
并且永远不会停止。我哪里做错了?这是完全错误的做法吗?
恐怕完全错了。你知道位置、速度和加速度吗?
速度是位置随时间的变化。加速度是速度变化量除以时间。重力是向下的加速度,因此物体下落时速度更快。
下面的一些代码可能有助于说明这个概念:
Vector2 position;
Vector2 velocity;
readonly Vector2 gravity = new Vector2(0, -9.8f);
// Update:
float time = (float)GameTime.ElapsedGameTime.TotalSeconds;
velocity += gravity * time;
position += velocity * time;
如果你用这段代码向上发射一个物体,你可以得到一个(几乎)真实的轨迹。这是一个很好的跳跃起点。
开始跳跃的最简单方法是在按下跳跃键时增加一些向上的速度。上面的代码将把字符拉下来。
然而值得注意的是,优秀的平台游戏会使用许多技巧来使跳跃感觉更好。最特别的是,跳跃的高度可以通过按下跳跃按钮的时间来调节。通过让玩家立即开始向下移动,让玩家感受到响应性是很重要的。一种快速的方法是将速度设置为零,并在玩家向下移动时施加额外的重力。但这是你必须调整的
您使用什么来进行碰撞检测/响应?这会有一点影响。然而,你至少需要速度和位置。例如:
class Player
{
Vector2 Position;
Vector2 Velocity;
}
// in the constructor:
Position = new Vector2 (YOUR POSITION HERE);
Velocity = Vector2.Zero;
然后每个时间步都将Velocity
添加到Position
(创建一个Player.Update()
方法并从默认的Update
方法调用它)。然后,当您想移动时,将每个时间步添加到Velocity
。例如,检测何时按下右键,并将0.5f
添加到Velocity
的X
部分。对左键做相反的操作(减去它),并修改Y
为上下键。这会造成滑动的效果,就像在冰上一样。对于重力,只需在每个时间步骤中添加少量的Y部分,以使玩家"下落"。
要让玩家跳跃(最简单的方法),只要在按下空格时将Y
的速度设置为-5
或其他速度即可。角色会向上移动,最终因为你的"重力"而下落。