android 圆形碰撞

圆形碰撞:主要是利用两圆形的圆心距进行判定的;当两圆的圆心距小于两圆半径之和,判定发生了碰撞。
创建实例:CircleCollsoin

项目效果图:

MySurfaceView.java


  1. 2.package com.circleCollsion;
    
    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 r1 = 20, r2 = 20;
    
    27.private int x1 = 50, y1 = 100, x2 = 150, y2 = 100;
    
    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.drawCircle(x1, y1, r1, paint);
    
    80.    canvas.drawCircle(x2, y2, r2, paint);
    
    81.   }
    
    82.  }catch(Exception e){
    
    83.   
    
    84.  }finally{
    
    85.   if(canvas != null)
    
    86.    sfh.unlockCanvasAndPost(canvas);
    
    87.  }
    
    88.}
    
    89./**
    
    90.  * 触屏事件监听
    
    91.  */
    
    92.@Override
    
    93.public boolean onTouchEvent(MotionEvent event) {
    
    94.  // TODO Auto-generated method stub
    
    95.  x1 = (int) event.getX();
    
    96.  y1 = (int) event.getY() ;
    
    97.  //当圆形之间发生碰撞
    
    98.  if(isCollsionWithCircle(x1,y1,x2,y2,r1,r2)){
    
    99.   isCollsion = true;//设置标志位为真
    
    100.   //当矩形之间没有发生碰撞
    
    101.  }else{
    
    102.   isCollsion = false; //设置标志位为假
    
    103.  }
    
    104.  return true;
    
    105.}
    
    106./**
    
    107.  * 圆形碰撞
    
    108.  * @param x1圆形1的圆心x坐标
    
    109.  * @param y1圆形1的圆心y坐标
    
    110.  * @param x2圆心2的圆形x坐标
    
    111.  * @param y2圆形2的圆形y坐标
    
    112.  * @param r1圆形1的半径
    
    113.  * @param r2圆形2的半径
    
    114.  */
    
    115.private boolean isCollsionWithCircle(int x1,int y1,int x2,int y2,int r1,int r2){
    
    116.  //Math.sqrt:开平方
    
    117.  //Math.pow(double x,double y):X的Y次方
    
    118.  if(Math.sqrt(Math.pow(x1 - x2, 2)+ Math.pow(y1 - y2,2))<= r1 + r2){
    
    119.   //如果两圆的圆心距小于或等于两圆半径则认为发生碰撞
    
    120.   return true;
    
    121.  }
    
    122.  return false;
    
    123.}
    
    124.
    
    125./**
    
    126.  * 按键事件监听
    
    127.  */
    
    128.@Override
    
    129.public boolean onKeyDown(int keyCode, KeyEvent event) {
    
    130.  // TODO Auto-generated method stub
    
    131.  return super.onKeyDown(keyCode, event);
    
    132.}
    
    133./**
    
    134.  * 游戏逻辑
    
    135.  */
    
    136.private void logic(){
    
    137.  
    
    138.}
    
    139.@Override
    
    140.public void run() {
    
    141.  // TODO Auto-generated method stub
    
    142.  while(flag){
    
    143.   long start = System.currentTimeMillis();
    
    144.   myDraw();
    
    145.   logic();
    
    146.   long end = System.currentTimeMillis();
    
    147.   try {
    
    148.    if (end - start < 50) {
    
    149.     Thread.sleep(50 - (end - start));
    
    150.    }
    
    151.   } catch(InterruptedException e){
    
    152.    e.printStackTrace();
    
    153.   }
    
    154.  }
    
    155.  
    
    156.}
    
    157./**
    
    158.  * Surfaceview视图状态发生改变,响应此函数
    
    159.  */
    
    160.@Override
    
    161.public void surfaceChanged(SurfaceHolder holder, int format, int width,
    
    162.   int height) {
    
    163.  // TODO Auto-generated method stub
    
    164.  
    
    165.}
    
    166./**
    
    167.  * Surfaceview视图消亡,响应此函数
    
    168.  */
    
    169.@Override
    
    170.public void surfaceDestroyed(SurfaceHolder holder) {
    
    171.  // TODO Auto-generated method stub
    
    172.  
    
    173.}
    
    174.}
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值