碰撞检测的Demo

看了李明华老师那本游戏入门, 碰撞检测哪个部分不知道为什么判断时候要多加上那几句,感觉不加上也是可以的呀???? 求指点

现在把demo发上来:

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MySurfaceView(this));
    }
}

MySurfaceView.java

public class MySurfaceView extends SurfaceView implements Runnable, Callback {
    private Canvas canvas;
    private Paint paint;
    private boolean state;
    private boolean isCollision;
    private SurfaceHolder holder;
    private Thread mThread;
    private static final int MAX_TIME = 50;
    private int x1 =100,y1 =110,x2 = 100,y2 = 110;
    private int h1 = 40,w1 = 40,h2 = 40,w2 = 40;
    public MySurfaceView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        holder = this.getHolder();
        holder.addCallback(this);
        paint = new Paint();
        paint.setColor(Color.BLUE);
        setFocusable(true);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        state = true;
        mThread = new Thread(this);
        mThread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        
    }
    /* (non-Javadoc)
     * @see android.view.View#onTouchEvent(android.view.MotionEvent)
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        x1 = (int)event.getX() - w1/2;
        y1 = (int)event.getY() - h1/2;
        if (isCollisionWithRect(x1,y1,w1,h1,x2,y2,w2,h2)) {
            isCollision = true;
        }else {
            isCollision = false;
        }
        return true;
        
    }
    private boolean isCollisionWithRect(int x12, int y12, int w12, int h12,
            int x22, int y22, int w22, int h22) {
        // TODO Auto-generated method stub
        if (x1 + w1 <= x2) {
            return false;
        }else if (x1>=x2 + w2){
            return false;
        }else if (y1>=y2+h2) {
            return false;
        }else if (y1+h1<=y2) {
            return false;
        }
        return true;
    }

    public void mDraw(){
        try {
            canvas = holder.lockCanvas();
            if (canvas != null) {
                canvas.drawRGB(0, 0, 0);
                if (isCollision) {
                    paint.setColor(Color.RED);
                    paint.setTextSize(20);
                    canvas.drawText("Collision!", 0, 50, paint);
                }else {
                    paint.setColor(Color.WHITE);
                }
                canvas.drawRect(x1, y1, x1+w1, y1+h1, paint);
                canvas.drawRect(x2, y2, x2+w2, y2+h2, paint);
                
            }
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            if (canvas!=null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }
    private void logic() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (state) {
            long start  = System.currentTimeMillis();
            mDraw();
            logic();
            long end = System.currentTimeMillis();
            try {
                if ((end - start) < MAX_TIME) {
                    Thread.sleep(MAX_TIME - (end - start));
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        
    }
}

运行效果:

未发生碰撞,发生碰撞:

其中,在检测碰撞的代码部分,书本上面是这样子的(意思就是排除两个矩形不碰撞的情形,剩余的情况即发生了碰撞):

但是我觉得只要这样写不就行了吗:????

private boolean isCollisionWithRect(int x12, int y12, int w12, int h12,
            int x22, int y22, int w22, int h22) {
        // TODO Auto-generated method stub
        if (x1 + w1 <= x2) {
            return false;
        }else if (x1>=x2 + w2){
            return false;
        }else if (y1>=y2+h2) {
            return false;
        }else if (y1+h1<=y2) {
            return false;
        }
        return true;
    }

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

圆形区域的碰撞检测:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new CircleCollisionDemo(this));
    }
}
public class CircleCollisionDemo extends SurfaceView implements Runnable, Callback{

        private Canvas canvas;
        private Paint paint;
        private boolean state;
        private boolean isCollision;
        private SurfaceHolder holder;
        private Thread mThread;
        private static final int MAX_TIME = 50;
        private int x1 =100,y1 =110,x2 = 100,y2 = 110;
        private int r1 = 40,r2 = 50;
        public CircleCollisionDemo(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            holder = this.getHolder();
            holder.addCallback(this);
            paint = new Paint();
            paint.setColor(Color.BLUE);
            setFocusable(true);
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            state = true;
            mThread = new Thread(this);
            mThread.start();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            
        }
        /* (non-Javadoc)
         * @see android.view.View#onTouchEvent(android.view.MotionEvent)
         */
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // TODO Auto-generated method stub
            x1 = (int)event.getX();
            y1 = (int)event.getY();
            if (isCollisionWithCircle(x1,y1,x2,y2,r1,r2)) {
                isCollision = true;
            }else {
                isCollision = false;
            }
            return true;
        }
        private boolean isCollisionWithCircle(int x12, int y12, int x22, int y22, int r11, int r22) {
            // TODO Auto-generated method stub
            if (Math.sqrt(Math.pow(x12-x22, 2) + Math.pow(y12-y22, 2)) <= r1+r2) {
                return true;
            }else {
                return false;
            }
            //return false;
        }

        public void mDraw(){
            try {
                canvas = holder.lockCanvas();
                if (canvas != null) {
                    canvas.drawRGB(0, 0, 0);
                    if (isCollision) {
                        paint.setColor(Color.RED);
                        paint.setTextSize(20);
                        canvas.drawText("Collision!", 0, 50, paint);
                    }else {
                        paint.setColor(Color.WHITE);
                    }
                    canvas.drawCircle(x1, y1, r1, paint);
                    canvas.drawCircle(x2, y2, r2, paint);
                    
                }
            } catch (Exception e) {
                // TODO: handle exception
            }finally{
                if (canvas!=null) {
                    holder.unlockCanvasAndPost(canvas);
                }
            }
        }
        private void logic() {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (state) {
                long start  = System.currentTimeMillis();
                mDraw();
                logic();
                long end = System.currentTimeMillis();
                try {
                    if ((end - start) < MAX_TIME) {
                        Thread.sleep(MAX_TIME - (end - start));
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
            
        }
    }

运行效果:

原文地址:https://www.cnblogs.com/tiejiangweigaibianercunzai/p/3905802.html