如何在libgdx中补间BitmapFontCache的alpha?

时间:2015-07-14 12:59:54

标签: libgdx tween

我在我的libgdx应用程序中设置一些文本的动画,并希望标签文本淡入和移动(例如类似于此jsfiddle)。

我可以移动,并更改其他对象的alpha(例如Sprite)并可以移动BitmapFontCaches。但是我无法改变BitmapFontChage的alpha值。

宣言:

message = new BitmapFontCache(messageFont, true);
message.setWrappedText("some text", 10.0f, 10.0f, 10.0f);
message.setAlphas(0.0f);  

在我的屏幕类中,我覆盖了渲染方法,并在渲染器类上调用.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的setAlphas()设置为:

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;}
}...

它移动标签(==&gt; .setPosition(x,y)有效!),但是甚至没有触及alpha。这种完全相同的方法适用于Sprites,它可以很好地淡化。

在补充BitmapFontCache的alpha时,是否有一些问题?有可能吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

经过一个小时的调试后,我发现了这种有趣行为的原因。

  
      
  1. Libgdx的BitmapFontCache没有getAlphas()方法
  2.   
  3. 因此,要使用getColor().a
  4. 获取Alpha通道   
  5. 但是,这两个并不总是同步的。这种行为是随机的,我自己并不确定它何时同步,什么时候不同步(在上面的问题中,淡出效果会有效,但淡入效果不会)
  6.   

解决方案是更改并声明BOTH 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;

对于你,无望的流浪者,我解决这个问题,这样你就可以比我更有效地度过你生命中有限的几分钟。