package com.example.android.surfaceview; import java.util.ArrayList; import java.util.List; import java.util.Random; import android.app.Activity; import android.content.Context; import android.content.Intent; 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.os.Bundle; import android.util.Log; import android.view.Display; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.WindowManager; public class MyGame extends Activity { MyView view; Thread mainThread; //Boolean isRunning; class MyView extends SurfaceView implements Runnable { Bitmap droid; int d_x, d_y, d_dx, d_dy; Context context; Rect d_r = new Rect(); List rocks = new ArrayList(); long startTime = System.currentTimeMillis(); long score; Random rand = new Random(); public MyView(Context context) { super(context); this.context = context; droid = BitmapFactory.decodeResource(context.getResources(), R.drawable.droid); Display disp = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); d_x = (disp.getWidth() - droid.getWidth()) / 2; d_y = (disp.getHeight() - droid.getHeight()) / 2 - 20; rocks.clear(); score = 0; mainThread = new Thread(this); mainThread.start(); } void doDraw() { Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { if (d_x > canvas.getWidth()) d_x = - droid.getWidth(); else if (d_x < - droid.getWidth()) d_x = canvas.getWidth(); if (d_y > canvas.getHeight()) d_y = - droid.getHeight(); else if (d_y < - droid.getHeight()) d_y = canvas.getHeight(); canvas.drawColor(Color.BLACK); canvas.drawBitmap(droid, d_x, d_y, null); Paint paint = new Paint(); score += Math.abs(d_dx) + Math.abs(d_dy); paint.setColor(Color.WHITE); paint.setTextSize(24); String s = "0000000000"+score; canvas.drawText(s.substring(s.length() - 10), 0, paint.getTextSize(), paint); paint.setColor(Color.GRAY); s = "x:" + d_dx + " y:" + d_dy; canvas.drawText(s, 0, paint.getTextSize() * 2, paint); paint.setColor(Color.RED); for (Rect rock : rocks) canvas.drawRect(rock, paint); d_r.set(d_x + 4, d_y + 4, d_x + droid.getWidth() - 8, d_y + droid.getHeight() - 8); long now = System.currentTimeMillis(); if (rocks.size() < (now - startTime) / 3000) addRock(canvas.getWidth(), canvas.getHeight()); getHolder().unlockCanvasAndPost(canvas); for (Rect rock : rocks) if (d_r.contains(rock)) gameover(); } } public void gameover() { Intent intent = new Intent(MyGame.this, MyGameOver.class); intent.putExtra("SCORE", score); startActivity(intent); } void addRock(int sw, int sh){ Rect safe = new Rect(d_r); safe.offset(d_dx * 4, d_dy * 4); Rect rock; do { int w = 4 + rand.nextInt(7); int h = 4 + rand.nextInt(7); int x = rand.nextInt(sw - w); int y = rand.nextInt(sh - h); rock = new Rect(x, y, x + w, y + h); } while(d_r.contains(rock) || safe.contains(rock)); rocks.add(rock); } @Override public boolean onTouchEvent(MotionEvent event) { Log.d("MyGame", "onTouchEvent()"); int x = d_x + droid.getWidth() / 2; int y = d_y + droid.getHeight() / 2; d_dx += (event.getX() - x) / 50; d_dy += (event.getY() - y) / 50; return true; } public void run() { while (true) { d_x += d_dx; d_y += d_dy; doDraw(); try { Thread.sleep(100); } catch (InterruptedException e) {} } } } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("My Game"); view = new MyView(this); setContentView(view); } @Override protected void onDestroy() { super.onDestroy(); if (mainThread != null && mainThread.isAlive()) { mainThread.interrupt(); } } }