![游戏开发实战宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/212/44175212/b_44175212.jpg)
2.6 碰撞检测
碰撞检测分为两种,一种是边框级别的碰撞检测,另一种是像素级别的碰撞检测。
2.6.1 边框级别的碰撞检测
边框级别的检测会检查显示对象的矩形边框是否与检测点发生重叠。
首先创建一个称为“Collision”的项目,删除src文件夹内的所有文件,然后在src文件夹内创建一个称为Main.ts的类文件,并对其做出如下修改,参见二维码2-15:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/45_01.jpg?sign=1738905032-PqF7vofhb5icfTI6BNmimmXAY9wJnVf0-0-66a4b8716e4ddebbec524741221ac69f)
二维码2-15
运行调试播放器观看效果,如图2-35所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/45_02.jpg?sign=1738905032-ApqpMOxqp5vy08a6jE47k0rqraKstoz0-0-90df91a983daf7dc3a307289f683a8ae)
图2-35 程序运行结果(边框级碰撞检测)
结果表示监测点和红色圆形的边框发生了碰撞。
在上一个代码清单中,第8行代码声明了一个TextField对象,这个类将在下一节进行介绍。在代码的第14行,绘制了一个圆形,该圆形的圆心在(0, 0),半径是25,那么它的边框的边长就是50,左上角在(-25,-25),中心在(0, 0)。第19行代码用点(25, 25)对该圆形进行碰撞检测,并将结果保存在isHit布尔变量里,其中的hitTestPoint方法的原型如下:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/45_03.jpg?sign=1738905032-FxSdN1o773ttJ2C4jR2cQhg34LYY6WTz-0-8885f95e11d41b171df3c71081ae7f11)
以下是对各个参数的解释:
● x:要测试的此对象的 x 坐标。
● y:要测试的此对象的 y 坐标。
● shapeFlag:如果是 true,表明要执行像素级别的检测,否则就是边框级别的检测。这个参数是可选的,如果开发者没有指定这个参数,则进行边框级别的检测。
对于返回结果,如果显示对象与指定的点重叠或相交,则为 true;否则为 false。
检测点(25, 25)正好在圆形边框的左下角,所以结果就返回了true,并将结果显示了出来。
2.6.2 像素级别的碰撞检测
像素级别的检测就是检查显示对象的每一个像素是否与检测点发生重叠。对上面代码清单里的onAddToStage方法做出如下修改,参见二维码2-16:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/45_04.jpg?sign=1738905032-llIWqBhOPTh8EYvjTsy0nWoVt6LLJhas-0-2e585f82468ff8fe96f909f1e51044c8)
二维码2-16
运行调试播放器观看结果,如图2-36:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/45_05.jpg?sign=1738905032-sKpbnywrv378C9gVUMqtwKmGhmCfStX5-0-53695b8423140308eb764e4c5de56bf2)
图2-36 程序运行结果(像素级碰撞检测)
通过运行结果可以看出来,碰撞检测的结果是没有发生碰撞。
在上面代码清单的第10行,给碰撞检测方法hitTestPoint的第三个参数指定为true,这表示将采用像素级别的检测。因为点(25, 25)没有跟圆形内部的任何像素重叠,所以该方法会返回false。