跳跃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代码中抽象出一个机制来简化处理跳转。
为了防止未站立在物体上而跳跃,您需要进行碰撞测试,或者在物体碰撞/停止碰撞时进行跟踪。也可以检查物体的垂直速度是否为零,并且只允许跳跃(防止跳落或上移时跳跃)。
我相信这可能是答案:
改变你的
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;
}
与速度给定其他的答案真的是更好的方法,但是这可能是足够接近让你重新开始。
您也可以使用!跳跃而不是基于解决方案的条件语句,如果它更适合您的引力模型。 –
我试了一下,但它不工作..精灵不跳。 如果我改变xPosition - =新的矢量(0,5)到新的矢量(0,20)或更高的精灵跳跃一点,但仍然不会下降:( 我卡住:( – phadaphunk
我试过!跳起来,但我似乎无法使其工作... – 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){}
跳跃不应该是一个布尔值,除非你需要它像动画或只能在跳跃时使用的能力。
相反,您应该使用矢量运动,当玩家触摸地面并按下跳跃按钮时,向您的运动添加向上的跳跃矢量。
然后,重力需要是一个向下的向量,对抗玩家,它会处理自己。
我真的很喜欢这种方法!但我是新来的,并不能找出什么,而不是“GameWorld” – phadaphunk
无论你保持你的游戏对象,无论是世界,场景管理器等等。你可能想要保留一组物理对象(只有可移动的对象,而不用静态水平)并使用它。 – ssube
+1;好的建议。我的两分钱:取决于你的游戏,有时候更多的假物理学可以给你更好的结果,阿拉马里奥游戏,或者几乎所有的NES或SNES时代平台游戏,当你设计你的关卡时,你会有更简单的计算/更少的实验,而且不会很难解决索姆诸如“隧道”之类的东西,或者意外地使你的物理在不同的机器上以不同的方式工作。它不会像一般的寿星。如果你按照这个答案所建议的那样采用更加广义的速度/加速度方法,那么你可能还需要研究模拟终点速度。 –