平台中的c++ /SDL重力
C++/SDL Gravity in Platformer
我目前正尝试着在我的平台游戏中添加一种重力形式(游戏邦注:它并不需要完全是重力,也不需要现实性),但是我却遇到了一些逻辑问题。
以下代码是我在按下向上箭头或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;
这是一种数学技巧,通常用于根据"无量纲"变量重新排列一系列微分方程。这样,当你试图操纵方程特征时,变量就不会干扰。在这种情况下,您可以在更改功率的同时设置时间并保持恒定。精灵着陆的时间还是一样的
当然,"真实的"重力可能不是最好的解决方案。你可以设置较低的重力,在角色不落地的时候降低他们的高度。你需要正确考虑单位制。
- 重力的单位是米每秒的平方。(m/(s*s))
- 速度的单位是米每秒。(m/s)
- 力的单位是牛顿。(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
它是基于基本的牛顿运动方程和欧拉方法。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 在 cmake 中找不到 SDL 库
- 有没有办法让 PhysX 4.1 CCT 使用自定义重力滑下斜坡?
- SDL/C++: 如何平滑但随机地移动矩形?
- 如何与 SDL 库链接?
- SFML 中的重力和碰撞检测
- 平台中的c++ /SDL重力
- c++ SDL 2D跳转(重力)