在游戏中创建物体(坦克)的加速度
Creating acceleration of an object (tank) in a game
我无法让我的坦克在我按下移动按钮时加速,而在我松开它时减速。不要因为我不是专业人士而对我太苛刻,因为我还在学习,在此先感谢!
我也有名为 'speed' 和 'maxspeed' 的变量,我试过它们但结果并不好,下面的代码基本上让我的坦克在更新函数中移动
if(TestName->Tank[0].up == true){
TestName->Tank[0].position_y = TestName->Tank[0].position_y + (TestName->Tank[0].speed + 0.06f);
}
if(TestName->Tank[0].down == true){
TestName->Tank[0].position_y = TestName->Tank[0].position_y - 0.06f;
}
if(TestName->Tank[0].right == true){
TestName->Tank[0].rotation = TestName->Tank[0].rotation + 0.6f;
}
if(TestName->Tank[0].left == true){
TestName->Tank[0].rotation = TestName->Tank[0].rotation - 0.6f;
}
}
逻辑上,.....假设您的 defaultspeed
是 1,maxspeed
是 2。您可能需要另一个变量,我们称它为 deltaSpeed
.
那么你的totalSpeed
(Tank's Position in a direction)是defaultspeed
* deltaSpeed
.
您还需要检查用户是否正在按下按钮,如果是,则增加(固定数量或指数)deltaSpeed
。当用户释放按钮时,然后减少 deltaSpeed
。这会给坦克加速和减速的错觉。
然后,当用户按下另一个方向时,您可以重置 deltaSpeed。
一些有用的牛顿方程:
f = ma
v^2 = u^2 + 2as
s = ut + 0.5 * a * t^2
其中:
s = 行驶距离(米)
u = 初始速度 (m/s)
t = 时间(秒)
a = 加速度
f = 力
m = 质量
重新排列这些方程式后,您可以计算给定时间段内加速度的变化,进而计算速度的变化,进而计算距离的变化。
游戏将以不同程度的简化来模拟这些规则(例如,您可以编写代码,按下 'W' 将在坦克面对的方向产生 X 牛顿的力,或者您可以选择限制最大值速度,使力与当前速度成反比(为功率方程建模)。
或者您可以将 F 计算为功率方程在每次模拟通过之间的时间段内的积分(这是飞行模拟可能会做的)。
希望有一些想法可以指导您找到一些有用的文献。
在这段代码中:
TestName->Tank[0].position_y = TestName->Tank[0].position_y + (TestName->Tank[0].speed + 0.06f);
它看起来很可怕,就像你试图在速度上增加加速度 (0.06),同时在位置上增加速度。加号不会改变速度,它只会计算结果并将其用于方程式。
分两步完成:
TestName->Tank[0].speed += 0.06f;
TestName->Tank[0].position_y += TankName->Tank[0].speed;
当你有那个位工作时,你的下一个问题将无法转向。我认为你最好 google 向量(数学,而不是 C++)以及速度和速度之间的差异。
我无法让我的坦克在我按下移动按钮时加速,而在我松开它时减速。不要因为我不是专业人士而对我太苛刻,因为我还在学习,在此先感谢!
我也有名为 'speed' 和 'maxspeed' 的变量,我试过它们但结果并不好,下面的代码基本上让我的坦克在更新函数中移动
if(TestName->Tank[0].up == true){
TestName->Tank[0].position_y = TestName->Tank[0].position_y + (TestName->Tank[0].speed + 0.06f);
}
if(TestName->Tank[0].down == true){
TestName->Tank[0].position_y = TestName->Tank[0].position_y - 0.06f;
}
if(TestName->Tank[0].right == true){
TestName->Tank[0].rotation = TestName->Tank[0].rotation + 0.6f;
}
if(TestName->Tank[0].left == true){
TestName->Tank[0].rotation = TestName->Tank[0].rotation - 0.6f;
}
}
逻辑上,.....假设您的 defaultspeed
是 1,maxspeed
是 2。您可能需要另一个变量,我们称它为 deltaSpeed
.
那么你的totalSpeed
(Tank's Position in a direction)是defaultspeed
* deltaSpeed
.
您还需要检查用户是否正在按下按钮,如果是,则增加(固定数量或指数)deltaSpeed
。当用户释放按钮时,然后减少 deltaSpeed
。这会给坦克加速和减速的错觉。
然后,当用户按下另一个方向时,您可以重置 deltaSpeed。
一些有用的牛顿方程:
f = ma
v^2 = u^2 + 2as
s = ut + 0.5 * a * t^2
其中:
s = 行驶距离(米)
u = 初始速度 (m/s)
t = 时间(秒)
a = 加速度
f = 力
m = 质量
重新排列这些方程式后,您可以计算给定时间段内加速度的变化,进而计算速度的变化,进而计算距离的变化。
游戏将以不同程度的简化来模拟这些规则(例如,您可以编写代码,按下 'W' 将在坦克面对的方向产生 X 牛顿的力,或者您可以选择限制最大值速度,使力与当前速度成反比(为功率方程建模)。
或者您可以将 F 计算为功率方程在每次模拟通过之间的时间段内的积分(这是飞行模拟可能会做的)。
希望有一些想法可以指导您找到一些有用的文献。
在这段代码中:
TestName->Tank[0].position_y = TestName->Tank[0].position_y + (TestName->Tank[0].speed + 0.06f);
它看起来很可怕,就像你试图在速度上增加加速度 (0.06),同时在位置上增加速度。加号不会改变速度,它只会计算结果并将其用于方程式。
分两步完成:
TestName->Tank[0].speed += 0.06f;
TestName->Tank[0].position_y += TankName->Tank[0].speed;
当你有那个位工作时,你的下一个问题将无法转向。我认为你最好 google 向量(数学,而不是 C++)以及速度和速度之间的差异。