package rabbitescape.ui.android;
import android.os.Bundle;
import rabbitescape.engine.LevelWinListener;
import rabbitescape.engine.Token;
import rabbitescape.engine.World;
import rabbitescape.engine.config.Config;
import rabbitescape.render.BitmapCache;
import rabbitescape.render.SoundPlayer;
import rabbitescape.render.gameloop.GameLoop;
import rabbitescape.render.gameloop.GeneralPhysics;
import rabbitescape.render.gameloop.WaterAnimation;
import static android.text.TextUtils.join;
public class AndroidGameLaunch implements Runnable
{
// Constants
public static final String STATE_WORLD = "rabbitescape.world";
private static final String STATE_SCROLL_X = "rabbitescape.scrollx";
private static final String STATE_SCROLL_Y = "rabbitescape.scrolly";
public static final String STATE_FAST_PRESSED = "rabbitescape.fast_pressed";
private final Config config;
public final GeneralPhysics physics;
private final WaterAnimation waterAnimation;
public final AndroidGraphics graphics;
public final SoundPlayer soundPlayer;
public final AndroidInput input;
public final WorldSaver worldSaver;
private GameLoop loop;
public Token.Type chosenAbility;
public AndroidGameLaunch(
BitmapCache<AndroidBitmap> bitmapCache,
Config config,
World world,
LevelWinListener winListener,
Bundle savedInstanceState
)
{
this.soundPlayer = new SoundPlayer( Globals.sound );
this.config = config;
int scrollX;
int scrollY;
boolean fast;
if ( savedInstanceState != null )
{
scrollX = savedInstanceState.getInt( STATE_SCROLL_X, 0 );
scrollY = savedInstanceState.getInt( STATE_SCROLL_Y, 0 );
fast = savedInstanceState.getBoolean( STATE_FAST_PRESSED, false );
}
else
{
scrollX = 0;
scrollY = 0;
fast = false;
}
this.waterAnimation = new WaterAnimation( world );
this.physics = new GeneralPhysics( world, waterAnimation, winListener, fast );
this.worldSaver = new WorldSaver( world, this );
this.input = new AndroidInput( worldSaver );
this.loop = null;
this.chosenAbility = null;
this.graphics = new AndroidGraphics(
bitmapCache, soundPlayer, world, waterAnimation, scrollX, scrollY );
}
@Override
public void run()
{
loop.run();
}
public boolean toggleSpeed()
{
physics.fast = !physics.fast;
return physics.fast;
}
public void stopAndDispose()
{
loop.pleaseStop();
input.dispose();
graphics.dispose();
physics.dispose();
}
public int addToken( Token.Type ability, float pixelX, float pixelY )
{
int x = (int)( ( pixelX + graphics.scrollX ) / graphics.renderingTileSize );
int y = (int)( ( pixelY + graphics.scrollY ) / graphics.renderingTileSize );
return physics.addToken( x, y, ability );
}
public void setPaused( boolean paused )
{
physics.world.paused = paused;
}
public boolean paused()
{
return physics.world.paused;
}
public void onSaveInstanceState( Bundle outState )
{
outState.putString( STATE_WORLD, join( "\n", worldSaver.waitUntilSaved() ) );
outState.putInt( STATE_SCROLL_X, graphics.scrollX );
outState.putInt( STATE_SCROLL_Y, graphics.scrollY );
outState.putBoolean( STATE_FAST_PRESSED, physics.fast );
}
public boolean isRunning()
{
return loop != null && loop.isRunning();
}
public void readyToRun()
{
this.loop = new GameLoop( input, physics, waterAnimation, graphics, config, null );
}
public void scrollBy( float x, float y )
{
graphics.scrollBy( x, y );
}
}