Относительно простой способ справиться с прыжками - реализовать гравитацию как вектор, а прыжки / движения - как импульс.
Например:
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 до единой механики.
Чтобы не допустить прыжка, не стоя на объекте, вам необходимо выполнить тест на столкновение или отследить, когда объекты сталкиваются / перестают сталкиваться в направлении вниз. Также возможно проверить, равна ли вертикальная скорость объекта нулю, и разрешить прыжки только тогда (это предотвратит прыжки при падении или движении вверх).