Java tutorial
/* * This file is part of Finally Lord. * * Finally Lord is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Finally Lord is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Finally Lord. If not, see <http://www.gnu.org/licenses/>. */ /* * Copyright (c) 2008-2010, Matthias Mann * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Matthias Mann nor the names of its contributors may * be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package render.ui; import de.matthiasmann.twl.GUI; import de.matthiasmann.twl.Widget; import de.matthiasmann.twl.renderer.Renderer; import de.matthiasmann.twl.renderer.lwjgl.LWJGLRenderer; import de.matthiasmann.twl.theme.ThemeManager; import org.lwjgl.opengl.GL11; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Input; import org.newdawn.slick.SlickException; import org.newdawn.slick.state.GameState; import org.newdawn.slick.state.StateBasedGame; import org.newdawn.slick.state.transition.Transition; import java.io.IOException; import java.net.URL; /** * A StateBaseGame subclass with support for a TWL Ui per state. * * @author Matthias Mann */ public abstract class TWLStateBasedGame extends StateBasedGame { private final Widget emptyRootWidget; private GUI gui; private boolean guiInitialized; protected TWLStateBasedGame(String name) { super(name); emptyRootWidget = new Widget(); emptyRootWidget.setTheme(""); } /** * Adds a new game state * * @param state the game state * @see StateBasedGame#addState(org.newdawn.slick.state.GameState) */ public void addState(BasicTWLGameState state) { super.addState(state); } /** * Adds a new game state. * <p/> * This method is overriden to ensure that only instances of BasicTWLGameState are added. * * @param state the game state. Must be an instance of BasicTWLGameState * @see StateBasedGame#addState(org.newdawn.slick.state.GameState) */ @Override public void addState(GameState state) { if (!(state instanceof BasicTWLGameState)) { throw new IllegalArgumentException("state must be a BasicTWLGameState"); } super.addState(state); } /** * Implement this method and return the URL for the TWL theme. * * @return the URL for the TWL theme. Must not be null. */ protected abstract URL getThemeURL(); /** * Transits to a the specified game state. * This method hides the UI of the current state before starting the transition. * * @param id The ID of the state to enter * @param leave The transition to use when leaving the current state * @param enter The transition to use when entering the new state * @see StateBasedGame#enterState(int, org.newdawn.slick.state.transition.Transition, org.newdawn.slick.state.transition.Transition) */ @Override public void enterState(int id, Transition leave, Transition enter) { if (gui != null) { gui.setRootPane(emptyRootWidget); } super.enterState(id, leave, enter); } protected ThemeManager loadTheme(Renderer renderer) throws IOException { URL url = getThemeURL(); assert url != null; return ThemeManager.createThemeManager(url, renderer); } protected void setRootPane(RootPane rootPane) throws SlickException { if (!guiInitialized) { guiInitialized = true; initGUI(); } if (gui != null) { gui.setRootPane(rootPane); } } protected void initGUI() throws SlickException { GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); try { Renderer renderer = new LWJGLRenderer(); ThemeManager theme = loadTheme(renderer); gui = new GUI(emptyRootWidget, renderer, null); gui.applyTheme(theme); Input input = getContainer().getInput(); TWLInputForwarder inputForwarder = new TWLInputForwarder(gui, input); input.addPrimaryListener(inputForwarder); } catch (Throwable e) { throw new SlickException("Could not initialize TWL GUI", e); } finally { GL11.glPopAttrib(); } } @Override protected void postRenderState(GameContainer container, Graphics g) throws SlickException { if (gui != null) { gui.draw(); } } @Override protected void postUpdateState(GameContainer container, int delta) throws SlickException { if (gui != null) { gui.setSize(); gui.handleTooltips(); gui.updateTimers(); gui.invokeRunables(); gui.validateLayout(); gui.setCursor(); } } }