第一步:创建对象的基类Sprite
说明:因为游戏里的对象都有图片,位置属性
都有一个共有的方法,就是绘制自己

public abstract class Sprite {    public Bitmap defaultBitmap;    public Point position;    public Sprite(Bitmap defaultBitmap, Point position) {        this.defaultBitmap = defaultBitmap;        this.position = position;    }    /** * 每个对象都能画自己 * @param canvas */    public void drawSelf(Canvas canvas){        canvas.drawBitmap(defaultBitmap, position.x, position.y, null);    }}

第二步:创建三个对象 人, 按钮,笑脸

public class Man extends Sprite{    public static final int MOVE_DOWN = 0x00;    public static final int MOVE_UP = 0x01;    public static final int MOVE_LEFT = 0x02;    public static final int MOVE_RIGHT = 0x03;    private int speed = 6;    public Man(Bitmap defaultBitmap, Point position) {        super(defaultBitmap, position);    }    /** * 创建笑脸 * @param context * @param drawableId * @return */    public Face createFace(Context context,Point touchPoint,  int drawableId){        Bitmap faceBitmap = BitmapFactory.decodeResource(context.getResources(), drawableId);         Face face = new Face(faceBitmap, new Point(position.x + 50, position.y + 50), touchPoint);        return face;    }    /** * 移动 * @param direct */    public void move(int direct){        if (direct == MOVE_DOWN) {            position.y += speed;        }else if (direct == MOVE_UP) {            position.y -= speed;        }else if (direct == MOVE_LEFT) {            position.x -= speed;        }else if (direct == MOVE_RIGHT) {            position.x += speed;        }    }    /** * 设置速度 */    public void setSpeed(int speed){        this.speed = speed;    }}

public class MyButton extends Sprite{

