package Roguelike.Screens;
import Roguelike.Global;
import Roguelike.RoguelikeGame;
import Roguelike.RoguelikeGame.ScreenEnum;
import Roguelike.DungeonGeneration.AbstractDungeonGenerator;
import Roguelike.Entity.GameEntity;
import Roguelike.Levels.Level;
import Roguelike.Save.SaveLevel;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.ProgressBar;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
public class LoadingScreen implements Screen
{
public static LoadingScreen Instance;
boolean created = false;
public LoadingScreen()
{
Instance = this;
}
private void create()
{
skin = Global.loadSkin();
stage = new Stage( new ScreenViewport() );
batch = new SpriteBatch();
Table table = new Table();
label = new Label( "Loading", skin, "title" );
progressBar = new ProgressBar( 0, 100, 1, false, skin );
table.add( progressBar ).expand().fillX().bottom().pad( 20 );
table.row();
table.add( label ).expand().top().pad( 20 );
table.setFillParent( true );
stage.addActor( table );
}
@Override
public void show()
{
if ( !created )
{
create();
created = true;
}
Gdx.input.setInputProcessor( stage );
camera = new OrthographicCamera( Global.Resolution[0], Global.Resolution[1] );
camera.translate( Global.Resolution[0] / 2, Global.Resolution[1] / 2 );
camera.setToOrtho( false, Global.Resolution[0], Global.Resolution[1] );
camera.update();
batch.setProjectionMatrix( camera.combined );
stage.getViewport().setCamera( camera );
stage.getViewport().setWorldWidth( Global.Resolution[0] );
stage.getViewport().setWorldHeight( Global.Resolution[1] );
stage.getViewport().setScreenWidth( Global.ScreenSize[0] );
stage.getViewport().setScreenHeight( Global.ScreenSize[1] );
}
@Override
public void render( float delta )
{
if ( !doCreate ) { return; }
if ( complete && event != null )
{
generationString = "Executing Events";
}
label.setText( generationString );
progressBar.setValue( percent );
stage.act();
Gdx.gl.glClearColor( 0.3f, 0.3f, 0.3f, 1 );
Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT );
stage.draw();
if ( complete )
{
onComplete( generator.getLevel() );
}
complete = generator.generate();
percent = generator.percent;
generationString = generator.generationText;
// limit fps
sleep( Global.FPS );
}
public void onComplete( Level level )
{
if ( event == null )
{
Global.changeLevel( level, player, travelData );
Global.CurrentLevel.player.isVariableMapDirty = true;
RoguelikeGame.Instance.switchScreen( ScreenEnum.GAME );
}
else
{
event.execute( level );
event = null;
}
}
// ----------------------------------------------------------------------
private long diff, start = System.currentTimeMillis();
public void sleep( int fps )
{
if ( fps > 0 )
{
diff = System.currentTimeMillis() - start;
long targetDelay = 1000 / fps;
if ( diff < targetDelay )
{
try
{
Thread.sleep( targetDelay - diff );
}
catch ( InterruptedException e )
{
}
}
start = System.currentTimeMillis();
}
}
@Override
public void resize( int width, int height )
{
Global.ScreenSize[0] = width;
Global.ScreenSize[1] = height;
float w = Global.TargetResolution[0];
float h = Global.TargetResolution[1];
if ( width < height )
{
h = w * ( (float) height / (float) width );
}
else
{
w = h * ( (float) width / (float) height );
}
Global.Resolution[0] = (int) w;
Global.Resolution[1] = (int) h;
camera = new OrthographicCamera( Global.Resolution[0], Global.Resolution[1] );
camera.translate( Global.Resolution[0] / 2, Global.Resolution[1] / 2 );
camera.setToOrtho( false, Global.Resolution[0], Global.Resolution[1] );
camera.update();
batch.setProjectionMatrix( camera.combined );
stage.getViewport().setCamera( camera );
stage.getViewport().setWorldWidth( Global.Resolution[0] );
stage.getViewport().setWorldHeight( Global.Resolution[1] );
stage.getViewport().setScreenWidth( Global.ScreenSize[0] );
stage.getViewport().setScreenHeight( Global.ScreenSize[1] );
}
@Override
public void pause()
{
}
@Override
public void resume()
{
}
@Override
public void hide()
{
}
@Override
public void dispose()
{
}
public boolean set( SaveLevel level, GameEntity player, Object travelData, PostGenerateEvent event )
{
this.player = player;
this.travelData = travelData;
this.event = event;
this.level = level;
generator = AbstractDungeonGenerator.load( level );
this.percent = generator.percent;
this.generationString = generator.generationText;
this.complete = false;
doCreate = true;
return true;
}
// ----------------------------------------------------------------------
public OrthographicCamera camera;
Stage stage;
Skin skin;
SpriteBatch batch;
Label label;
ProgressBar progressBar;
boolean doCreate = false;
boolean complete;
String generationString;
int percent = 0;
SaveLevel level;
GameEntity player;
Object travelData;
AbstractDungeonGenerator generator;
PostGenerateEvent event;
public static abstract class PostGenerateEvent
{
public abstract void execute( Level level );
}
}