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は同じような処理を行なっている。