【问题标题】:Gravity with air-time, acceleration and speed gaining重力与空中时间、加速度和速度增益
【发布时间】:2012-01-06 00:14:09
【问题描述】:



我正在尝试实现重力,其中包括通话时间和加速度。
我尝试使用通常的重力,看起来像这样:

velocity += gravity * dt;
position += velocity * dt;


这对于一个普通的平台游戏来说可能已经足够好了,但我正在尝试制作一款受“直升机游戏”启发的游戏,你必须在不接触墙壁的情况下穿过隧道。

我想做的不同的是,我希望能够在下降的过程中保存上升速度,这将在再次上升时使用,所以我会在开始时有一些加速。
我还想要某种通话时间,所以当你到达顶部时,它不会像它那样快速地迫使你下降,如果我使用代码示例中的重力。

这张图片说明了我想要的曲线喜欢有:


请注意,整个控制是一键完成的,例如按住空格会飞起来​​,松开就会下潜。
角色也永远不会向左或向右移动,因为它在屏幕上会有一个静态的 X 位置,所以不能使用矢量。

我花了几个小时试图让它工作,但没有成功.我也尝试在互联网上搜索,但没有任何运气。

“鲸鱼小径”游戏获得了我想要的重力。
这是游戏视频的链接:@987654321 @

我不是一个物理学家,所以如果你能给出一个实际代码的例子会很酷
我希望任何人都可以帮助我解决这个问题。

【问题讨论】:

  • 不是一个坏问题,但显示一些代码来说明您已尝试过的内容 - 以及对 如何 它不起作用的描述 - 将帮助您获得答案。 :)
  • 我也不是物理学家,但我猜你需要更深入地研究物理学才能完成你想要的。所以我认为飞机的物理学应该你进入大方向。也许this 至少可以帮助您找到正确的单词来寻找问题的解决方案。同样在最新的蝙蝠侠 - 阿卡姆城游戏中,你也有类似的机制,也许值得一试。
  • @djacobson 这主要是随机代码,因为我不知道该去哪里,所以它没有任何好处:)
  • @dowhilefor 你可能是对的,但如果已经有一些代码就好了;)
  • 在 Whale Trails 游戏中,即使鲸鱼停留在屏幕上的相同位置,水平速度也会发生变化。屏幕滚动速度加快和减慢。似乎您需要使用 2D 矢量来复制此行为。

标签: c# math physics gravity


【解决方案1】:

重力是将物体拉下的力。你的玩家是把物体拉起来的力量。因此,您的代码必须是:

if(keyPressed) {
  velocity += POWER_OF_PLAYER;
}

velocity += G;
position += velocity;

这足以创建一条如您所示的曲线。当然POWER_OF_PLAYER 必须是不同的符号,并且绝对值必须更大才能使这项工作。

G = -9.81
POWER_OF_PLAYER = 20

那么省电就是一个简单的检查。

if(keyPressed) {
  if(powerSaved > 0) {
    velocity += POWER_OF_PLAYER;
    powerSaved -= SOMETHING;
  }
} else if (velocity >= SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER) {
  powerSaved += SOMETHING;
}

SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER 应该小于或等于 0。

附:我假设您的 Y 轴从地面开始并射向天空。相应地放置标志。

【讨论】:

  • 我很确定我已经尝试过了,但我会用你的代码试一试,看看它是否有效:)
  • 这是标准公式,游戏的物理原理不同。
  • 你的数学是错误的。重力是一种力,即它的单位是质量*加速度,而速度的单位是随时间变化的距离,因此设置velocity += GRAVITY 根本不正确。
  • @rcollyer 该变量必须命名为 G 或 STRENGTH_OF_THE_GRAVITATIONAL_FIELD(与质量无关,相当于物体的重力加速度)才能解决这个问题,否则我们必须假设该系统中的所有质量是 1。但这并不会使答案的其余部分无效。
  • 是的,假设质量为 1 公斤,它很接近。您仍然需要将G 乘以一个时间增量以使单位正确,与Power_Of_Player 相同,只要它也是一种力量。
【解决方案2】:

看起来鱼的速度是恒定的。

尝试以下方法:

velocity 是固定的,不应更改(除非鱼吃掉了加速能量)。 angle = 0 相当于平飞。

angle -= gravity * dt;
if (angle < - Math.PI / 2) {
  angle = Math.PI / 2;
}
if (keyPressed) { 
  angle += power * dt;
}

if (angle < - Math.PI / 2) {
  // Stop the player from doing a looping
  angle = - Math.PI / 2;
}
if (angle > Math.PI / 2) {
  // Stop the player from doing an inverted looping
  angle = Math.PI / 2;
}
// Move the fish (vertical component of velocity)
position += velocity * dt * Math.sin(angle);
// Move the background (horizontal component of velocity)
background_position -= velocity * dt * Math.sin(angle);

【讨论】:

  • 当使用你的代码时,播放器只是直线前进,除非当按键被按下时,它会略微下降。
  • 尽量让角度的变化更小 - angle -= gravity * dt / 100.0;angle += power * dt / 100.0;
【解决方案3】:

听起来像结合基于水平速度的“提升”并让按钮按下触发“鼻子上扬”运动会足够好。

所以lift 将是某个常数k 乘以水平速度Vx 和垂直速度Vy 将是gravitylift 的差乘以时间变化dt

lift = k * Vx
Vy += ( lift - gravity ) * dt

def noseup
  k = 0.01 #some small chunk
  dx = k * Vx
  dy = k * Vy
  Vx -= dy
  Vy += dx

当飞机(或其他)机头向上时,它基本上会降低一个轴上的速度,同时增加另一个轴上的速度。

现在我想,将drag 扔到某个地方可能不是一个坏主意,它必须取决于绝对速度V = ( Vx**2 + Vy**2 )**0.5...而且重量比这个词更好在这种情况下重力(不那么混乱,单位明智),但我猜它有效。

不完全是“物理学”,而是一个应该可以很好地工作的近似值。玩弄 k 的值,看看你是否可以让它做你想做的事情。

顺便说一句,对于超级蹩脚的伪代码感到抱歉:-P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2021-12-15
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多