/**
* Unsealed: Whispers of Wisdom.
*
* Copyright (C) 2012 - Juan 'Nushio' Rodriguez
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 of
* the License as published by the Free Software Foundation
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.k3rnel.unsealed.screens;
import net.k3rnel.unsealed.Unsealed;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
/**
* The base class for all game screens.
*/
public abstract class AbstractScreen extends InputAdapter implements Screen {
// the fixed viewport dimensions (ratio: 1.6)
public static final int GAME_VIEWPORT_WIDTH = 400, GAME_VIEWPORT_HEIGHT = 240;
public static final int MENU_VIEWPORT_WIDTH = 800, MENU_VIEWPORT_HEIGHT = 480;
protected final Unsealed game;
protected final Stage stage;
private BitmapFont font;
private SpriteBatch batch;
private Skin skin;
protected TextureAtlas atlas;
private Table table;
public AbstractScreen( Unsealed game ) {
this.game = game;
int width = ( isGameScreen() ? GAME_VIEWPORT_WIDTH : MENU_VIEWPORT_WIDTH );
int height = ( isGameScreen() ? GAME_VIEWPORT_HEIGHT : MENU_VIEWPORT_HEIGHT );
this.stage = new Stage( width, height, true );
}
protected String getName() {
return getClass().getSimpleName();
}
protected boolean isGameScreen() {
return false;
}
// Lazily loaded collaborators
public BitmapFont getFont() {
if( font == null ) {
font = new BitmapFont();
}
return font;
}
public SpriteBatch getBatch() {
if( batch == null ) {
batch = new SpriteBatch();
}
return batch;
}
public TextureAtlas getAtlas() {
if( atlas == null ) {
atlas = Unsealed.getInstance().getTextureAtlas();
}
return atlas;
}
protected Skin getSkin() {
if( skin == null ) {
FileHandle skinFile = Gdx.files.internal( "skin/uiskin.json" );
skin = new Skin( skinFile );
}
return skin;
}
protected Table getTable() {
if( table == null ) {
table = new Table( getSkin() );
table.setFillParent( true );
if( Unsealed.DEBUG ) {
table.debug();
}
stage.addActor( table );
}
return table;
}
// Screen implementation
@Override
public void show() {
Gdx.app.log( Unsealed.LOG, "Showing screen: " + getName() );
// set the stage as the input processor
Gdx.input.setInputProcessor( stage );
}
@Override
public void resize( int width, int height ) {
Gdx.app.log( Unsealed.LOG, "Resizing screen: " + getName() + " to: " + width + " x " + height );
}
@Override
public void render( float delta ) {
// (1) process the game logic
// update the actors
stage.act( delta );
// (2) draw the result
// clear the screen with the given RGB color (black)
Gdx.gl.glClearColor( 0f, 0f, 0f, 1f );
Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT );
// draw the actors
stage.draw();
// draw the table debug lines
Table.drawDebug( stage );
}
@Override
public void hide() {
Gdx.app.log( Unsealed.LOG, "Hiding screen: " + getName() );
// dispose the screen when leaving the screen;
// note that the dipose() method is not called automatically by the
// framework, so we must figure out when it's appropriate to call it
dispose();
}
@Override
public void pause() {
Gdx.app.log( Unsealed.LOG, "Pausing screen: " + getName() );
}
@Override
public void resume() {
Gdx.app.log( Unsealed.LOG, "Resuming screen: " + getName() );
}
@Override
public void dispose() {
Gdx.app.log( Unsealed.LOG, "Disposing screen: " + getName() );
// as the collaborators are lazily loaded, they may be null
if( font != null ) font.dispose();
if( batch != null ) batch.dispose();
if( skin != null ) skin.dispose();
// if( atlas != null ) atlas.dispose();
// if( stage != null ) stage.dispose();
}
public boolean keyUp(int keycode) {
return false;
}
}