C# 重力随空气时间、加速度和速度增加

C# 重力随空气时间、加速度和速度增加,c#,math,physics,gravity,C#,Math,Physics,Gravity,我试图实现重力,其中包括播放时间,还有加速度。我尝试使用通常的重力,看起来像这样: velocity += gravity * dt; position += velocity * dt; 对于普通的平板电脑游戏来说,这可能已经足够好了,但我正在尝试制作一个受“直升机游戏”启发的游戏,在这个游戏中,你必须在不触碰墙壁的情况下通过隧道。我想做的不同点是,我希望能够在下降的过程中节省速度,然后在上升的过程中再次使用,因此,我在开始时会有一些加速度。我还需要一些播放时间,因此,如果我使用代码示例中的



我试图实现重力,其中包括播放时间,还有加速度。
我尝试使用通常的重力,看起来像这样:

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


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

我想做的不同点是,我希望能够在下降的过程中节省速度,然后在上升的过程中再次使用,因此,我在开始时会有一些加速度。
我还需要一些播放时间,因此,如果我使用代码示例中的重力,当你到达顶部时,它不会像它那样快速地将你压下。

此图说明了我想要的曲线:


请注意,整个控制是通过一个键完成的,例如,如果按住空格键,你会飞起来,如果放开空格,你会俯冲下去。
角色也不会向左或向右移动,因为它在屏幕上有一个静态的X位置,所以向量不能使用。

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

游戏“鲸鱼踪迹”得到了我想要的重力。
这里有一个游戏视频链接:

我不是一个大物理人,因此,如果你能给出一个实际代码的例子,那就太好了。我希望任何人都能帮我弄清楚这一点。

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

if(keyPressed) {
  velocity += POWER_OF_PLAYER;
}

velocity += G;
position += velocity;
这足以创建如图所示的曲线。当然,玩家的力量必须是另一个符号,绝对值必须更大才能起作用

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;
}
在获得动力之前的一些最小速度应小于或等于0


另外,我假设你的Y轴从地面开始射向天空。相应地放置标志。

看起来鱼的速度是恒定的

请尝试以下操作:

速度
是固定的,不应该改变(除非鱼吃了速度加电)。
角度=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);
角度-=重力*dt;
如果(角度<-Math.PI/2){
角度=Math.PI/2;
}
如果(按键){
角度+=功率*dt;
}
如果(角度<-Math.PI/2){
//阻止玩家进行循环
角度=-Math.PI/2;
}
如果(角度>数学PI/2){
//阻止玩家做反向循环
角度=Math.PI/2;
}
//移动鱼(速度的垂直分量)
位置+=速度*dt*数学sin(角度);
//移动背景(速度的水平分量)
背景位置-=速度*dt*数学sin(角度);

这听起来像是结合了基于水平速度的“提升”,按下按钮触发“仰起”运动就足够了

因此,
lift
将是一个常数
k
乘以水平速度
Vx
,垂直速度
Vy
将是
gravity
lift
乘以时间变化
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
当飞机(或任何东西)向上俯冲时,它基本上会降低一个轴上的速度,同时增加另一个轴上的速度

现在我想,把
拖拽到某个地方可能不是一个坏主意,它必须依赖于绝对速度
V=(Vx**2+Vy**2)**0.5
…在这种情况下,重量比重力更好(不那么令人困惑,按单位计算),但我想它是有效的

不完全是“物理学”,而是一个应该相当有效的近似值。玩转k的值,看看你是否能让它做你想要的


顺便说一句,对于uber蹩脚的伪代码,我很抱歉:-p

这不是一个糟糕的问题,但是展示一些说明您尝试过的代码,并描述它如何不起作用,将有助于您获得答案。:)我也不是一个学物理的人,但我想你需要对物理更深入一点才能完成你想要的。所以我认为飞机的物理应该进入大方向。也许至少能帮你找到正确的词语来解决你的问题。同样在最新的蝙蝠侠-阿卡姆城游戏中,你也有一个类似的机制,也许值得一看。@djacobson它大部分都是随机代码,因为我不知道该去哪里,所以它不会有任何好处:)@dowhilefor你可能是对的,但如果已经有一些代码就好了;)在鲸鱼轨迹游戏中,即使鲸鱼停留在屏幕上的相同位置,水平速度也会发生变化。屏幕滚动会加快或减慢。看起来你需要使用2D向量来复制这个行为。我很确定我已经尝试过了,但我会用你的代码试试看它是否有效:)这是标准公式,游戏的物理是不同的。你的数学错了。重力是一种力,即它具有质量*加速度的单位,而速度具有随时间变化的距离单位,因此设置
速度+=重力
从根本上说是不正确的。@rcollyer变量必须命名为重力场的G或强度(与质量无关,相当于物体在重力作用下的加速度)要解决这个问题,我们必须假设系统中的所有质量都是1。但这并不能使答案的其余部分无效。是的,假设质量为1kg,它很接近。您仍然需要将
G
乘以时间增量以获得正确的单位,与
Power\u Of_Player
的情况相同,前提是它也是一个力。使用代码时,播放机刚好向上移动,除非按下键,否则它会稍微向下移动。尝试改变角度