我正在研究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
并且永不停止。我在这做错了什么?这只是完全错误的方法吗?
答案 0 :(得分:11)
我完全错了,我很害怕。您知道位置,速度和加速吗?
速度是位置随时间的变化。加速度是速度随时间的变化。重力是一种向下的加速度,因此随着它们的下降,事物变得更快。
以下是一些可能有助于说明这一概念的代码:
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;
如果使用此代码向上拍摄物体,则可以获得(非常多)逼真的轨迹。这是跳跃的良好起点。
启动跳转的最简单方法是在按下跳转键时添加一些向上的速度。上面的代码将使角色退缩。
然而值得注意的是,好的平台游戏者会采用很多技巧来让跳跃感觉更好。最特别的是,跳跃的高度可以通过按下跳跃按钮多长来调节。通过让玩家立即开始向下移动来使这种感觉响应很重要。快速执行此操作的方法是将速度设置为零,并在玩家向下移动时施加额外的重力。但这确实是你必须调整的东西。
答案 1 :(得分:0)
您使用什么来进行碰撞检测/响应?这会影响它。 但是,至少需要速度和位置。一个例子可能是:
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
添加到X
的{{1}}部分。对左键执行相反的操作(减去它),并向上和向下修改Velocity
。这将产生滑动效果,就像在冰上一样。对于重力,只需在每个步骤中向Y部分添加少量,以使玩家“摔倒”。
要让玩家跳跃(简单方法),只需按下空格即可将Y
速度设置为Y
或其他内容。角色会向上移动,并最终因为你之前提到的“引力”而倒下。