android 矩形碰撞

矩形碰撞就是利用两个矩形之间的位置关系来进行判断,如果一个矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞。其实两个矩形不发生碰撞的情况就只有四种,其他情况就是发生碰撞了
创建实例: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. //用于控制SurfaceView
    
    14. 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.  //实例SurfaceHolder
    
    37.  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. @Override
    
    48. public void surfaceCreated(SurfaceHolder holder) {
    
    49.  // TODO Auto-generated method stub
    
    50.  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. @Override
    
    94. public boolean onTouchEvent(MotionEvent event) {
    
    95.  // TODO Auto-generated method stub
    
    96.  //让矩形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. @Override
    
    140. public boolean onKeyDown(int keyCode, KeyEvent event) {
    
    141.  // TODO Auto-generated method stub
    
    142.  return super.onKeyDown(keyCode, event);
    
    143. }
    
    144. /**
    
    145.  * 游戏逻辑
    
    146.  */
    
    147.private void logic(){
    
    148.  
    
    149. }
    
    150. @Override
    
    151. public void run() {
    
    152.  // TODO Auto-generated method stub
    
    153.  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. @Override
    
    172. public void surfaceChanged(SurfaceHolder holder, int format, int width,
    
    173.   int height) {
    
    174.  // TODO Auto-generated method stub
    
    175.  
    
    176. }
    
    177. /**
    
    178.  * Surfaceview视图消亡,响应此函数
    
    179.  */
    
    180. @Override
    
    181. public void surfaceDestroyed(SurfaceHolder holder) {
    
    182.  // TODO Auto-generated method stub
    
    183.  
    
    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.    @Override
    
    10.    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.
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值