当一个点到达底部时,我试图将其反弹。不幸的是,它一直在下降。这是代码:
void Timer(int value) {
if (value) {
if(initMpoints[1][1] <= 500 && initMpoints[0][1] >= 0) {
txForC -= 0;
tyForC -= 5; //Move C downward.
txForM -= 0;
tyForM -= 5;
if (initMpoints[0][1] == 0) {
txForC += 0;
tyForC += 5; //Move C downward.
txForM += 0;
tyForM += 5;
}
}
}
glutPostRedisplay();
glutTimerFunc(50, Timer, value);
}
我该如何解决这个问题?
答案 0 :(得分:0)
使用abs(sin(x))
函数可以完成非常好且更自然的弹跳胺化示例。
在你的情况下,我将重写你的功能。
// Speed of bouncing
float fSpeed = 0.01f;
float fPI = 3.1415926f;
// Height of bouncing
float fHeight = 100.0f;
void Timer(int iValue)
{
static float fAngle = 0.0;
// if animation enabled
if (iValue)
{
tyForC = fHeight * abs(sin(fAngle));
tyForM = fHeight * abs(sin(fAngle));
// Go to next position
fAngle += fSpeed;
}
// Restore previous value to avoid bitgrid overflow
if (fAngle >= (4.0f * fPI - fSpeed / 2.0))
{
fAngle = 0.0f;
}
glutPostRedisplay();
glutTimerFunc(50, Timer, iValue);
}
对于你喜欢动画的牙齿,代码就像
float fHeight = 100.0f;
void Timer(int iValue)
{
static float deltaC = 5.0f;
static float deltaM = 5.0f;
if (iValue)
{
tyForC += deltaC;
tyForM += deltaM;
if (tyForC <= 0 || tyForC >= fHeight)
deltaC *= -1.0f;
if (tyForM <= 0 || tyForM >= fHeight)
deltaM *= -1.0f;
}
glutPostRedisplay();
glutTimerFunc(50, Timer, iValue);
}