zoukankan      html  css  js  c++  java
  • ActionScript学习笔记(八)——碰撞检测

    碰撞检测的种类很多,2D而言有:点碰撞,矩形碰撞,球形碰撞以及像素碰撞。不同的游戏引擎也会有其他检测碰撞的不同方式。AS原生的库已经封装了一套碰撞检测方法,我们可以很简单的实现碰撞检测。当然还不能忽略注册点对于碰撞的影响

    1、距离碰撞检测(球形碰撞检测)

    最简单的也就是距离碰撞检测了,球形碰撞检测也是基于距离碰撞检测而来的,因此不需要过多的说明了,直接上公式。

    var dx:Number = ball2.x - ball1.x;
    var dy:Number = ball2.y - ball1.y;
    
    var dis:Number = Math.sqrt(dx*dx,dy*dy);
    
    if(dis < ball2.r + ball1.r){
          //do somethint when collision
    }

    2、点碰撞

    点碰撞我们也可以用距离碰撞来处理,但是有时候难免我们要把子弹这个大目标当成一个点,用距离检测就显得很不恰当了,但是As封装了一个点碰撞的方法,使用非常的渐变。

    if(sprite_1.hitTestPoint(sprite_2)){
        //do something when collision
    }

    3、矩形碰撞

    我们可以自己实现矩形碰撞,当然也可以用AS原生的

    原生AS判断方法:

    if(sprite_1.hitTestObject(sprite_2)){
       //do something when collision
    }

    自己实现碰撞算法:

    方法1:根据点相互之间的情况判定两个矩形之间的碰撞检测条件

    经典算法如下:引用地址:http://hi.baidu.com/lwgea/item/10e66b8ecaf65557e63d19b7

    ccd0c13f2dd4a5877d1e71b9

    return  x1 + w1 > x2 && x1 < x2 + w2 && y1 + h1 > y2 && y1 < y2 + h2;
    如下解释:
    x1 + w1 > x2 限定 第一个矩形的右边线在第二个矩形的左边线右边
    x1 < x2 + w2 限定 第一个矩形的左边线在第二个矩形的右边线左边
    这样下来,就限定了两个矩形在X方向上投影必然相交。
    同理,
    y1 + h1 > y2 限定 第一个矩形的下边线在第二个矩形的上边线下面
    y1 < y2 + h2 限定 第一个矩形的上边线在第二个矩形的下边线上边
    这样下来,就限定了两个矩形在Y方向上投影必然相交。

    方法二:根据有相向量来判断四个点是否在图形内部。由于并不常用,所以大家自行百度吧,资料很容易搜索到,并且也稍微有点高中数学基础就很好理解。

     

    4、像素碰撞

    像素碰撞的效率并不高,因此应当尽量避免使用像素碰撞来处理。As当中为了解决不规则图形之间的碰撞,主要是使用bitmapData类里的,hitTest()方法。当然注册点的考虑也会使得像素碰撞的处理稍显复杂。因为游戏当中我们使用的大都是非位图图片,在此只是总结一下非位图的碰撞方法。

    var bmd1 = new BitmapData(stage.stageWidth,stage.stageHeight,true,0);
    var bmd2 = bmd1.clone();
    
    bmd1.draw(sprite1,new Matrix(1,0,0,1,sprite1.x,sprite2.y));
    bmd2.draw(sprite2,new Matrix(1,0,0,1,sprite2.x,sprite2.y));
    
    if(bmd1.hitTest(new Point(),255,bmpd2,new Point(),255)){ //Point应当是添加到舞台上面的实际位置
        //do something when collision
    }

    当然bitmapData是不具备添加到显示列表上的,所以记得将sprite1,sprite2,添加到显示列表当中去。

    碰撞说白了,就这么多了,但是在3D里面还有很多碰撞检测方法,虽然有了游戏引擎大部分碰撞算法并不用我们实现,但是这些基本的实现方法还是得理解的,因为如果以服务器为判定的话,加入用Java来做服务器,那么就真得自己实现了说

  • 相关阅读:
    excel数据导入mySql数据库
    springboot-devtools实现项目的自动重启
    Java中List, Integer[], int[]的相互转换
    Postman代码测试工具如何用?
    git提交代码时,Unstaged changes如何过滤.class .log等文件
    Json字符串转map集合
    实现hibernate 的validator校验
    [转载]OpenSSL中文手册之命令行详解(未完待续)
    Openssl ASN.1 说明一 分享
    [转载]Parsing X.509 Certificates with OpenSSL and C
  • 原文地址:https://www.cnblogs.com/flashbird/p/3350523.html
Copyright © 2011-2022 走看看