从Libgdx中的Render方法中删除动画逻辑

时间:2017-11-09 10:00:31

标签: android animation libgdx

我想将动画委托给不同的类/实体,以便渲染方法不会因动画所需的代码而膨胀。如果继续渲染方法的动画应该执行该动画并在动画完成时移动到其正常处理。动画应该除了动画中涉及的所需精灵。 render方法应该以正常方式呈现其他sprite。 (我正在谈论几个精灵的动画,而不是精灵表中的精灵动画)

是否有面向对象的方法来实现这一目标?

@Override
public void render ()
{

    long ctime = System.currentTimeMillis();
    Gdx.gl.glClearColor(backColor.r, backColor.g, backColor.b, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    float deltaTime = Gdx.graphics.getDeltaTime();
    if(!startGame)
        return;

    if(camera != null)
        batch.setProjectionMatrix(camera.combined);

batch.begin();
        for (int i = 0; i < clusterList.size(); i++) {
            clusterList.get(i).render(batch);

batch.end();
        if(!isFinished)
            scoreBar.setDeltaTime(deltaTime);

        Gdx.gl.glEnable(GL20.GL_BLEND);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
        shapeRenderer.setProjectionMatrix(batch.getProjectionMatrix());
        shapeRenderer.setColor(Color.GRAY.r,Color.GRAY.g, Color.GRAY.b, 0.6f);
        shapeRenderer.rect(0, camH - barHeight, camW, barHeight);
        shapeRenderer.end();
        Gdx.gl.glDisable(GL20.GL_BLEND);

        batch.begin();
        scoreBar.render(batch);


        if (animateSpread) {
            timeLoopSpread += deltaTime;
            if (timeLoopSpread > duration) {
                timeLoopSpread = 0;
                animateSpread = false;
            } else
                animateCluster();
        }


}

private void animateCluster() {
        float factor = Interpolation.pow5Out.apply(timeLoopSpread /duration);
        for (int index =0; index < clusterList.size(); index++) {
            Cluster tempC = clusterList.get(index);
            currentPos.set(tempC.endPos);
            currentPos.sub(tempC.startPos);
            currentPos.scl(factor);
            currentPos.add(tempC.startPos);
            tempC.setCenterPosition(currentPos);
        }
    }

1 个答案:

答案 0 :(得分:0)

面向对象的方法是使集群自己动画。 而不是调用AnimateClusters()您将启用/禁用它们动画。无论您在何处启用animateSpread,都可以调用类似

的内容
for (int i = 0; i < clusterList.size(); i++) {
    clusterList.get(i).spreadStart();
}

然后更新render()中的每个群集,每个群集都会保留自己的动画时间。

for (int i = 0; i < clusterList.size(); i++) {
    // update animation in there
    clusterList.get(i).update(delta);
}

您也可以采用与启动时相同的方式停止动画。