zoukankan      html  css  js  c++  java
  • 帧同步 检测碰撞

    由于 不同安卓 不同苹果系统,他们的浮点数 不一样,所以,如果用 unity自带的 Physics2D,来检测碰撞,肯定是有问题的。

    我看了下网上,碰撞检测 有 分离轴检测 和 四叉树检测。

    我觉得 有点小题大做了!!

    游戏人物  我都定义是  圆形,不需要多边形。建筑都是 矩形。

    那么,所得的算法无非就是以下几种。

    点和矩形碰撞

    复制代码
    /** 
         *  
         * @param x1 点 
         * @param y1 点 
         * @param x2 矩形view x 
         * @param y2 矩形view y 
         * @param w  矩形view 宽 
         * @param h  矩形view 高 
         * @return 
         */  
        public static boolean isCollision(int x1, int y1, int x2, int y2, int w, int h) {  
            if (x1 >= x2 && x1 <= x2 + w && y1 >= y2 && y1 <= y2 + h) {  
                return true;  
            }   
            return false;  
        }  
    复制代码

    矩形碰撞

    复制代码
    /** 
         * 检测两个矩形是否碰撞 
         * @return 
         */  
        public boolean isCollisionWithRect(int x1, int y1, int w1, int h1,   
                int x2,int y2, int w2, int h2) {  
            if (x1 >= x2 && x1 >= x2 + w2) {  
                return false;  
            } else if (x1 <= x2 && x1 + w1 <= x2) {  
                return false;  
            } else if (y1 >= y2 && y1 >= y2 + h2) {  
                return false;  
            } else if (y1 <= y2 && y1 + h1 <= y2) {  
                return false;  
            }  
            return true;  
        }  
    复制代码

    点(x1,x2) , 圆心(x2,y2) ,半径r

    if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r) {  
                // 如果点和圆心距离小于或等于半径则认为发生碰撞  
                return true;  
            }  

    圆和圆

    复制代码
    /** 
         * 圆形碰撞 
         *  
         * @param x1 
         *            圆形1的圆心X坐标 
         * @param y1 
         *            圆形2的圆心X坐标 
         * @param x2 
         *            圆形1的圆心Y坐标 
         * @param y2 
         *            圆形2的圆心Y坐标 
         * @param r1 
         *            圆形1的半径 
         * @param r2 
         *            圆形2的半径 
         * @return 
         */  
        private boolean isCollisionWithCircle(int x1, int y1, int x2, int y2,  
                int r1, int r2) {  
            // Math.sqrt:开平方  
            // Math.pow(double x, double y): X的Y次方  
            //直角坐标系,依点1和点2做平行线,|x1-x2|为横向直角边,|y1-y2|为纵向直角边 依勾股定理 c^2=a^2+b^2  
            if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r1 + r2) {  
                // 如果两圆的圆心距小于或等于两圆半径和则认为发生碰撞  
                return true;  
            }  
            return false;  
        }  

    但是,有人要提出,浮点运算 不同的问题,那我推荐 大家用 定点数 Fix64。

     具体哪里,自己百度找吧。他还自带了一个随机定点数,随机的结果是 固定的,这样就不需要 自己写n多数据来 做假 随机数了。

    用法也简单。

    比如 上面 人物检测 碰撞,就是 点 到 圆心,看看是否 超过 你要的 半径。

           // x1-x2   y1-y2
                print(Fix64.Sqrt(Fix64.Pow(((Fix64)2.2f - (Fix64)1.4f), 2) + Fix64.Pow(((Fix64)3.3f - (Fix64)4.2f),2)));
                print(Math.Sqrt(Math.Pow(2.2f - 1.4f,2) + Math.Pow(3.3f - 4.2f, 2)));

    使用定点数后,不同的安卓手机,输出的结果是一样的。

    坐标定义也简单 :FixVector2 FixVector3 替代过去的Vector2 Vector3

    输出就是 vec.ToVector2()

    随机数:

     SRandom room = new SRandom(20000);
      for (int i = 0; i < 432;i++ )
      print(vec.ToVector2() + "  " + room.Range(0, 999));

    就先写到这里吧

  • 相关阅读:
    转 W P 代码淆混
    Flash网页游戏辅助工具制作简析
    Flash Player安全沙漏规则
    用loader.loadbytes直接load bitmapdata.getpixels产生的bytearray
    游戏及开发人员的认识
    一犯人在执行死刑前三天供出祖传治癌奇方(转)
    AIR教程列表
    养生名言 (春、夏、秋、冬。)
    十天学会单片机和C语言编程
    UI设计规范收藏
  • 原文地址:https://www.cnblogs.com/big-zhou/p/11461824.html
Copyright © 2011-2022 走看看