Flash基础理论课 第九章 碰撞检测Ⅱ

返回“Flash基础理论课 - 目录”

距离碰撞检测

本节开始,我们就摆脱了内置hitTest方法,而是将碰撞检测掌握在自己手里。这就要用两个物体间的距离来判断碰撞的发生。

举个现实中的例子,如果你那辆车与我这辆车有100米的距离,我们就知道这两辆车离得足够远,不可能发生碰撞。然而,如果我们的车都有6米宽和12米长,而我这辆车的中心点与你那辆车的中心点只有5米,那么肯定会有些金属被撞弯,保险单会变长。换句话讲,除非车子的某些部分被撞掉以外,两辆车不可能并到一起。这就是整个距离碰撞检测的思想。我们要确认使两个物体分开的最小距离,再看看当前距离,比较两者的大小。如果当前距离小于最小距离,就知道物体间发生了碰撞。

hitTestObject方法在矩形上使用效果最好,但在处理其它图形时就退化了,而我们这种方法则在处理圆形时效果最好。要是处理的图形与圆形有偏差,则精确度就会有所降低。但是这里会遇到与 hitTest 中矩形边界相反的问题:明明发生了碰撞,确没有响应,这是因为它们的中心点还不够近。

简单的距离碰撞检测

让我们从最理想的状态开始:两个圆形。依然可以使用Ball类。(大家现在也许明白了为什么“重用”一词通常与面向对象编程联系在一起了吧。)

在应用距离碰撞检测时,圆的注册点应该在中心点上,Ball类正好符合要求。先要创建两个小球,并设置其中一个为可拖拽的。然后在 enterFrame函数中进行碰撞检测。到这儿为止,程序与本章的第一个例子相同。只是在判断碰撞时,不是使用if(ball1.hitTestObject(ball2)),而是在 if 语句中判断距离。我们已经学习了计算两个物体间距离的方法,回忆一下第三章的勾股定理。所以,程序开始应该是这样的:

var dx:Number = sprite2.x - sprite1.x;
var dy:Number = sprite2.y - sprite1.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);

OK,现在距离已经有了,如何进行判断呢?请看图 9-4。


图9-4 碰撞的距离

图中我们看到两个影片发生了碰撞,每个影片都占 60 像素宽,那么每个半径就是30。因此,在它们相互碰撞时,实际相差 60 个像素。啊哈!这就是答案。对于两个大小相同的圆来说,如果距离小于直径,就会产生碰撞。本例代码(Distance.as)与 ObjectHisTest.as 非常相似,设置onEnterFrame方法为:

private function onEnterFrame(event:Event):void {
 var dx:Number = ball2.x - ball1.x;
 var dy:Number = ball2.y - ball1.y;
 var dist:Number = Math.sqrt(dx * dx + dy * dy);
 // 默认 ball 的直径为 80 (半径为 40)
 if (dist < 80) {
  trace("hit");
 }
}

测试后,我们发现这回碰撞的结果与接近小球的角度无关。在没有接触到目标球时不会产生碰撞。但是在代码中使用数值表示距离显然不太合适,因为这样的话每次改变 ball 的大小都要重新修改代码。况且,如果两个小球的大小不同怎么办?我们需要将这个方法抽象成可以适应任何情况的公式。

如图 9-5 所示。两个大小不同的ball,相互碰撞。左边的小球 60 像素,右边的40 像素。我们可以用程序检察它们的width 属性。第一个ball 的半径为 30,另一个半径为 20。所以,它们碰撞时的距离实际应为 50。在 Ball类里面,已经设置了半径(radius)属性,可以直接拿来判断。


图9-5 两个不同体积物体的碰撞距离

时间: 2024-08-01 14:06:40

Flash基础理论课 第九章 碰撞检测Ⅱ的相关文章

Flash基础理论课 第九章 碰撞检测Ⅰ

返回"Flash基础理论课 - 目录" 到目前为止,我们已经学习了物体在其空间的内交互运动.接下来研究一下物体之间的交互运动.这就需要确定物体间何时发生了碰撞,这就是我们所讲的碰撞检测(Collision detection或Hit testing). 本章我会尽量将所有需要掌握的相关知识告诉大家.其中包括两个影片的碰撞,影片与点之间的碰撞,用距离检测碰撞以及多物体碰撞检测方法.首先,来看一下有什么现成的碰撞检测方法. 碰撞检测方法 碰撞检测的思想非常非常简单.我们只要知道两个物体是否

Flash基础理论课 第一章 基础动画概念

返回"Flash基础理论课 - 目录" 第一章 基础动画概念 Flash就是一台动画机器.从Flash 最早的版本开始,就支持补间动画--只需要创建两个不同的关键帧,然后让Flash 自动创建补间动画即可.本书将介绍 Flash 中的一种强大的语言-ActionScript.该书包括了编程,数学,物理等技术,并结合 ActionScript 让物体动起来,这些都是补间动画无法比拟的. 什么是动画? "动画"一词,引用美国传统词典中的解释 1.使有生命:充满生命力 2

