package com.subspace.android; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public class GamePanel extends SurfaceView implements SurfaceHolder.Callback, GestureDetector.OnGestureListener { Arena arena; PanelThread _thread; private GestureDetector gestureScanner; int x; int y; Paint paint = new Paint(); Rect viewPort = new Rect(); public GamePanel(Context context) { super(context); gestureScanner = new GestureDetector(context,this); paint.setColor(Color.GREEN); getHolder().addCallback(this); //centre it x = 1024*16 / 2; y = 1024*16/2; } public void setArena(Arena arena) { this.arena = arena; } @Override public void onDraw(Canvas canvas) { // draw map if its loaded if (arena != null && arena.Lvl!=null) { int screenWidth = getWidth(); int screenHeight = getHeight(); canvas.drawText("x " + x + " y " + y, 100,100, paint); viewPort.set(x,y,x+screenWidth,y+screenHeight); arena.Lvl.Draw(canvas,viewPort); } } @Override public boolean onTouchEvent(MotionEvent me) { return gestureScanner.onTouchEvent(me); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return true; } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return true; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub x+=distanceX; y+=distanceY; return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { setWillNotDraw(false); // Allows us to use invalidate() to call onDraw() _thread = new PanelThread(getHolder(), this); // Start the thread that _thread.setRunning(true); // will make calls to _thread.start(); // onDraw() } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub try { _thread.setRunning(false); // Tells thread to stop _thread.join(); // Removes thread from mem. } catch (InterruptedException e) { } } // thread to invalidate drawing class PanelThread extends Thread { private SurfaceHolder _surfaceHolder; private GamePanel _panel; private boolean _run = false; public PanelThread(SurfaceHolder surfaceHolder, GamePanel panel) { _surfaceHolder = surfaceHolder; _panel = panel; } public void setRunning(boolean run) { // Allow us to stop the thread _run = run; } @Override public void run() { Canvas c; while (_run) { // When setRunning(false) occurs, _run is c = null; // set to false and loop ends, stopping thread try { c = _surfaceHolder.lockCanvas(null); synchronized (_surfaceHolder) { // Insert methods to modify positions of items in // onDraw() postInvalidate(); } } finally { if (c != null) { _surfaceHolder.unlockCanvasAndPost(c); } } } } } }