将 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
的方法中添加了 TweenCallback
s 并完成了 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);
如有不明之处,请告诉我。
简短的问题...
如何正确使用 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
的方法中添加了 TweenCallback
s 并完成了 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);
如有不明之处,请告诉我。