2016年2月11日木曜日

LibGDXで子Actorを切り抜くGroup

切り抜き

Group.setCullingArea() を使えば、矩形の範囲外にある子Actorを描画しなくなる。(カリング処理)
でも、少しでも矩形の中にはみ出てるActorはその全体が描画されてしまう。
だから、ある矩形で子Actor共々切り抜きたい時にはそぐわない。

そこで以下の様なGroupをつくっている。子ActorをaddActorして、setCullingArea()するとその矩形で切り抜いてくれる。
(batch.end()を使っているのでStageにたくさん置くと描画が遅くなるよ)
public class CullingGroup extends Group {
    private Rectangle mScissorBounds;
    public CullingGroup() {
        mScissorBounds = new Rectangle();
    }
    @Override
    public void draw(Batch batch, float parentAlpha) {
        getStage().calculateScissors(getCullingArea(), mScissorBounds);
        batch.end();
        batch.begin();
        if (ScissorStack.pushScissors(mScissorBounds)) {
            super.draw(batch, parentAlpha);
            batch.flush();
            ScissorStack.popScissors();
        }
    }
}
ちなみに、ScrollPaneは同じような処理を行なっている。

2016年2月3日水曜日

libGDXでフルスクリーンをやめる

フルスクリーンになりがち

libGDXはなんも設定しないとフルスクリーンになる。なんならImmersiveになる。なるべく大きくなろうとする。(Unityもそうだ)
でもそんなに大きくなられると困ることもある。
libGDXのバージョンによるだろうから、上から順にみていって怪しいところいじってみて欲しい。

Android

Theme

AndroidManifest.xmlをチェックすると
android:theme="@style/GdxTheme"
 というテーマになっているが、こいつのなかで
        <item name="android:windowFullscreen">true</item>
とある。これをfalseにする。

Config

AndroidLauncher.javaをチェックすると
AndroidApplicationConfigurationのインスタンスをデフォルトのまま使っている。これを

AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.useImmersiveMode = false;
config.hideStatusBar = false;
として、ImmersiveModeやステータスバーを非表示にする処理を抑制する。

Initialize

引き続きAndroidLauncher.javaをチェックすると、

initialize(app, config);
という処理がある。ここで様々なAndroidに関する初期化が行われるわけだ。しかしこのままだとまたステータスバーを非表示にする処理が走るので、
View view = initializeForView(app, config);
setContentView(view);
に変更する。

iOS

iOSは単純明快で、info.plist.xml の
<key>UIStatusBarHidden</key>
<true/>
をfalseにすればよい。