我正在开发我的第一个XNA 2D游戏,我遇到了一些问题。 如果我跳,我的精灵跳跃但不会跌倒。 而且我还有另一个问题,用户可以按住空格键跳到他想要的高度,我不知道如何阻止他这样做。这是我的代码: 跳跃:
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;
}
这里是通过碰撞将接地设置为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;
}
接地的布尔和重力已经过测试并且正在工作。 有什么想法吗? 在此先感谢您,不要犹豫,询问您是否需要另一部分规范。
答案 0 :(得分:5)
处理跳跃的一种相对简单的方法是将重力作为矢量并以跳跃/移动的方式实现。
例如:
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代码抽象为单一机制来简化处理跳转。
为了防止在没有站立在物体上的情况下跳跃,您需要进行碰撞测试,或者在物体碰撞/停止向下碰撞时进行追踪。也可以检查物体的垂直速度是否为零并且仅允许跳跃(在下降或向上移动时防止跳跃)。
答案 1 :(得分:2)
我相信这可能就是答案:
改变你的
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;
}
使用速度给出的其他答案确实是更好的方法,但这可能足够接近让你重新开始。
答案 2 :(得分:1)
这是一个非常质朴的解决方案,可以让跳跃起伏不定:
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){}
答案 3 :(得分:0)
跳跃不应该是布尔值,除非你需要它来制作动画或只能在跳跃时使用的能力。
相反,你应该使用矢量移动,当玩家触地并按下他们的跳跃按钮时,向你的动作添加向上跳跃矢量。
然后,重力需要成为一个向下的向量,对付玩家并且它会处理自己。