zoukankan      html  css  js  c++  java
  • Android碰撞检测——圆形检查

    圆形检查的思路:两个圆的圆心距小于两个圆的半径之和则相碰撞了,反之,没有发生碰撞

        /**
         * 两个圆的碰撞检测
         * @param x1
         * @param y1
         * @param r1
         * @param x2
         * @param y2
         * @param r2
         * @return
         */
        public static boolean CheckCollideCircle(int x1, int y1, int r1, int x2,
                int y2, int r2) {
            boolean iscollide=false;
            //两点之间的距离 小于两半径之和就发生了碰撞
            if(Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2, 2))<=r1+r2){
                iscollide=true;
            }
            return iscollide;
        }

    下面用一个完整列子说明

    public class CircleSurfaceView extends SurfaceView implements Callback,Runnable {
        int x1=70,y1=110,r1=40;
        int x2=220,y2=110,r2=40;
        boolean isCollide=false;//是否发生碰撞
        SurfaceHolder surfaceHolder;
        Paint paint;
        boolean flag=false;
        int sleeptime=100;
        Thread thread;
        public CircleSurfaceView(Context context) {
            super(context);
            surfaceHolder=getHolder();
            surfaceHolder.addCallback(this);
            paint=new Paint();
            paint.setTextSize(12);
            thread=new Thread(this);
            flag=true;
        }
        
        public void draw(Canvas canvas) {
            canvas.drawColor(Color.BLACK);
            if(isCollide){
                paint.setColor(Color.RED);
                canvas.drawText("Collide", 0, 30, paint);
            }
            else {
                paint.setColor(Color.WHITE);
                canvas.drawText("Not Collide", 0, 30, paint);
            }
            canvas.drawCircle(x1, y1, r1, paint);
            canvas.drawCircle(x2, y2, r2,paint);
        }
        /**
         * 触屏点击事件
         */
        @Override
        public boolean onTouchEvent(MotionEvent event){
            x1=(int)event.getX()-r1/2; //圆心坐标
            if(CheckCollide.CheckCollideCircle(x1, y1, r1, x2, y2, r2)){//检查碰撞的方法
                isCollide=true;
            }
            else {
                isCollide=false;
            }
            return true;
        }
    
        
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            if(!thread.isAlive()){
                thread.start();
            }
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            flag=false;
            thread=null;
        }
        @SuppressLint("WrongCall")
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Canvas canvas=null;
            while (flag) {
                try {
                    canvas=surfaceHolder.lockCanvas();
                    synchronized (canvas) {
                        draw(canvas);    
                    }
                } catch (Exception e) {
                    Log.e("Collide", e.getMessage());
                }finally{
                    if(canvas!=null){
                        surfaceHolder.unlockCanvasAndPost(canvas);
                    }
                }
                try {
                    Thread.sleep(sleeptime);
                } catch (Exception e) {
                    Log.e("Collide", e.getMessage());
                }
            }
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
            
        }
    
    }
  • 相关阅读:
    所谓的飞扬档案管理软件
    通过实例学习Virtools脚本语言VSL 解析字符串
    SQLite FAQ中文版
    通过实例学习Virtools脚本语言VSL 将物体排列于圆周上
    通过实例学习Virtools脚本语言VSL 解二次方程
    out 和 ref
    ASP.NET MVC深度接触:ASP.NET MVC请求生命周期
    ICSharpCode.SharpZipLib 压缩
    aspnet_regiis.exe 详解
    ASP.NET 配置文件 configSource 的用法
  • 原文地址:https://www.cnblogs.com/cindyOne/p/2996655.html
Copyright © 2011-2022 走看看