如何为图像设置动画并调整动画速度?

时间:2014-01-09 01:38:37

标签: c++ animation

我正在尝试为图片制作动画。

每次我的整个渲染场景出现时,它都会循环到动画中的下一个图像。

我需要减慢/加速/降低到任意值。

这样做的常用程序是什么?

这是我到目前为止所尝试的:

FrameTime.h

static class FrameTime
{
public:
    FrameTime();

    static int current;
    static int max;
    static int step;

    static void Update();
};

FrameTime.cpp

int FrameTime::current = 0;
int FrameTime::max = 100;
int FrameTime::step = 1;

void FrameTime::Update()
{
    if( current >= max )
    {
        current = 0;
    }
    else
    {
        current += step;
    }
}

如何调用Update函数:

// Game Render function starts
...
FrameTime::Update();
// Game Render function ends

如果我的播放器动画应该更新,我的工作原理如下:

void PlayerStateFlying::Update()
{

    if( FrameTime::current % 2 )
    {
        current = sequence[ index ];
        if( index == ( sequenceAmount - 1 ) )
        {
            index = 0;
        }
        else
        {
            index++;
        }
    }
}

问题是上面的代码不允许我有浮动精度的速度。

2 个答案:

答案 0 :(得分:1)

您可以这样做:

  • 定义一个变量fps,用于保存动画在
  • 处移动的每秒帧数
  • 开始计算每帧传递的时间并将其存储在delta毫秒
  • 声明变量total并开始每帧delta递增
  • 每一帧,在total递增后,检查是否(1000 / fps > total)
    • 如果是,那么是时候移动total / (1000 / fps)帧的动画并将总数更新为fmod(total, (1000 / fps))
    • 否则,请继续

答案 1 :(得分:-1)

我希望你对物理学如何应用有所了解

Physics Engine in Game

Wiki Pedia

处理对象的速度,在其他方面,它意味着控制您需要实现牛顿动力学的对象的移动。这由三个运动定律描述:

  1. 身体将保持静止状态,或继续沿直线路径移动,直到对其施加力量

  2. 身体的加速度与净力的变化成正比。

  3. 对于每一个动作都有一个相同而相反的反应。

  4. 第一定律意味着:当且仅当另一个力被添加到其上或施加到其上时,物体才会改变其速度。例如:如果球在直线上移动,它将保持直线移动,直到外力施加到它上面。现在这个外部可以是任何东西,它可能是风减慢它或通过摩擦。

    第二定律意味着:当一个力被施加到一个物体上时,它会改变物体的速度,第二个定律就是这个变化:

    第三定律意味着:如果你打墙,墙会对你施力。所以行动是冲墙,反应是墙对你施加一股力量。


    为了在游戏中实施法则,我们使用数值积分(处理对象的位置和加速度)

    最常用的是半隐式欧拉积分

    dt是自上一帧以来经过的时间。

        NextVelocity = ThisVelcoity + CurrentAcceleration * dt;
        NextPosition = ThisPosition +  NextVelocity * dt;