/** * */ package net.obviam.walking; import net.obviam.walking.model.ElaineAnimated; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; /** * @author impaler * This is the main surface that handles the ontouch events and draws * the image to the screen. */ public class MainGamePanel extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG = MainGamePanel.class.getSimpleName(); private MainThread thread; private ElaineAnimated elaine; private Bitmap background; // the fps to be displayed private String avgFps; public void setAvgFps(String avgFps) { this.avgFps = avgFps; } public MainGamePanel(Context context) { super(context); // adding the callback (this) to the surface holder to intercept events getHolder().addCallback(this); // create Elaine and load bitmap elaine = new ElaineAnimated( BitmapFactory.decodeResource(getResources(), R.drawable.guybrush3) , 0, 0 // initial position , 30, 30 // width and height of sprite , 7, 6); // FPS and number of frames in the animation Resources res = getResources(); background = BitmapFactory.decodeResource(res, R.drawable.background); // create the game loop thread thread = new MainThread(getHolder(), this); // make the GamePanel focusable so it can handle events setFocusable(true); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { // at this point the surface is created and // we can safely start the game loop thread.setRunning(true); thread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG, "Surface is being destroyed"); // tell the thread to shut down and wait for it to finish // this is a clean shutdown boolean retry = true; while (retry) { try { thread.join(); retry = false; } catch (InterruptedException e) { // try again shutting down the thread } } Log.d(TAG, "Thread was shut down cleanly"); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // handle touch } return true; } public void render(Canvas canvas) { canvas.drawColor(Color.BLACK); canvas.drawBitmap(background, null, new Rect(0, 0, getWidth(), getHeight()), new Paint()); elaine.draw(canvas); // display fps displayFps(canvas, avgFps); } /** * This is the game update method. It iterates through all the objects * and calls their update method if they have one or calls specific * engine's update method. */ public void update() { elaine.update(System.currentTimeMillis()); } private void displayFps(Canvas canvas, String fps) { if (canvas != null && fps != null) { Paint paint = new Paint(); paint.setARGB(255, 255, 255, 255); canvas.drawText(fps, this.getWidth() - 50, 20, paint); } } }