我正在开发我的第一个XNA 2D游戏,我有一点问题.如果我跳,我的精灵跳跃但不会跌倒.而且我还有另一个问题,用户可以按住空格键跳到他想要的高度,我不知道如何阻止他这样做.这是我的代码:跳转:
if (FaKeyboard.IsKeyDown(Keys.Space))
{
Jumping = true;
xPosition -= new Vector2(0, 5);
}
if (xPosition.Y >= 10)
{
Jumping = false;
Grounded = false;
}
Run Code Online (Sandbox Code Playgroud)
真正简单的基本重力:
if (!Grounded && !Jumping)
{
xPosition += new Vector2(1, 3) * speed;
}
Run Code Online (Sandbox Code Playgroud)
这里是通过碰撞将接地设置为True或False的位置
Rectangle MegamanRectangle = new Rectangle((int)xPosition.X, (int)xPosition.Y, FrameSizeDraw.X, FrameSizeDraw.Y);
Rectangle Block1Rectangle = new Rectangle((int)0, (int)73, Block1.Width, Block1.Height);
Rectangle Block2Rectangle = new Rectangle((int)500, (int)73, Block2.Width, Block2.Height);
if ((MegamanRectangle.Intersects(Block1Rectangle) || (MegamanRectangle.Intersects(Block2Rectangle))))
{
Grounded = true;
}
else
{
Grounded = false;
}
Run Code Online (Sandbox Code Playgroud)
接地的布尔和重力已经过测试并且正在工作.有什么想法吗?在此先感谢您,不要犹豫,询问您是否需要另一部分代码.
处理跳跃的一种相对简单的方法是将重力作为矢量并且作为冲动跳跃/移动.
例如:
foreach (Object obj in GameWorld)
{
obj.Velocity *= 0.5; // Slow it down slightly
obj.Velocity += GravityPerSecond * FrameTime; // Gravity adjusted for time
obj.Move(obj.Velocity); // Handle collision and movement here
}
Run Code Online (Sandbox Code Playgroud)
速度应该是一个与世界尺寸相同的矢量,并且移动一个方法,在给定的矢量中尽可能地移动对象.
跳码:
OnKeyDown(Key k)
{
if (k == Key.Space)
{
obj.Velocity += Vector2(0, 10); // Add an upward impulse
}
}
Run Code Online (Sandbox Code Playgroud)
这将导致对象向上移动一点,然后开始下降.您可以对其他效果(运动,爆炸,碰撞)使用类似的冲动.当两个物体碰撞时,你需要碰撞修改速度,以便弹跳.
这是一个非常简单的物理系统,它将使未来的变化更加简单,并且可以允许一些有趣的关卡设计(改变重力等).它通过将复杂的IsJumping代码抽象为单个机制来简化处理跳转.
为了防止在没有站立在物体上的情况下跳跃,您需要进行碰撞测试,或者在物体碰撞/停止向下碰撞时进行跟踪.也可以检查物体的垂直速度是否为零并且仅允许跳跃(防止在下降或向上移动时跳跃).