好的,我会尽力解释我的问题。我有这个程序,你可以选择5个球。当您选择一个时,可以在按下鼠标按钮并且光标位于球的半径范围内时拖动它。
问题在于,当用户停止按下鼠标按钮时,我需要一种让球向上移动的方法,就像他将它发送到空中然后让它再次掉落一样。我有一种方法可以知道时间,速度和加速度,但我不知道如何实现它。
现在我有了这个:
void Circle::Fall(float velocity,float time)
{
if(this->posY >= 580)
{
this->posY = 580;
this->vfall= 0.0f;
}
else if(this->posY < 580)
{
//this->distance=9.81f * 0.5f*time*time;
this->vfall+= velocity;
this->posY += this->vfall;
}
}
就这样,它就会崩溃,我无法达到我试图解释的效果。
另外,我正在计算这样的时间(以防它有帮助):
difX=(x> event.motion.xrel)? x-event.motion.xrel : event.motion.xrel-x;
difY=(y> event.motion.yrel)? y-event.motion.yrel : event.motion.yrel-y;
我正在使用difY
作为时间变量
好的,对不起,我现在用英语。我将尝试让这更容易理解:
在释放咔哒声时,你需要用鼠标的速度让球浮起一点点,就像一只手在投入一些冲动后将球扔向空中。它不需要掉头或任何东西只是在Y上稍微上升。我正在使用SDL以防你需要知道
你也可以从窗户底部取出球,当你松开它们时,它们会自动返回它们
答案 0 :(得分:2)
我认为你需要通过声音向上设置初始速度。
如果存储垂直速度,可以将其设置为正数。然后每一帧,将速度加到位置,然后从速度中减去一点,使其像重力一样。
所以请this->yVelocity
(或使用您自己的语言; D)和this->yPosition
,以及gravityMagnitude
,这可能类似于-0.1
。< / p>
每一帧,做这样的事情:
this->yVelocity += gravityMagnitude; //Subtracts 0.1
this->yPosition += this->yVelocity; //Make it actually move
这将逼真地模拟重力,因为球的运动将模仿二次函数。
另外,这样一来,如果你想让球首先浮起来,只要他们放手就说出来:
this->yVelocity = 2.0; //Or some other positive number
它会以一点速度开始。
答案 1 :(得分:2)
我想你想要这本书:Physics for Game Developers。
答案 2 :(得分:1)
这真的将我的记忆拉回到高中物理学。你需要的是suvat公式,特别是位移公式:
1 2
s = ut + - at
2
所以,考虑到你将球投向(例如)每秒5米,加速度为-9.8米每秒平方(地球上),它在1秒后的位置将高于起始高度。
请注意,您只需要担心这些方程式(重力)的上下变换,除非您的应用程序如此逼真以至于需要考虑风阻。
您需要做的就是存储初始位移(高度)和速度(仅垂直分量),然后您可以计算任何给定时间值的位移。
请记住,这些方程适用于恒定加速情况。它们可能(大部分)在地球周围(但大部分)可能在重力迅速变化的地方(如黑洞附近)不太适应。