Platformer中的C ++ / SDL Gravity

时间:2014-07-23 01:18:07

标签: c++ sdl

我目前正试图在我的平台游戏中获得一种引力(它不需要完全重力,不需要现实主义),但是我在这方面遇到了绊脚石。

以下代码是我按下向上箭头或W时所使用的代码(跳跃)

if (grounded_)
{
    velocity_.y -= JUMP_POWER;
    grounded_ = false;
}

在我的Player::Update()函数中

velocity_.y += GRAVITY;

该功能还有更多功能,但与情况无关。

目前,两个常量如下:GRAVITY = 9.8f;JUMP_POWER = 150.0f;

我的引力主要问题是我无法在我的精灵能够跳跃之间找到适当的平衡,并且过于浮躁。

长话短说,我的问题是,我的精灵跳跃以及他经常从一个平台掉到另一个平台上太过浮动,任何关于如何将它缩放回更现实的想法?

2 个答案:

答案 0 :(得分:2)

不要考虑实际价值,而应考虑其后果。

因此,初始速度是-jump_power,加速度重力。一点点微积分给出了

y = -Height = -jump_power * t + 1/2 * gravity * t^2

这假设一小段时间。

然后,

time_in_flight = 2 * time_to_vertex = jump_power/gravity

,顶点是

height(time_to_vertex) = jump_power^2/(4 * gravity)

解决这些问题,并调整时间步长和修正底片

jump_power = (4 * height / time) * timestep_in_secs_per_update

gravity = (2 * jump_power / time) * timestep_in_secs_per_update

这样,你可以搞乱时间和高度而不是直接参数。只需在开始时使用方程式来计算重力和jump_power。

const int time = 1.5; //seconds
const int height = 100 //pixels

const int jump_power = (4 * height / time) * timestep_in_secs_per_update;
const int gravity = (2 * jump_power / time) * timestep_in_secs_per_update;

这是一种来自数学的技术,通常用于根据“无量纲”重新排列一系列微分方程。变量。这样,当您尝试操纵方程特征时,变量不会发生干扰。在这种情况下,您可以设置时间并在更改功率时保持恒定。精灵仍然需要同时降落。

当然'真实'重力可能不是最好的解决方案。您可以将重力设置为低,只是在未接地时降低角色的高度。

答案 1 :(得分:0)

你需要正确思考单位制。

  1. 重力单位是米/秒的平方。 (m /(s * s))
  2. 速度的单位是米/秒。 (m / s)
  3. 力量的单位是牛顿。 (N = kg * m /(s * s))
  4. 概念示例:

    float gravity = -9.8; // m/(s*s)
    float delta_time = 33.333333e-3f; // s
    float mass = 10.0f; // Kg
    float force = grounded_ ? 150.0f : gravity; // kg*m/(s*s)
    float acceleration = force / mass; // m/(s*s)
    float velocity += acceleration * delta_time; // m/s
    float position += velocity * delta; // m
    

    它基于牛顿基本运动方程和欧拉方法。