跳跃VS. Gravity

跳跃VS. Gravity

问题描述:

我正在开发我的第一款XNA 2D游戏,并且遇到了一些问题。 如果我跳,我的精灵跳,但不会掉下来。 而且我还有另外一个问题,用户可以让空格键跳到他想要的高度,我不知道如何阻止他这么做。这里是我的代码: 跳:跳跃VS. Gravity

if (FaKeyboard.IsKeyDown(Keys.Space)) 
     { 
      Jumping = true; 
      xPosition -= new Vector2(0, 5); 
     } 

     if (xPosition.Y >= 10) 
     { 
      Jumping = false; 
      Grounded = false; 
     } 

真正简单的基本比重:

if (!Grounded && !Jumping) 
     { 
      xPosition += new Vector2(1, 3) * speed; 
     } 

这里的哪来的接地设置为真或假的碰撞

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; 
     } 

的接地布尔和重力已经过测试并正在工作。 任何想法为什么? 提前致谢,并不要犹豫,询问您是否需要其他部分代码。

处理跳跃的一种相对简单的方法是将重力作为矢量并将跳跃/移动作为脉冲。

例如:

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 
} 

速度应与相同的尺寸世界的矢量,并且其移动中给出的向量尽可能移动对象的方法。

跳转代码:

OnKeyDown(Key k) 
{ 
    if (k == Key.Space) 
    { 
     obj.Velocity += Vector2(0, 10); // Add an upward impulse 
    } 
} 

这将导致对象向上移动了一下,然后开始下降。对于其他效果(移动,爆炸,碰撞)您可以使用类似的冲动。两个物体碰撞时需要碰撞修改速度,以便弹跳。

这是一个非常简单的物理系统,将使未来的变化更加简单,并可能允许一些有趣的关卡设计(改变重力等)。它通过从复杂的IsJumping代码中抽象出一个机制来简化处理跳转。

为了防止未站立在物体上而跳跃,您需要进行碰撞测试,或者在物体碰撞/停止碰撞时进行跟踪。也可以检查物体的垂直速度是否为零,并且只允许跳跃(防止跳落或上移时跳跃)。

+0

我真的很喜欢这种方法!但我是新来的,并不能找出什么,而不是“GameWorld” – phadaphunk

+1

无论你保持你的游戏对象,无论是世界,场景管理器等等。你可能想要保留一组物理对象(只有可移动的对象,而不用静态水平)并使用它。 – ssube

+1

+1;好的建议。我的两分钱:取决于你的游戏,有时候更多的假物理学可以给你更好的结果,阿拉马里奥游戏,或者几乎所有的NES或SNES时代平台游戏,当你设计你的关卡时,你会有更简单的计算/更少的实验,而且不会很难解决索姆诸如“隧道”之类的东西,或者意外地使你的物理在不同的机器上以不同的方式工作。它不会像一般的寿星。如果你按照这个答案所建议的那样采用更加广义的速度/加速度方法,那么你可能还需要研究模拟终点速度。 –

我相信这可能是答案:

改变你的

if (FaKeyboard.IsKeyDown(Keys.Space)) 
    { 
     Jumping = true; 
     xPosition -= new Vector2(0, 5); 
    } 

    if (xPosition.Y >= 10) 
    { 
     Jumping = false; 
     Grounded = false; 
    } 

if (!Jumping && FaKeyboard.IsKeyDown(Keys.Space)) 
    { 
     Jumping = true; 
     Grounded = false; 
    } 

    if (Jumping) 
    { 
     xPosition -= new Vector2(0, 5); 
    } 

    if (xPosition.Y >= 10) 
    { 
     Jumping = false; 
    } 

与速度给定其他的答案真的是更好的方法,但是这可能是足够接近让你重新开始。

+0

您也可以使用!跳跃而不是基于解决方案的条件语句,如果它更适合您的引力模型。 –

+0

我试了一下,但它不工作..精灵不跳。 如果我改变xPosition - =新的矢量(0,5)到新的矢量(0,20)或更高的精灵跳跃一点,但仍然不会下降:( 我卡住:( – phadaphunk

+0

我试过!跳起来,但我似乎无法使其工作... – phadaphunk

这里是一个非常质朴的解决方案,使跳涨有跌:

const float SCALE = 20.0f; //SPEED!!! 
if (jump <= 15 && jump != 0) 
      { 
       humanPosition.Y -= SCALE * speed; 
       jump++; 
      } 
      else if (jump > 15) 
      { 
       humanPosition.Y += SCALE * speed; 
       jump++; 
       if (jump == 32) 
       { 
        jump = 0; 
        humanPosition.Y = 307; 
       } 
      } 

,并通过

  else if (keyboard.IsKeyDown(Keys.Up)) 
     { 
      jump = 1; 
      humanPosition.Y -= SCALE * speed; 
     } 

这里做运动设置跳跃启动将其设置为1 此外,如果你想限制跳跃只有当字符在地面上,你可以添加一个类似的条件

if (humanPosition.Y != GROUNDLEVEL){} 

跳跃不应该是一个布尔值,除非你需要它像动画或只能在跳跃时使用的能力。

相反,您应该使用矢量运动,当玩家触摸地面并按下跳跃按钮时,向您的运动添加向上的跳跃矢量。

然后,重力需要是一个向下的向量,对抗玩家,它会处理自己。