/* * ----------------------------------------------------------------------- * Copyright 2014 - Alistair Rutherford - www.netthreads.co.uk * ----------------------------------------------------------------------- * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.netthreads.libgdx.scene; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.viewport.Viewport; import com.netthreads.libgdx.director.AppInjector; import com.netthreads.libgdx.director.Director; /** * Scene is a Stage which has input multiplexer. * * Scenes are composed of layers. * */ public class Scene extends Stage implements Node { private static final int DEFAULT_LAYER_CAPACITY = 10; /** * Associated input multiplexer. */ private InputMultiplexer inputMultiplexer; /** * Scene elements as nodes. We need this so we can call enter and exit on actors in order to manage registration and * de-registration of event handlers. * */ private Array<Node> nodes; /** * The one and only director. */ private static Director director = AppInjector.getInjector().getInstance(Director.class); // All scenes share the same viewport. Viewport viewport; /** * Scene uses director view-port and batch. * * @param viewport The scene view-port. */ public Scene() { this(director.getViewport(), director.getSpriteBatch()); } /** * Scene uses director view-port. * * @param batch The sprite batch to use. */ public Scene(SpriteBatch batch) { this(director.getViewport(), batch); } /** * Constructor where we supply our own sprite batch. * * @param viewport The scene view-port. * @param batch */ public Scene(Viewport viewport, SpriteBatch batch) { super(viewport, batch); inputMultiplexer = new InputMultiplexer(this); nodes = new Array<Node>(DEFAULT_LAYER_CAPACITY); } /** * Get input multiplexer. * * @return The input multiplexer. */ public InputMultiplexer getInputMultiplexer() { return inputMultiplexer; } /** * Add scene layer. * * Note layer in nodes list. * * @param layer * The new layer. */ public void addLayer(Layer layer) { nodes.add(layer); addActor(layer); } /** * Remove scene layer. * * @param layer * The target layer. */ public void removeLayer(Layer layer) { int index = nodes.indexOf(layer, false); if (index >= 0) { nodes.removeIndex(index); getRoot().removeActor(layer); } } /** * Handle pre-display tasks. * */ @Override public void enter() { int size = nodes.size; for (int i = 0; i < size; i++) { nodes.get(i).enter(); } } /** * Handle post-display tasks. * */ @Override public void exit() { int size = nodes.size; for (int i = 0; i < size; i++) { nodes.get(i).exit(); } } }