Flash基础理论课 第二章 ActionScript 3.0 动画基础Ⅰ

返回"Flash基础理论课 - 目录" 类和面向对象编程 类(Class)和面向对象(Object Oriented),对于有些读者来说可能还没接触过而有些读者可能已经在AS (或其它语言)中使用过很多年了,为了让大家都能学会,我会扼要的介绍一下这些基础知识.就算是 AS 2 的OOP 专家也希望能略读下这一段,因为 AS 3.0 的工作原理确实发生了很大的变化.如果你说你从没用过类,那你就错了,只要你在Flash中写过代码,那么实际上就已经使用了类.类可以简单理解为一种对象, Mov

Flash基础理论课 第二章 ActionScript 3.0 动画基础Ⅱ

返回"Flash基础理论课 - 目录" 动画事件 我们希望能够使用代码让物体动起来,并允许屏幕反复地刷新.前面看过一个使用enterFrame影片事件的示例.现在把这种方法运用到 AS 3 中,只需要增加一个enterFrame 事件的侦听器即可: addEventListener(Event.ENTER_FRAME, onEnterFrame); 别忘了导入 Event 类,并创建一个名为 onEnterFrame 的方法.人们常常迷惑,只有一帧怎么能执行 enterFrame(进入

Flash基础理论课

Flash基础理论课 第一章 基础动画概念 Flash基础理论课 第二章 ActionScript 3.0 动画基础Ⅰ Flash基础理论课 第二章 ActionScript 3.0 动画基础Ⅱ Flash基础理论课 第三章 三角学应用Ⅰ Flash基础理论课 第三章 三角学应用Ⅱ Flash基础理论课 第四章 渲染技术Ⅰ Flash基础理论课 第四章 渲染技术Ⅱ Flash基础理论课 第四章 渲染技术Ⅲ Flash基础理论课 第五章 速度与加速度Ⅰ Flash基础理论课 第五章 速度与加速度Ⅱ

Flash基础理论课 第十五章 3D基础Ⅰ

返回"Flash基础理论课 - 目录" 前面我们做的一切都是二维的(有时只有一维),但是已经可以做出非常酷的东东了.现在,将它们带入到下一个等级. 创建 3D 图形总是那么另人兴奋.新加入的这个维度似乎将物体真正地带入到了生活中.如何在Flash 中实现 3D 在无数的书籍和教学软件中都有介绍.但是我不打算跳过这些内容,我们会很快地将所有基础的知识讲完.随后,将前面章节中讨论的运动效果放到三维空间中.说得详细些,将给大家介绍速度,加速度,摩擦力,反弹,屏幕环绕,缓动,弹性运动,坐标旋转

Flash基础理论课 第十九章 实用技巧 Ⅲ

返回"Flash基础理论课 - 目录" 实用公式 统领全书,我们已经有了各种运动和效果的公式.我已经提取出了最实用和最常用的公式.方程.以及代码的摘录,并将它们列在本章的最后.我认为将它们放到同一个地方应该对大家非常有帮助,因此我将这些我认为最需要的内容放到一起作为整体的一个参考资料.我将会在这一页夹上书签. 第三章 基础三角函数的计算: 角的正弦值 = 对边 / 斜边 角的余弦值 = 邻边 / 斜边 角的正切值 = 对边 / 邻边 弧度转换为角度以及角度转换为弧度: 弧度 = 角度

Flash基础理论课 第十九章 实用技巧 Ⅰ

返回"Flash基础理论课 - 目录" 现在您已经来到了最后一章.我将所有想要介绍的一些小东西都放在了这一章,它们不太合适放在其它地方,或者说与前面章节的主线有些脱离. 本章,我还重组了前面每章课后列出的公式,因此可以当作这些公式的一个参考点. 由于这些课题都是比较零碎的概念,所以我没有办法将这些许许多多的内容组织起来.因此每一节都是一个独立的单元.好了,不多说了,让我们开始吧. 布朗(随机)运动 先讲讲历史.一天,一个名叫罗伯特-布朗(Robert Brown)的植物学家正在观察一滴

Flash基础理论课 第十七章 背面剔除与3D灯光Ⅰ

返回"Flash基础理论课 - 目录" 第十六章介绍了所有建立 3D 立体模型的基础包括:如何创建点,线,用多边形组成各种形状,以及如何为每个多边形设置颜色.但是,我们只能让颜色的透明度为50%,才能看到正确的效果.虽然制作出的 3D 立体模型也不差,但是这样做在真实度上还是有所欠缺. 本章,通过介绍背面剔除(不绘制背面的多边形),深度排序(第十五章作了一点介绍,但这次要从多边形的角度重新审视它),以及 3D 灯光,来修正这个问题. 我想应用了这三种技术所得到的 3D 模型一定会让大家