android 矩形碰撞

来源:互联网 发布:网络电视播放器排行 编辑:程序博客网 时间:2024/05/16 10:23
矩形碰撞就是利用两个矩形之间的位置关系来进行判断,如果一个矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞。其实两个矩形不发生碰撞的情况就只有四种,其他情况就是发生碰撞了
创建实例:RectCollion, 游戏框架为SurfaceView
项目效果图:
   
MySurfaceView.java
  1. 1.2.package com.rectCollsion;3.import android.content.Context;4.import android.graphics.Canvas;5.import android.graphics.Color;6.import android.graphics.Paint;7.import android.view.KeyEvent;8.import android.view.MotionEvent;9.import android.view.SurfaceHolder;10.import android.view.SurfaceHolder.Callback;11.import android.view.SurfaceView;12.public class MySurfaceView extends SurfaceView implements Callback,Runnable{13. //用于控制SurfaceView14. private SurfaceHolder sfh;15. //声明一个画笔16.private Paint paint;17. //声明一个线程18.private Thread th;19. //线程消亡的标志位20.private boolean flag;21. //声明一个画布22.private Canvas canvas;23. //声明屏幕的宽高24.private int screenW,screenH;25. //定义两个矩形的宽高坐标26.private int x1 = 10,y1 = 110,w1 = 40,h1 = 40;27. private int x2 = 10,y2 = 110,w2 = 40,h2 = 40;28. //便于观察是否发生碰撞设置一个标识位29.private boolean isCollsion;30.31. /**32.  * SurfaceView初始化函数33.  */34.public MySurfaceView(Context context){35.  super(context);36.  //实例SurfaceHolder37.  sfh = this.getHolder();38.  //为SurfaceView添加状态监听39.  sfh.addCallback(this);40.  //实例一个画笔41.  paint = new Paint();42.  //设置画笔颜色为白色43.  paint.setColor(Color.WHITE);44.  //设置焦点45.  setFocusable(true);46. }47. @Override48. public void surfaceCreated(SurfaceHolder holder) {49.  // TODO Auto-generated method stub50.  screenW = this.getWidth();51.  screenH = this.getHeight();52.  flag = true;53.  //实例线程54.  th = new Thread(this);55.  //启动线程56.  th.start();57. }58.59.60. /**61.  * 游戏绘图62.  */63.public void myDraw(){64.  try {65.   canvas = sfh.lockCanvas();66.   if(canvas != null){67.    //刷屏68.    canvas.drawColor(Color.BLACK);69.    //判断是否发生了碰撞70.    if(isCollsion){//发生碰撞71.     paint.setColor(Color.RED);72.     paint.setTextSize(20);73.     canvas.drawText("Collision!", 0, 30, paint);74.     75.    } else{//没发生碰撞76.     paint.setColor(Color.WHITE);77.    }78.    //绘制两个矩形79.    canvas.drawRect(x1, y1, x1 + w1, y1 + h1, paint);80.    canvas.drawRect(x2, y2, x2 + w2, y2 + h2, paint);81.    82.   }83.  }catch(Exception e){84.   85.  }finally{86.   if(canvas != null)87.    sfh.unlockCanvasAndPost(canvas);88.  }89. }90. /**91.  * 触屏事件监听92.  */93. @Override94. public boolean onTouchEvent(MotionEvent event) {95.  // TODO Auto-generated method stub96.  //让矩形1随着触屏位置移动(触屏点设为此矩形的中心点)97.  x1 = (int) event.getX() - w1/2;98.  y1 = (int) event.getY() - h1/2;99.  //当矩形之间发生碰撞100.  if(isCollsionWithRect(x1,y1,w1,h1,x2,y2,w2,h2)){101.   isCollsion = true;//设置标志位为真102.   //当矩形之间没有发生碰撞103.  }else{104.   isCollsion = false; //设置标志位为假105.  }106.  return true;107. }108. /**109.  * 矩形碰撞的函数110.  * @param x1 第一个矩形的X坐标111.  * @param y1 第一个矩形的Y坐标112.  * @param w1 第一个矩形的宽113.  * @param h1 第一个矩形的高114.  * @param x2 第二个矩形的X坐标115.  * @param y2 第二个矩形的Y坐标116.  * @param w2 第二个矩形的宽117.  * @param h2 第二个矩形的高118.  */119.public boolean isCollsionWithRect(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2){120.  //当矩形1位于矩形2的左侧121.  if (x1 >= x2 && x1>= x2 + w2){122.   return false;123.  //当矩形1位于矩形2的右侧124.  } else if (x1<= x2 && x1 + w1 <= x2){125.   return false;126.  //当矩形1位于矩形2的上方127.  } else if (y1 >= y2 && y1>= y2 + h2){128.   return false;129.  } else if (y1 <= y2 && y1 + h1 <= y2){130.   return false;131.  }132.  //所有不会发生碰撞都不满足时,肯定就是碰撞了133.  return true;134. }135.136. /**137.  * 按键事件监听138.  */139. @Override140. public boolean onKeyDown(int keyCode, KeyEvent event) {141.  // TODO Auto-generated method stub142.  return super.onKeyDown(keyCode, event);143. }144. /**145.  * 游戏逻辑146.  */147.private void logic(){148.  149. }150. @Override151. public void run() {152.  // TODO Auto-generated method stub153.  while(flag){154.   long start = System.currentTimeMillis();155.   myDraw();156.   logic();157.   long end = System.currentTimeMillis();158.   try {159.    if (end - start < 50) {160.     Thread.sleep(50 - (end - start));161.    }162.   } catch(InterruptedException e){163.    e.printStackTrace();164.   }165.  }166.  167. }168. /**169.  * Surfaceview视图状态发生改变,响应此函数170.  */171. @Override172. public void surfaceChanged(SurfaceHolder holder, int format, int width,173.   int height) {174.  // TODO Auto-generated method stub175.  176. }177. /**178.  * Surfaceview视图消亡,响应此函数179.  */180. @Override181. public void surfaceDestroyed(SurfaceHolder holder) {182.  // TODO Auto-generated method stub183.  184. }185.}

RectCollsionActivity.java
  1. 1.2.package com.rectCollsion;3.import android.app.Activity;4.import android.os.Bundle;5.import android.view.Window;6.import android.view.WindowManager;7.public class RectCollsionActivity extends Activity {8.    /** Called when the activity is first created. */9.    @Override10.    public void onCreate(Bundle savedInstanceState) {11.        super.onCreate(savedInstanceState);12.        this.requestWindowFeature(Window.FEATURE_NO_TITLE);13.        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 14.          WindowManager.LayoutParams.FLAG_FULLSCREEN);15.        setContentView(new MySurfaceView(this));16.    }17.}18.

0 0
原创粉丝点击