游戏开发:如何为速度添加加速度?

Posted

技术标签:

【中文标题】游戏开发:如何为速度添加加速度?【英文标题】:Game Development: How to add acceleration to velocity? 【发布时间】:2019-09-27 18:56:27 【问题描述】:

我有一个需要用加速度缩放的视图,我的意思是,当比例为MIN_SCALE 时,速度一定很慢,但是当比例接近MAX_SALE 时,速度必须更大快速地。现在我的速度总是一样的。

View 将使用许多帧来进行移动:

numberOfFrames = Math.round((float)ANIMATION_TIME/GameLoopThread.FRAME_PERIOD);
frameCount = 0;

然后我用该帧数计算 scaleVelocity:

scaleVelocity = (MAX_SCALE-MIN_SCALE)/numberOfFrames;

每次游戏循环迭代,我都会使用以下代码更新视图的比例:

if (frameCount<numberOfFrames) 
    currentScale = currentScale + scaleVelocity;
    frameCount++;

当帧数达到numberOfFrames 时,动画必须结束。

如何向此代码添加加速?请记住,加速度必须考虑到视图需要在 frameCount 变量的最后一帧到达MAX_SCALE

【问题讨论】:

【参考方案1】:

定义你的插值器

INTERPOLATOR = new AccelerateInterpolator();  

在计算scaleVelocity时,获取当前插值

float interpolatedValue = INTERPOLATOR.getInterpolation(frameCount / numberOfFrames);

getInterpolation() 返回一个介于 0(动画开始)和 1(动画结束)之间的值

scaleVelocity = (MAX_SCALE-MIN_SCALE)/numberOfFrames * interpolatedValue;  // use min,max func if needed.

加速插值器的数学方程为 f(x) = x²,如果您想要更大的变化,请创建您的自定义插值器。

动画的工作测试方法。

 private void testAnim() 
    int numberOfFrames = 100;//Math.round((float)ANIMATION_TIME/GameLoopThread.FRAME_PERIOD);
    float frameCount = 0;
    float MAX_SCALE = 4;
    float MIN_SCALE = 0.1f;
    float scaleVelocity;
    float currentScale ;
    Interpolator INTERPOLATOR = new AccelerateInterpolator();

    do 
        float interpolatedValue = INTERPOLATOR.getInterpolation(frameCount / numberOfFrames);
        scaleVelocity = (MAX_SCALE - MIN_SCALE) * interpolatedValue;

        currentScale = Math.max(MIN_SCALE, scaleVelocity);
        ++frameCount;
        Log.d("STACK", "testAnim: currentScale = " + currentScale);
        // apply scale to view.
     while (frameCount < numberOfFrames);

    // finally set final value of animation.
    currentScale = MAX_SCALE;
    // apply scale to view.


【讨论】:

谢谢你,但如果我按照你的逻辑,它给出的比例在 0.1 和 1.4 之间,有些东西不起作用,因为我的 MIN_SCALE 是 0.1 而 MAX_SCALE 是 4.0 我已经编辑了我的答案,其中包括提供从 MIN_SCALE 到 MAX_SCALE 的比例值的工作测试方法。 我终于用这个公式解决了:currentScale = ((MAX_SCALE-MIN_SCALE)*(scaleInterpolator.getInterpolation((float)(frameCount+1)/numberOfFrames)))+MIN_SCALE; 你觉得我的配方怎么样? 我添加了 MIN_SCALE,因为如果没有,总是在 3.9 而不是 4 中最高。添加它是否正确?

以上是关于游戏开发:如何为速度添加加速度?的主要内容,如果未能解决你的问题,请参考以下文章

微信小游戏开发教程-游戏实现4

微信小游戏开发教程-游戏实现4

聚焦游戏开发速度与成本,稳定引擎基础助力开发者快速集成应用

如何为文字游戏编写可拖动图块?

游戏开发方案

《游戏编程模式》