如何在 libgdx 中补间 BitmapFontCache 的 alpha?
How to tween alpha of a BitmapFontCache in libgdx?
我正在为我的 libgdx 应用程序中的一些文本制作动画,并希望标签文本淡入和移动(例如类似于此 jsfiddle)。
我可以移动和更改其他对象(例如 Sprites)的 alpha,并且可以移动 BitmapFontCaches。但是我无法更改 BitmapFontChage 的 alpha。
声明:
message = new BitmapFontCache(messageFont, true);
message.setWrappedText("some text", 10.0f, 10.0f, 10.0f);
message.setAlphas(0.0f);
在我的屏幕 class 中,我覆盖了渲染方法,并在渲染器 class 上调用 .draw(),这(除其他外)本质上只是一个 message.draw(batch);
打电话。
@Override
public void render(float delta) {
...
try{
batch.begin();
feedbackRenderer.draw(batch);
tweenManager.update(delta);}
finally{
batch.end();
}
}
然后作为时间轴的一部分我称这两个补间。 (是的,它们被包裹在 .push( ) 中,我确实启动了我的 tweenManager:)
Tween.to(message, BitmapFontCacheAccessor.POSITION_X, animationDuration)
.target(35.0f)
Tween.to(message, BitmapFontCacheAccessor.ALPHA, animationDuration)
.target(1.0f)
BitmapFontCacheAccessor 尝试这样设置 BitmapFontCache 的 Alphas():
public class BitmapFontCacheAccessor implements TweenAccessor<BitmapFontCache> {
public static final int POSITION_X = 1;
public static final int ALPHA = 2;
@Override
public void setValues(BitmapFontCache target, int tweenType, float[] newValues) {
switch (tweenType) {
case POSITION_X:
float y = target.getY();
target.setPosition(newValues[0], y);
break;
case ALPHA:
target.setAlphas(newValues[0]);
break;}
}...
它移动了标签(==> .setPosition(x, y) 有效!),但甚至没有触及 alpha。这种完全相同的方法适用于 Sprites,它很好地淡入淡出。
为 BitmapFontCache 补间 alpha 时是否有一些问题?可能吗?
非常感谢!
经过一个小时的调试,我找到了这种有趣行为的原因。
- Libgdx's BitmapFontCache does not have a
getAlphas()
method
- Therefore, to get the alpha channel I used
getColor().a
- However, these two are not always synced. The behavior is quite random, I myself am not quite sure when it syncs and when it doesn't (f.ex. in the question above, the fade-outs would work, but fade-ins wouldn't)
解决方案是更改并声明两个 alpha 通道。
BitmapFontCache 的定义:
message = new BitmapFontCache(messageFont, true);
message.setColor(1,1,1,0);
message.setAlphas(0);
在 TweenAccessor 内部:
case ALPHA:
//first alpha channel
target.setAlphas(newValues[0]);
//second alpha channel
Color c = target.getColor();
c.a = newValues[0];
target.setColor(c);
break;
对于你,无望的 SO 流浪者,我回答这个问题是为了让你可以比我更好地度过你生命中有限的几分钟。
我正在为我的 libgdx 应用程序中的一些文本制作动画,并希望标签文本淡入和移动(例如类似于此 jsfiddle)。
我可以移动和更改其他对象(例如 Sprites)的 alpha,并且可以移动 BitmapFontCaches。但是我无法更改 BitmapFontChage 的 alpha。
声明:
message = new BitmapFontCache(messageFont, true);
message.setWrappedText("some text", 10.0f, 10.0f, 10.0f);
message.setAlphas(0.0f);
在我的屏幕 class 中,我覆盖了渲染方法,并在渲染器 class 上调用 .draw(),这(除其他外)本质上只是一个 message.draw(batch);
打电话。
@Override
public void render(float delta) {
...
try{
batch.begin();
feedbackRenderer.draw(batch);
tweenManager.update(delta);}
finally{
batch.end();
}
}
然后作为时间轴的一部分我称这两个补间。 (是的,它们被包裹在 .push( ) 中,我确实启动了我的 tweenManager:)
Tween.to(message, BitmapFontCacheAccessor.POSITION_X, animationDuration)
.target(35.0f)
Tween.to(message, BitmapFontCacheAccessor.ALPHA, animationDuration)
.target(1.0f)
BitmapFontCacheAccessor 尝试这样设置 BitmapFontCache 的 Alphas():
public class BitmapFontCacheAccessor implements TweenAccessor<BitmapFontCache> {
public static final int POSITION_X = 1;
public static final int ALPHA = 2;
@Override
public void setValues(BitmapFontCache target, int tweenType, float[] newValues) {
switch (tweenType) {
case POSITION_X:
float y = target.getY();
target.setPosition(newValues[0], y);
break;
case ALPHA:
target.setAlphas(newValues[0]);
break;}
}...
它移动了标签(==> .setPosition(x, y) 有效!),但甚至没有触及 alpha。这种完全相同的方法适用于 Sprites,它很好地淡入淡出。
为 BitmapFontCache 补间 alpha 时是否有一些问题?可能吗?
非常感谢!
经过一个小时的调试,我找到了这种有趣行为的原因。
- Libgdx's BitmapFontCache does not have a
getAlphas()
method- Therefore, to get the alpha channel I used
getColor().a
- However, these two are not always synced. The behavior is quite random, I myself am not quite sure when it syncs and when it doesn't (f.ex. in the question above, the fade-outs would work, but fade-ins wouldn't)
解决方案是更改并声明两个 alpha 通道。
BitmapFontCache 的定义:
message = new BitmapFontCache(messageFont, true);
message.setColor(1,1,1,0);
message.setAlphas(0);
在 TweenAccessor 内部:
case ALPHA:
//first alpha channel
target.setAlphas(newValues[0]);
//second alpha channel
Color c = target.getColor();
c.a = newValues[0];
target.setColor(c);
break;
对于你,无望的 SO 流浪者,我回答这个问题是为了让你可以比我更好地度过你生命中有限的几分钟。