`

[转]一个Collision类,其中的block方法可以实现两个物体之间的碰撞检测。

 
阅读更多

第二个是书中的源代码给出了一个Collision类,其中的block方法可以实现两个物体之间的碰撞检测。

有趣的是,Collsion.block方法有两个参数,第一个是被阻碍物,第二个是障碍物,在这个演示中,山上有两块石板。

对于左边的石板,石板是被阻碍物,小猪是障碍物,产生的效果就是小猪可以推着石板走。

对于右边的石板,小猪是被阻碍物,石板是障碍物,产生的效果就是小猪撞到墙上就不能动了,很有意思。

http://bbs.9ria.com/viewthread.php?tid=88769&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000

 

package
{
        import flash.display.MovieClip;
        import flash.geom.Point;
       
        public class Collision
        //0.2 (March 20, 2009)
        {
                public function Collision()
                {
                }
               
                //Block objects
                static public function block(objectA:MovieClip, objectB:MovieClip):void
                {
                        var objectA_Halfwidth:Number = objectA.width / 2;
                        var objectA_Halfheight:Number = objectA.height / 2;
                        var objectB_Halfwidth:Number = objectB.width / 2;
                        var objectB_Halfheight:Number = objectB.height / 2;
                        var dx:Number = objectB.x - objectA.x;
                        var ox:Number = objectB_Halfwidth + objectA_Halfwidth - Math.abs(dx);
                        if (ox > 0)
                        {
                                var dy:Number = objectA.y - objectB.y;
                                var oy:Number = objectB_Halfheight + objectA_Halfheight - Math.abs(dy);
                                if (oy > 0)
                                {
                                        if (ox < oy)
                                        {
                                                if (dx < 0)
                                                {
                                                        //Collision on right
                                                        oy = 0;
                                                }
                                                else
                                                {
                                                        //Collision on left
                                                        oy = 0;
                                                        ox *= -1;
                                                }
                                        }
                                        else
                                        {
                                                if (dy < 0)
                                                {
                                                        //Collision on Top
                                                        ox = 0;
                                                        oy *= -1;
                                                }
                                                else
                                                {
                                                        //Collision on Bottom
                                                        ox = 0;
                                                }
                                        }
                                       
                                        //Use the calculated x and y overlaps to
                                        //Move objectA out of the collision
                                       
                                        objectA.x += ox;
                                        objectA.y += oy;
                                }
                        }
                }
               
                //General purpose method for testing Axis-based collisions. Returns true or False
                static public function test(objectA:Object,objectB:Object):Boolean
                {
                        var objectA_Halfwidth=objectA.width/2;
                        var objectA_Halfheight=objectA.height/2;
                        var objectB_Halfwidth=objectB.width/2;
                        var objectB_Halfheight=objectB.height/2;
                        var dx=objectB.x-objectA.x;
                        var ox=objectB_Halfwidth+objectA_Halfwidth-Math.abs(dx);
                        if (0<ox)
                        {
                                var dy=objectA.y-objectB.y;
                                var oy=objectB_Halfheight+objectA_Halfheight-Math.abs(dy);
                                if (0<oy)
                                {

                                        return true;
                                }
                        }
                        else
                        {

                                return false;
                        }
                        return false;
                }
               
                //Collisions between the player and platform
                static public function playerAndPlatform(player:MovieClip, platform:MovieClip, bounce:Number, friction:Number):void
                {
                        //This method requires the following getter and
                        //setter properties in the player object:
                        //objectIsOnGround:Boolean, vx:Number, vy:Number,
                        //bounceX:Number, bounceY:Number
                       
                        //Decalre variables needed for the player's
                        //position and dimensions
                        var player_Halfwidth:Number;
                        var player_Halfheight:Number;
                        var player_X:Number;
                        var player_Y:Number
                       
                        //Decalre variables needed for the physics calculations
                        var bounceX:Number;
                        var bounceY:Number;
                        var frictionX:Number;
                        var frictionY:Number;
                       
                        //Find out whether the player object has a collisionArea
                        //subobject defined
                        if(player.collisionArea != null)
                        {
                                //If it does, find out its width and height
                                player_Halfwidth = player.collisionArea.width / 2;
                            player_Halfheight = player.collisionArea.height / 2;
                               
                                //Convert the collisionArea's local x,y coordinates to global coordinates
                                var player_Position:Point = new Point(player.collisionArea.x, player.collisionArea.y);
                player_X = player.localToGlobal(player_Position).x;
                                player_Y = player.localToGlobal(player_Position).y;
                        }
                        else
                        {
                                //If there's no collisionArea subobject
                                //Use the player's main height, width, x and y
                                player_Halfwidth = player.width / 2;
                            player_Halfheight = player.height / 2;
                                player_X = player.x;
                                player_Y = player.y;
                        }
                        //Find the platform's dimensions
                        var platform_Halfwidth:Number = platform.width / 2;
                        var platform_Halfheight:Number = platform.height / 2;
                       
                        //Find the distance between the player and platfrom on the x axis
                        var dx:Number = platform.x - player_X;
                       
                        //Find the amount of overlap on the x axis
                        var ox:Number = platform_Halfwidth + player_Halfwidth - Math.abs(dx);
                       
                        //Check for a collision on the x axis
                        if (ox > 0)
                        {
                                //If the objects overlap on the x axis, a collision might be occuring
                                //Define the variables you need to check for a collision on the y axis
                                var dy:Number = player.y - platform.y;
                                var oy:Number = platform_Halfheight + player_Halfheight - Math.abs(dy);
                               
                                //Check for a y axis collision. We know a collision must be
                                //occuring if there's a collision on both the x and y axis
                                if (oy > 0)
                                {
                                        //Yes, a collision is occuring!
                                        //Now you need to find out on which side
                                        //of the platform it's occuring on.
                                        if (ox < oy)
                                        {
                                                if (dx < 0)
                                                {
                                                        //Collision on right
                                                        oy = 0;
                                                        dx = 1;
                                                        dy = 0
                                                }
                                                else
                                                {
                                                        //Collision on left
                                                        oy = 0;
                                                        ox *= -1;
                                                        dx = -1;
                                                        dy = 0
                                                }
                                        }
                                        else
                                        {
                                                if (dy < 0)
                                                {
                                                        //Collision on Top
                                                        ox = 0;
                                                        oy *= -1;
                                                        dx = 0;
                                                        dy = -1;
                                                        //set the player's isOnGround property to
                                                        //true to enable jumping
                                                        player.isOnGround = true;
                                                }
                                                else
                                                {
                                                        //Collision on Bottom
                                                        ox = 0;
                                                        dx = 0;
                                                        dy = 1;
                                                }
                                        }
                                       
                                        //Find the direction of the collision ("dot product")
                                        var directionOfCollision:Number = player.vx * dx + player.vy * dy;
                                       
                                        //Calculate the new direction for the bounce ("projection")
                                        var newDirection_X:Number = directionOfCollision * dx;
                                        var newDirection_Y:Number = directionOfCollision * dy;
                                       
                                        //Find the "tangent velocity":
                                        //the speed in the direction that the object is moving.
                                        //It's used for calculating additional platform friction.
                                        var tangent_Vx:Number = player.vx - newDirection_X;
                                        var tangent_Vy:Number = player.vy - newDirection_Y;
                                       
                                        //Apply collision forces if the object is moving into a collision
                                        if (directionOfCollision < 0)
                                        {
                                                //Calculate the friction
                                                frictionX = tangent_Vx * friction;
                                                frictionY = tangent_Vy * friction;
                                               
                                                //Calculate the amount of bounce
                                                bounceX = newDirection_X * bounce;
                                                bounceY = newDirection_Y * bounce;
                                        }
                                        else
                                        {
                                                //Prevent forces from being applied if the object is
                                                //moving out of a collision
                                                bounceX = 0;
                                                bounceY = 0;
                                                frictionX = 0;
                                                frictionY = 0;
                                        }
                                        //Apply platform friction
                                        player.vx += ox - frictionX;
                                        player.vy += oy - frictionY;
                                       
                                        //Move the player out of the collision
                                        player.x += ox;
                                        player.y += oy;
                                       
                                        //Bounce the player off the platform
                                        player.bounceX = bounceX;
                                        player.bounceY = bounceY;
                                }
                        }
                }
        }
}
分享到:
评论

相关推荐

    fcl flexible collision library 碰撞检测库源码

    fcl flexible collision library 碰撞检测库源码

    Unity3D判断两个物体相交脚本2

    总之,Unity3D提供了多种方式来判断两个物体是否相交,开发者可以根据具体需求选择最适合的方法,以确保游戏性能的同时实现预期的交互效果。理解并熟练运用这些技巧,能够帮助开发者创建出更加流畅且响应迅速的游戏...

    利用Unity实现的碰撞检测 利用Unity实现的碰撞检测 利用Unity实现的碰撞检测

    在Unity引擎中,碰撞检测是游戏开发中的一个关键部分,它允许我们识别并响应游戏对象之间的交互。Unity提供了强大的碰撞检测系统,可以帮助开发者创建出丰富多样的交互式体验。以下是对这一主题的详细阐述。 首先,...

    MyCollision2.rar_collision_碰撞_碰撞检测_碰撞检测距离

    碰撞检测的基本思想是判断两个或多个对象在三维空间中的位置关系,以确定它们是否发生接触。对于点和平面的碰撞检测,我们需要明确以下几个关键概念: 1. **点和平面的表示**:在计算机中,点通常用三维坐标(x, y, ...

    MyCollision2.rar_collision_collision detection_碰撞检测

    碰撞检测的主要目标是判断游戏中的两个或多个物体是否发生接触,从而触发相应的事件,如角色受到伤害、物体间的相互作用等。这个过程通常分为两个阶段:粗略检测和精确检测。 1. **粗略检测**:在大规模场景中,...

    椭球碰撞检测 智能检测

    这个技术主要用于确定两个或多个椭球是否在空间中相互接触或者交叉,这对于实现复杂物体间的交互至关重要。椭球碰撞检测相比球体碰撞检测更具有普适性,因为它可以近似地表示各种形状不规则的物体。 在实现椭球碰撞...

    碰撞检测开源工具箱

    除了基本的碰撞检测,FCL还提供了距离计算功能,可以计算两个几何体之间的最近点距离,这对于计算力反馈或者求解约束问题非常有用。同时,FCL还能生成接触点信息,这在物理模拟和机器人控制中是必不可少的。 在实际...

    collision detection.pdf 碰撞检测

    通过比较两个物体的k-DOPs是否有重叠,可以快速排除大部分无碰撞的情况,显著减少了全面细致的几何碰撞检查次数。 然后,文档会讲解如何利用k-DOPs构建包围体积层次结构(Bounding Volume Hierarchy,简称BVH)。...

    关于d3d碰撞检测的文档

    6. **GJK(Gillies' Algorithm for Collision Detection Between Convex Objects)** 和 **Minkowski 差**:这些方法适用于处理复杂的凸形物体碰撞,计算出精确的接触点,但计算量较大。 7. **SAT(Separating Axis...

    matlab开发-fast3碰撞检测gjkalgorithm

    这个过程可以被看作是在两个凸集之间构建一个支撑超平面序列。首先,选择一个起点向量,然后反复迭代,直到找到最近点或者判断出无交集。MATLAB中,我们可以利用向量运算和线性代数库来高效实现这些步骤。 1. **...

    Unity3d中的碰撞检测教程

    假设我们有两个立方体(Cube1 和 Cube2),并且希望通过脚本来检测这两个立方体之间的碰撞。 ```csharp using UnityEngine; using System.Collections; public class TestCollider : MonoBehaviour { public ...

    两个实体之间的碰撞

    在标题"两个实体之间的碰撞"中,我们讨论的是如何在C++编程环境下,使用Visual Studio 2008进行碰撞检测的实现。 首先,我们需要理解“实体”(Entity)的概念。在编程和游戏开发中,实体通常是指具有特定属性和...

    小球的碰撞检测(c++)

    在计算机图形学中,碰撞检测是一项基础且重要的技术,它被广泛应用于游戏开发、物理模拟、虚拟...通过对这些知识点的理解和应用,我们可以实现高效且准确的碰撞检测系统,从而在各种应用场景中实现物体间的真实交互。

    Collision.Detection.-.Algorithms.and.Applications碰撞检测

    它涉及到如何准确且高效地判断两个或多个物体是否在空间上发生了接触或碰撞,这对于实现动态环境中的真实感模拟至关重要。 ### 核心概念 **碰撞检测算法**:旨在检测两个或多个几何模型之间是否存在重叠或接触,...

    Android 检测游戏碰撞的原理实现

    本文将深入探讨Android平台下游戏碰撞检测的原理与实现方法。 一、基本概念 碰撞检测是游戏编程中的核心部分,其目的是判断游戏中的两个或多个物体(如角色、障碍物等)是否发生接触。根据复杂程度,碰撞检测可以...

    碰撞检测教程 OpenGL版

    OpenGL碰撞检测教程主要关注在2D空间中如何实现物体之间的碰撞检测。这是一项重要的技能,尤其在游戏开发、物理模拟和可视化应用中。本教程由Olivier Renault编写,通过图解和源代码的方式深入浅出地讲解了相关概念...

    实时碰撞检测算法技术

    3. **连续碰撞检测(Continuous Collision Detection, CCD)**:与广义离散碰撞检测不同,CCD考虑了物体在两个时间点之间的运动轨迹,能够在物体间发生碰撞之前预测碰撞点,从而避免了“穿透”问题的发生。...

    Unity3D入门 :简单的碰撞检测

    通过实践这个"Unity3D入门:简单的碰撞检测"的DEMO,你可以亲手创建两个带有Collider的游戏对象,设置碰撞事件,观察并理解这些事件如何工作。不断尝试不同的碰撞器类型和刚体组合,以加深对碰撞检测的理解。记住,...

    APE 示例 ape_example_e4-collision_detection.zip

    例如,我们可以在文档中找到关于`Body`类的方法`collidesWith()`,它是用于检测两个物理体之间是否发生碰撞的关键函数。 最后,“lib”目录下的文件是APE库的AS3源代码。开发者可以直接查看这些源码,深入理解其...

    一种快速精确的连续碰撞检测算法.pdf

    本文提出了一种新型的连续碰撞检测算法,该算法充分利用了图形硬件的计算能力,实现在多个时间区间的实时处理,并通过一系列优化方法,显著提升了碰撞检测的速度与精确度。 算法的核心思想是在每个时间区间上进行...

Global site tag (gtag.js) - Google Analytics