2014年12月1日月曜日

Andengineで透明度指定が上手く行かない場合の対処方法

AndengineでTextをフェードアウトする処理が上手く行かないことがあり調べたところ、解決方法が見つかったので残しておきます。

症状

Textの透明度をsetAlpha()で指定しても、「完全に透明」か「完全に不透明」にしかなりませんでした。
setAlpha(0)で完全に透明になり、それ以外の値では、値にかかわらず完全に不透明になってしまいます。「半透明にできない」とも言えますね。図はInkscapeで作成したイメージです。
Textが半透明にできない!
stackoverflowでの質問と、その質問記事でリンクされている公式フォーラムに原因と解決方法がありました。


 原因

原因は「TextureAtlas生成時のTextureOption」でした。TextureAtlasは読み込んだフォントを格納するオブジェクトです。読み込んだ画像もTextureAtlasに格納されるので、場合によってはSpriteでも上の症状が起こるという事です。

        this.mFont = FontFactory.create(activity.getFontManager(),
                activity.getTextureManager(), 256, 256,
                TextureOptions.BILINEAR_PREMULTIPLYALPHA,
                Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
                48,android.graphics.Color.WHITE);
        this.mFont.load();

上が問題が発生する場合のフォント読み込み部分のコードです。TextureOptionに「TextureOptions.BILINEAR_PREMULTIPLYALPHA」という定数を与えています。
これは 「TextureOptions.BILINEAR」に比べて拡大縮小が綺麗になる特長があります。
ですが、この状態で作られたText(もしくはSprite)はデフォルトでは問題の症状のように半透明にできない問題が発生します。

解決方法

2つ方法があります。以下のうちどちらかを行えば良いです。

1.  「TextureOptions.BILINEAR」を指定する。
簡単です。このオプションにするとsetAlpha()がちゃんと動きます。ですが、拡大縮小が少し荒くなります。

2. TextやSpriteにBlendFunctionを設定する。
BILINEAR_PREMULTIPLYALPHAの画質を保って半透明に出来ます。コードは以下のような感じ。

        Text text = new Text(x, y, mFont,
                "Text", vertexBufferObjectManager);
        text.setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);

setBlendFunctionで設定します。多少おまじない感はありますがこれで半透明に出来ます。

不安

これで問題は解決しましたが、「画質の良いテクスチャオプションを使った場合、デフォルトでは半透明にできない」という仕様なので、2つめの方法でパフォーマンスにどのような影響が出るのか少し不安です。時間があれば試すかも。

参考ページ

android - How to make ChangeableText transparent in andengine - Stack Overflow:

0 件のコメント:

コメントを投稿