package rabbitescape.ui.android; import android.content.Context; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewConfiguration; import java.util.Map; import rabbitescape.engine.Token; import rabbitescape.engine.World; import rabbitescape.engine.config.TapTimer; import rabbitescape.ui.android.sound.AndroidSound; public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, View.OnClickListener { // Saved state (saved by AndroidGameActivity) private OnScaleListener scaleGestureListener; private ScaleGestureDetector scaleGestureDetector; // Transient state private final NumLeftListener numLeftListener; private final AndroidSound sound; private final Scrolling scrolling; public final Game game; private final World world; public GameSurfaceView( Context context, NumLeftListener numLeftListener, AndroidSound sound, Game game, World world ) { super( context ); this.numLeftListener = numLeftListener; this.sound = sound; this.game = game; this.world = world; this.scaleGestureListener = null; this.scaleGestureDetector = null; this.scrolling = new Scrolling( this, ViewConfiguration.get( context ).getScaledTouchSlop() ); getHolder().addCallback( this ); setOnClickListener( this ); this.scaleGestureListener = new OnScaleListener( game.gameLaunch.graphics ); this.scaleGestureDetector = new ScaleGestureDetector( getContext(), this.scaleGestureListener ); for ( Map.Entry<Token.Type, Integer> e : world.abilities.entrySet() ) { numLeftListener.numLeft( e.getKey(), e.getValue() ); } } @Override public void surfaceCreated( SurfaceHolder surfaceHolder ) { game.start( surfaceHolder ); } @Override public void surfaceChanged( SurfaceHolder surfaceHolder, int format, int width, int height ) { } @Override public void surfaceDestroyed( SurfaceHolder surfaceHolder ) { game.stop(); } public boolean togglePaused() { AndroidGameLaunch gameLaunch = game.gameLaunch; gameLaunch.setPaused( !gameLaunch.paused() ); return gameLaunch.paused(); } public boolean toggleSpeed() { AndroidGameLaunch gameLaunch = game.gameLaunch; return gameLaunch.toggleSpeed(); } @Override public void onClick( View view ) { // Check for cheat mode enabling TapTimer.newTap(); if ( game.gameLaunch.chosenAbility == null ) { return; } int prev = world.abilities.get( game.gameLaunch.chosenAbility ); int numLeft = game.gameLaunch.addToken( game.gameLaunch.chosenAbility, scrolling.curX, scrolling.curY ); if ( numLeft != prev ) { sound.playSound( "place_token" ); } numLeftListener.numLeft( game.gameLaunch.chosenAbility, numLeft ); } @Override public boolean onTouchEvent( MotionEvent event ) { boolean ret = scaleGestureDetector.onTouchEvent( event ); ret = scrolling.onTouchEvent( event ) || ret; return ret || super.onTouchEvent( event ); } }