将 UniversalTweenEngine 与 LibGDX 音乐一起使用

Using UniversalTweenEngine with LibGDX music

简短的问题...

如何正确使用 UniversalTweenEngine 和 LibGDX 中的 Music class?


长问题...

我在使用 UniversalTweenEngine 和 LibGDX 中的 Music class 时遇到问题。我有一个 MusicAccessor 实现 TweenAccessor 像这样:

public static final int VOLUME = 0;

@Override
public int getValues(Music target, int tweenType, float[] returnValues) {
    switch(tweenType) {
    case VOLUME:
        returnValues[0] = target.getVolume();
        return 1;
    default:
        assert false;
        return -1;
    }
}

@Override
public void setValues(Music target, int tweenType, float[] newValues) {
    switch(tweenType) {
    case VOLUME:
        target.setVolume(newValues[0]);
        break;
    default:
        assert false;
    }
}

首先我是这样使用的:

Tween.registerAccessor(Music.class, new MusicAccessor());
myMusicInstance.setVolume(0);
Tween.to(myMusicInstance, MusicAccessor.VOLUME, 1f).target(1).start();

这给了我一个错误说

No TweenAccessor was found for the target

我读了一些关于这个问题的文章,看到有人有同样的问题,this 问题的答案告诉我我也必须使用 .cast(Music.class),所以我把它改成了这个:

Tween.to(myMusicInstance, MusicAccessor.VOLUME, 1f).cast(Music.class).target(1).start();

这不再给我错误。问题在于它实际上并没有补间任何价值!我在 TweenAccessor 的方法中添加了 TweenCallbacks 并完成了 System.out.println("text"),但发现它们没有被调用。那么我应该怎么做才能让它发挥作用呢?

我重现了你的问题并设法解决了它,所以这是一个解决方案。 首先你需要一个 TweenManager 的实例。然后不要忘记开始您的音乐(它不会自己开始)。您的 MusicAccessor class 没问题,因此无需更改任何内容。最后的代码片段:
实例字段

private TweenManager tweenManager = new TweenManager();

构造函数(或任何你用过的地方)

Tween.registerAccessor(Music.class, new MusicAccessor());
myMusicInstance.setVolume(0);
myMusicInstance.play();

然后在渲染中:

tweenManager.update(delta);
Tween.to(music, MusicAccessor.VOLUME, 1f).cast(Music.class).target(1).start(tweenManager);

如有不明之处,请告诉我。