先看图:

小球碰到边上反弹,下面的横杆接住小球让其再反弹上去。很简单,大家都见过的啦。
这里主要练习SurfaceView,Callback以及在SurfaceView中使用线程,看主要的View类:
package com.wt.app;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Paint.FontMetrics;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.SurfaceHolder.Callback;public class GameView extends SurfaceView implements Callback,Runnable{private static final String TAG="GameView";SurfaceHolder holder=null;int x,y=0;int speedX=0,speedY=0;int ball_x,ball_y=0;int ball_speedX=5,ball_speedY=5;int r=5;public GameView(Context context) {super(context);// TODO Auto-generated constructor stubholder=this.getHolder();holder.addCallback(this);this.setFocusable(true);}public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}public void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubx=(Consts.screenWidth-50)>>1;y=(Consts.screenHeight-10);ball_x=10;ball_y=10;new Thread(this).start();}public void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stub}boolean isKeyDown=false;boolean isRunning=true;public void run() {// TODO Auto-generated method stubPaint paint=new Paint();while(isRunning){move();paint(paint);try {Thread.sleep(15);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}private void paint(Paint paint) {// TODO Auto-generated method stubCanvas canvas=holder.lockCanvas();//刷屏canvas.drawColor(Color.WHITE);//paint.setColor(Color.WHITE);//canvas.drawRect(0, 0, Consts.screenWidth, Consts.screenHeight, paint);paint.setAntiAlias(true);paint.setStyle(Paint.Style.FILL);paint.setColor(Color.BLACK);canvas.drawRect(x, y, x+50, y+10, paint);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(5);paint.setColor(Color.RED);canvas.drawCircle(ball_x, ball_y, r, paint);if(gameOver){paint.setStrokeWidth(1);paint.setColor(Color.RED);paint.setTextSize(25);FontMetrics fm=paint.getFontMetrics();int textHeight=(int)Math.ceil((fm.descent-fm.top));float textWidth = paint.measureText("Game Over");canvas.drawText("Game Over", (Consts.screenWidth-textWidth)/2, (Consts.screenHeight-textHeight)/2, paint);}holder.unlockCanvasAndPost(canvas);}boolean gameOver=false;public void move(){if(isKeyDown){x+=speedX;if(x<0){x=0;}if(x>Consts.screenWidth-50){x=Consts.screenWidth-50;}}ball_x+=ball_speedX;ball_y+=ball_speedY;if(ball_x<r) ball_speedX=-ball_speedX;if(ball_x>Consts.screenWidth-r) ball_speedX=-ball_speedX;if(ball_y<r) ball_speedY=-ball_speedY;Rect r1=new Rect();r1.set(x, y, x+50, y+10);Rect r2=new Rect();r2.set(ball_x-r, ball_y-r, ball_x+r, ball_y+r);if(Tools.isCollideWith(r1, r2)){ball_speedY=-ball_speedY;}if(ball_y>Consts.screenHeight){gameOver=true;isRunning=false;}}}

Activity类:
package com.wt.app;import android.app.Activity;import android.os.Bundle;import android.util.DisplayMetrics;import android.util.Log;import android.view.Display;import android.view.KeyEvent;import android.view.Window;import android.view.WindowManager;public class GameActivity extends Activity {    /** Called when the activity is first created. */private static final String TAG="GameActivity";GameView view;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //无标题栏        this.requestWindowFeature(Window.FEATURE_NO_TITLE);        //全屏        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);                //窗口宽高        DisplayMetrics dm=new DisplayMetrics();        this.getWindowManager().getDefaultDisplay().getMetrics(dm);        Consts.screenWidth=dm.widthPixels;        Consts.screenHeight=dm.heightPixels;        //        Consts.screenWidth = this.getWindowManager().getDefaultDisplay().getWidth();//        Consts.screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();                Log.i(TAG,"Consts.screenWidth="+Consts.screenWidth);        Log.i(TAG,"Consts.screenHeight="+Consts.screenHeight);//        setContentView(R.layout.main);        view=new GameView(this);        setContentView(view);    }    @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubview.isKeyDown=true;switch (keyCode) {case KeyEvent.KEYCODE_DPAD_LEFT:view.speedX=-5;break;case KeyEvent.KEYCODE_DPAD_RIGHT:view.speedX=5;break;}return super.onKeyDown(keyCode, event);}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {// TODO Auto-generated method stubview.isKeyDown=false;view.speedX=0;return super.onKeyUp(keyCode, event);}    }

其他辅助类如下:
package com.wt.app;import android.graphics.Rect;public class Tools {public static final boolean isCollideWith(int ax,int ay,int aw,int ah,int bx,int by,int bw,int bh){if(ay-by>bh||ax-bx>bw||by-ay>ah||bx-ax>aw){return false;}return true;}public static final boolean isCollideWith(Rect r1,Rect r2){if(r2.left-r1.left>=r1.width()||r1.left-r2.left>=r2.width()||r2.top-r1.top>=r1.height()||r1.top-r2.top>=r2.height()){return false;}return true;}}

package com.wt.app;public class Consts {public static int screenWidth;public static int screenHeight;}

适合新手练习用!

更多相关文章

  1. android小游戏模版—重力感应
  2. Android游戏的基础:物体运动效果
  3. Android(安卓)Animation学习(三) ApiDemos解析:XML动画文件的使用
  4. Android:seekbar控件在某些背景下不能正常显示
  5. Android(安卓)自定义View控件,实现跟随手指触摸移动的小球
  6. 57.贝赛尔曲线初步(二) - 高仿QQ未读消息气泡拖拽黏连效果
  7. Android(安卓)ScrollView反弹效果的实现
  8. 动态绘制图形的基本思路
  9. Android拖动小球跟随手指移动Demo

随机推荐

  1. android开发(46) 使用 textview实现文字
  2. 创建Android依赖库-托管JCenter(全过程完
  3. Android(安卓)基于 Comparator 对象列表
  4. Android Junit 单元测试、异步测试方法简
  5. 通過XML設置屏幕方向(android:screenOrie
  6. Android源码阅读分析:从Activity开始(二)—
  7. 【Android】Uri、UriMatcher、ContentUri
  8. android滑动组件嵌套一般思路
  9. Android中Fragment的应用(android官方教程
  10. 技术---Java