平台中的c++ /SDL重力

C++/SDL Gravity in Platformer

本文关键字:SDL 重力 c++ 平台      更新时间:2023-10-16

我目前正尝试着在我的平台游戏中添加一种重力形式(游戏邦注:它并不需要完全是重力,也不需要现实性),但是我却遇到了一些逻辑问题。

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

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

Player::Update()函数中,我有

velocity_.y += GRAVITY;

函数中有更多的内容,但与实际情况无关。

目前两个常数为:GRAVITY = 9.8f;JUMP_POWER = 150.0f;

我对重力的主要问题是,我无法在我的精灵能够跳跃和过于飘浮之间找到适当的平衡。

长话短说,我的问题是,我的精灵的跳跃以及他从一个平台到另一个平台的常规掉落太过飘浮,有没有什么想法可以将其缩小到更现实的程度?

不要考虑实际的价值,而要考虑它们的后果。

初始速度为-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. 重力的单位是米每秒的平方。(m/(s*s))
  2. 速度的单位是米每秒。(m/s)
  3. 力的单位是牛顿。(N = kg*m/(s*s))

概念的例子:

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

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