    private boolean isClick = false;    private Bitmap pressBitmap;    public MyButton(Bitmap defaultBitmap, Point position, Bitmap pressBitmap) {        super(defaultBitmap, position);        this.pressBitmap = pressBitmap;    }    @Override    public void drawSelf(Canvas canvas) {        if (isClick) {            //绘制向下            canvas.drawBitmap(pressBitmap, position.x, position.y, null);        }else {            super.drawSelf(canvas);//默认        }    }    /** * 判断按钮是否可点击 * @return */    public boolean isClick(Point touchPoint) {        Rect rect = new Rect(position.x, position.y, position.x + pressBitmap.getWidth(), position.y + pressBitmap.getHeight());        isClick = rect.contains(touchPoint.x, touchPoint.y);        return isClick;    }    public void setClick(boolean isClick) {        this.isClick = isClick;    }    /** * 提供向外的点击事件 */    public void click(){        if (mListener != null) {            mListener.click();        }    }    private OnButtonClickListener mListener;    public interface OnButtonClickListener{        void click();    }    public void setOnButtonClickListener(OnButtonClickListener listener){        this.mListener = listener;    }}
public class Face extends Sprite{    int speed = 30;    private int tx;    private int ty;    public Face(Bitmap defaultBitmap, Point position, Point touchPoint) {        super(defaultBitmap, position);        //起始点与尾部点的距离,即三角形的的直角边        int X = touchPoint.x - position.x;        int Y = touchPoint.y - position.y;        //斜边长度        int Len = (int) Math.sqrt(X*X + Y*Y);        tx = speed * X / Len;        ty = speed * Y / Len;    }    /** * 笑脸移动的方法 */    public void move(){        this.position.x += tx;        this.position.y += ty;    }}

第三步:创建游戏界面

public class GameView extends SurfaceView implements SurfaceHolder.Callback{    private boolean isRuning = false;    private SurfaceTask mTask;    private SurfaceHolder mHolder;    private Man mMan;//人物    private List<Face> mFaces;//笑脸集合    private MyButton mButton;//按钮    private ExecutorService mPool;    public GameView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        mHolder = getHolder();        mHolder.addCallback(this);        mPool = Executors.newFixedThreadPool(5);    }    public GameView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public GameView(Context context) {        this(context, null);    }    @Override/**创建是调用*/    public void surfaceCreated(SurfaceHolder holder) {        Bitmap manBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.avatar_boy);         //创建小人        mMan = new Man(manBitmap, new Point(0, 0));        //创建笑脸        mFaces = new CopyOnWriteArrayList<Face>();        //创建按钮图片        Bitmap btnBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_default);        Bitmap pressBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_press);        mButton = new MyButton(btnBitmap, new Point(getWidth()/2, getHeight()-100), pressBitmap);        mButton.setOnButtonClickListener(listener);        mTask = new SurfaceTask();        isRuning = true;        mPool.execute(mTask);    }    private OnButtonClickListener listener = new OnButtonClickListener() {        @Override        public void click() {            mMan.move(Man.MOVE_DOWN);        }    };    @Override/**改变时是调用*/    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    }    @Override/**销毁时调用*/    public void surfaceDestroyed(SurfaceHolder holder) {        //停止线程        isRuning = false;    }    private class SurfaceTask implements Runnable{        @Override        public void run() {            while(isRuning){                try {                    long start = System.currentTimeMillis();                    drawUI();                    long end = System.currentTimeMillis();                    long dtime = end - start;                    int fps = (int) (1000 / dtime);//得到游戏的帧数 一般是30帧数                    System.out.println("fps --" + fps);                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }    /** * 处理屏幕点击 * @param event */    public void handTouch(MotionEvent event){        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:        case MotionEvent.ACTION_MOVE:            int x = (int) event.getRawX();            int y = (int) event.getRawY();            //处理按钮事件            if (mButton.isClick(new Point(x, y))) {                //mMan.move(Man.MOVE_DOWN);                mButton.click();            }else {                //创建笑脸并移动                Face mFace = mMan.createFace(getContext(), new Point(x, y), R.drawable.rating_small);                mFaces.add(mFace);            }            break;        case MotionEvent.ACTION_UP:            //手指抬起时,不能再点击            mButton.setClick(false);            break;        default:            break;        }    }    /** * 绘制矩形 */    public void drawUI() {        //锁定界面        Canvas canvas = mHolder.lockCanvas();        Paint paint = new Paint();        paint.setColor(Color.GRAY);        //画矩形        canvas.drawRect(0, 0, getWidth(), getHeight(), paint);        mMan.drawSelf(canvas);        mButton.drawSelf(canvas);        //List<Face> tempFaces = new ArrayList<Face>();        for(Face face : mFaces){            if (face != null) {                face.drawSelf(canvas);                face.move();                if (face.position.x < 0 || face.position.x > getWidth() || face.position.y < 0 || face.position.y > getHeight()) {                    mFaces.remove(face);                    //tempFaces.add(face);                }            }        }        //不在屏幕内的笑脸移除        //mFaces.remove(tempFaces);        //解锁并提交        mHolder.unlockCanvasAndPost(canvas);    }}

第四部:实现

public class PlantActivity extends Activity {    private GameView gameView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        gameView = new GameView(getApplicationContext());        setContentView(gameView);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        gameView.handTouch(event);        return super.onTouchEvent(event);    }}

更多相关文章

  1. Android生成随机数
  2. Android类参考---SQLiteOpenHelper
  3. Android(安卓)Activity之间实现数据(对象,对象集合)传递
  4. android 访问WebService
  5. javascript根据字符串创建Date对象,在ios和android中行为不一致
  6. Android复习笔记(11) -网络编程相关
  7. Android(安卓)按钮设置边框实例
  8. android使用Activity
  9. 在Android中访问WebService接口

随机推荐

  1. Android中事件的分发机制
  2. Android TextView、EditText显示表情
  3. Android(安卓)Push Notification实现信息
  4. Android/Ophone应用程序数字签名
  5. 搭建Android开发环境与开发工具选择
  6. 如果你想用对话框代替一个activity的话,可
  7. Android adb 常用技巧
  8. android EditText控件自动获取焦点弹出键
  9. android中和activity生命周期相关的那些
  10. 离线安装 Android 4.0 SDK