碰撞检测的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
                }
            }

        }
    }

运行效果:

碰撞检测的Demo,布布扣,bubuko.com

时间: 2024-09-29 20:07:36

碰撞检测的Demo的相关文章

HTML5实现3D和2D可视化QuadTree四叉树碰撞检测

QuadTree四叉树顾名思义就是树状的数据结构,其每个节点有四个孩子节点,可将二维平面递归分割子区域.QuadTree常用于空间数据库索引,3D的椎体可见区域裁剪,甚至图片分析处理,我们今天介绍的是QuadTree最常被游戏领域使用到的碰撞检测.采用QuadTree算法将大大减少需要测试碰撞的次数,从而提高游戏刷新性能,本文例子基于HT for Web的Canvas拓扑图和WebGL的3D引擎组件,通过GraphView和Graph3dView共享同一数据模型DataModel,同时呈现Qua

(转)Unity3d中的碰撞检测

很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自己所了解的碰撞检测,希望高手不佞赐教. 首先,我们得明确一点:即产生碰撞信息所需要的条件.事实上,在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器.这两种方式的应用非常广泛.为了完整的了解这两种方式,我们必须理解以下概念:    (一)碰撞器是一群组件,它包含了

untiy 第二个逗比又无聊的跑酷demo

逗比刘真是菜啊,天天就知道写这种无聊的东西,写了也不一定有人看的.看了也不一定有人喜欢.喜欢也没有什么卵用啊.先分享一波图吧. 大家第一眼看见是个什么?(逗比刘第一眼说 是精子小蝌蚪啊,逗比刘好邪恶啊) 做一个这样的demo可以说基本用不到很多素材,最重要的素材就是那个圆圈,这个圆圈对于一个程序员来说画起来应该蛮简单的吧.前天我们讲到如果绘制一个2D的圆环,今天我们就绘制一个3D的圆环,如果我们把一个2D的圆绕着一个轴旋转一周就可以做出一个3D的圆环了. 那么我们首先的建一个基本的类Pipe用来

碰撞检测之分离轴定理算法讲解

本文翻译自@sevenson的文章Separating Axis Theorem (SAT) Explanation .原文作者用的是ActionScript 3来编写算法,不过文中主要讲述的还是算法原理,我想一旦算法原理被我们掌握了,选择什么编程语言来实现算法都是次要的事情了. 本人并非英文专业,所以文中翻译得有不妥或疏漏之处,欢迎各位指正,谢谢! 正文如下: 分离轴定理(英文简称SAT)是一项用于检测凸多边形碰撞的技术. 我绝不是这个方面的专家,但当检测碰撞的需求出现在我面前之后,我做了大量

Cocos2d-三维拾取Ray-AABB碰撞检测算法【转】

1.三维拾取技术 在3D游戏中通常会有这样的需求,用户可以选取3D世界中的某些物体进行如拖拽等操作,这时便需要程序通过将二维屏幕上的点坐标转换为三维世界中的坐标,并进行比对,这个过程就需要用到三维拾取. 三维拾取的基本原理并不复杂,我们仍然以Cocos2d-x 3.3beta0版本来分析.拾取思想可以简单的理解为:首先得到在屏幕上的触摸点的坐标,然后根据摄像机投影矩阵与屏幕上的触摸点计算出一条射线ray,注意,正常情况下之后应该去找与射线相交并且交点距离射线起点最近的点所在的包围盒,这个包围盒才

cocos2dx实战篇——Demo《战神传说》学习心得

[唠叨] 源码教程请移步:http://blog.csdn.net/iamlazybone/article/details/19612941 感谢懒骨头提供了这么多的Demo教程,对于初学者的我而言,帮助真的十分大. 注:本节仅仅记录博主自身学习<战神传说>的心得体会. [游戏截图] [学习心得] 1.CCSprite从大图里截取小图 // //CCRectMake构造为UI坐标,原点在左上角. CCSprite* sp = CCSprite::create("menu.png&qu

【鸡年大吉】,不知道写点啥,放个demo(小球碰撞)吧,有兴趣的看看

最初的想法是仿写win7的泡泡屏保效果,但是对于小球的斜碰问题一直没搞明白(如果你会这个,欢迎留言或者做个demo),所以只是简单处理了碰撞后的速度,有时候会看起来很搞笑~~~funny guy 话不多说,先上demo https://win7killer.github.io/can_ps/src/demo/ball.html 效果如下: code: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 4 <head> 5

Unity3d刚体Rigidbody与碰撞检测Collider

做了一个碰撞的小Demo,用一个球去撞击一堵墙,结果在球和墙都设置了刚体和碰撞体的情况下,球穿过了墙.移动球的位置,球有时能穿过墙,有时会被墙阻挡. 对于球穿过了墙,这个问题,在网上找了一下答案,基本可以确定原因是:球的速度过快,碰撞检测设置了离散检测,即相隔一段比较长的时间检测一次碰撞是否发生,而在这个比较长的时间内,球和墙确实发生了碰撞,只是没有检测到:移动球的位置时,球相对墙的距离改变,也就改变了检测的时间点,所以有时候能穿过墙,有时候会被阻挡. 解决方法:1.增大碰撞体积,即修改碰撞体C

unity + win8.1 apps 小游戏demo

unity3d用的人挺多...本来想写个3d游戏试试..额..貌似挺麻烦.. .....先用unity写个简单的2d游戏吧.. (adsw回车  或者  触摸屏虚拟摇杆) 开发环境 unity4.5.1f3      vs2013 express       win8.1 实现方法如下 1.创建自己的坦克Sprite 2.创建敌方坦克Prefab 3.创建子弹Prefab 4.添加虚拟摇杆 5.碰撞检测 具体实现 1.控制自己坦克的代码 if (Input.GetKey (KeyCode.W))