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; static int check(int x, int w, int sw) { return x > sw ? -w : x < -w ? sw : x; } class MyView extends SurfaceView implements Runnable { Bitmap droid; int d_x, d_y, d_dx, d_dy; Rect d_r = new Rect(); List rocks = new ArrayList(); long startTime; long score; Random rand = new Random(); public class Rock { Rect r; int w, h, dx, dy; public Rock(int sw, int sh) { w = 6 + rand.nextInt(7); h = 6 + rand.nextInt(7); int x = rand.nextInt(sw - w); int y = rand.nextInt(sh - h); r = new Rect(x, y, x + w, y + h); dx = rand.nextInt(5) - 2; dy = rand.nextInt(5) - 2; } void move(Canvas canvas){ r.left = MyGame.check(r.left + dx, r.width(), canvas.getWidth()); r.top = MyGame.check(r.top + dy, r.height(), canvas.getHeight()); r.right = r.left + w; r.bottom = r.top + h; } Boolean collision(Rect d) { return d.contains(r); } void draw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawRect(r, paint); } } public MyView(Context context) { super(context); droid = BitmapFactory.decodeResource(context.getResources(), R.drawable.droid); init(); mainThread = new Thread(this); mainThread.start(); } void init() { Display disp = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); d_x = (disp.getWidth() - droid.getWidth()) / 2; d_y = (disp.getHeight() - droid.getHeight()) / 2 - 20; d_dx = d_dy = 0; rocks.clear(); score = 0; startTime = System.currentTimeMillis(); } void doDraw() { Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { d_x = MyGame.check(d_x, droid.getWidth(), canvas.getWidth()); d_y = MyGame.check(d_y, droid.getHeight(), 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 (Rock rock : rocks) { rock.move(canvas); rock.draw(canvas); } 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) / 5000) addRock(canvas.getWidth(), canvas.getHeight()); getHolder().unlockCanvasAndPost(canvas); for (Rock rock : rocks) if (rock.collision(d_r)) gameover(); } } public void gameover() { //isRunning = false; Intent intent = new Intent(MyGame.this, MyGameOver.class); intent.putExtra("SCORE", score); startActivity(intent); init(); } void addRock(int sw, int sh){ Rect safe = new Rect(d_r); safe.offset(d_dx * 4, d_dy * 4); Rock rock; do { rock = new Rock(sw, sh); } while(rock.collision(d_r) || rock.collision(safe)); 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(); } } protected void onActivityResult(int requestCode, int resultCode,Intent data){ Log.d("MyGame", "onActivityResult()"); } }