`

不规则图片或对象的碰撞检测

阅读更多
下面这个类封装了3个公共的静态方法,简单的碰撞检测可以直接使用complexHitTestObject,需要更加复杂的,那就需要看明白下面的代码,并使用3个公共的静态方法

这个类是一个外国人写的,原文地址如下:
http://www.tink.ws/blog/as-30-hittest

package ws.tink.display
{
        
        import flash.display.BitmapData;
        import flash.display.BlendMode;
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        
        import flash.geom.ColorTransform;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.geom.Rectangle;
        
        public class HitTest
        {

                public static function complexHitTestObject( target1:DisplayObject, target2:DisplayObject,  accurracy:Number = 1 ):Boolean
                {
                        return complexIntersectionRectangle( target1, target2, accurracy ).width != 0;
                }
                
                public static function intersectionRectangle( target1:DisplayObject, target2:DisplayObject ):Rectangle
                {
                        // If either of the items don't have a reference to stage, then they are not in a display list
                        // or if a simple hitTestObject is false, they cannot be intersecting.
                        if( !target1.root || !target2.root || !target1.hitTestObject( target2 ) ) return new Rectangle();
                        
                        // Get the bounds of each DisplayObject.
                        var bounds1:Rectangle = target1.getBounds( target1.root );
                        var bounds2:Rectangle = target2.getBounds( target2.root );
                        
                        // Determine test area boundaries.
                        var intersection:Rectangle = new Rectangle();
                        intersection.x   = Math.max( bounds1.x, bounds2.x );
                        intersection.y    = Math.max( bounds1.y, bounds2.y );
                        intersection.width      = Math.min( ( bounds1.x + bounds1.width ) - intersection.x, ( bounds2.x + bounds2.width ) - intersection.x );
                        intersection.height = Math.min( ( bounds1.y + bounds1.height ) - intersection.y, ( bounds2.y + bounds2.height ) - intersection.y );
                
                        return intersection;
                }
                
                public static function complexIntersectionRectangle( target1:DisplayObject, target2:DisplayObject, accurracy:Number = 1 ):Rectangle
                {                     
                        if( accurracy <= 0 ) throw new Error( "ArgumentError: Error #5001: Invalid value for accurracy", 5001 );
                        
                        // If a simple hitTestObject is false, they cannot be intersecting.
                        if( !target1.hitTestObject( target2 ) ) return new Rectangle();
                        
                        var hitRectangle:Rectangle = intersectionRectangle( target1, target2 );
                        // If their boundaries are no interesecting, they cannot be intersecting.
                        if( hitRectangle.width * accurracy <1 || hitRectangle.height * accurracy <1 ) return new Rectangle();
                        
                        var bitmapData:BitmapData = new BitmapData( hitRectangle.width * accurracy, hitRectangle.height * accurracy, false, 0x000000 ); 

                        // Draw the first target.
                        bitmapData.draw( target1, HitTest.getDrawMatrix( target1, hitRectangle, accurracy ), new ColorTransform( 1, 1, 1, 1, 255, -255, -255, 255 ) );
                        // Overlay the second target.
                        bitmapData.draw( target2, HitTest.getDrawMatrix( target2, hitRectangle, accurracy ), new ColorTransform( 1, 1, 1, 1, 255, 255, 255, 255 ), BlendMode.DIFFERENCE );
                        
                        // Find the intersection.
                        var intersection:Rectangle = bitmapData.getColorBoundsRect( 0xFFFFFFFF,0xFF00FFFF );
                        
                        bitmapData.dispose();
                        
                        // Alter width and positions to compensate for accurracy
                        if( accurracy != 1 )
                        {
                                intersection.x /= accurracy;
                                intersection.y /= accurracy;
                                intersection.width /= accurracy;
                                intersection.height /= accurracy;
                        }
                        
                        intersection.x += hitRectangle.x;
                        intersection.y += hitRectangle.y;
                        
                        return intersection;
                }
                
                
                protected static function getDrawMatrix( target:DisplayObject, hitRectangle:Rectangle, accurracy:Number ):Matrix
                {
                        var localToGlobal:Point;
                        var matrix:Matrix;
                        
                        var rootConcatenatedMatrix:Matrix = target.root.transform.concatenatedMatrix;
                        
                        localToGlobal = target.localToGlobal( new Point( ) );
                        matrix = target.transform.concatenatedMatrix;
                        matrix.tx = localToGlobal.x - hitRectangle.x;
                        matrix.ty = localToGlobal.y - hitRectangle.y;
                        
                        matrix.a = matrix.a / rootConcatenatedMatrix.a;
                        matrix.d = matrix.d / rootConcatenatedMatrix.d;
                        if( accurracy != 1 ) matrix.scale( accurracy, accurracy );

                        return matrix;
                }

        }

} 
分享到:
评论

相关推荐

    易语言不规则图片的选择与拾取

    在不规则图片的选择与拾取中,碰撞检测可以帮助我们判断用户点击的区域是否属于图片的一部分,实现选中功能。 3. 非矩形选择:在常规的图像选择中,我们可以直接使用矩形框来选择图片区域。但在处理不规则图片时,...

    带碰撞检测的二维人物运动

    在二维空间中,人物运动通常由坐标(x, y)表示,碰撞检测则是判断两个或多个对象(如人物和其他物体)在某一时刻是否重叠。基本的检测方法包括矩形碰撞、圆形碰撞和多边形碰撞。矩形碰撞是最简单的方法,通过比较两个...

    cocos creator 不规则形状按钮

    5. **设置碰撞检测**:为了使按钮具有交互性,我们需要设置碰撞器(Collider)。在精灵节点上添加一个新的Box Collider或Polygon Collider,然后调整它的形状以匹配你刚刚绘制的边界。对于非矩形形状,Polygon ...

    Android不规则图形点击提示选中不同区域的源码

    总之,"Android不规则图形点击提示选中不同区域的源码"是一个涉及自定义视图绘制、碰撞检测、事件处理和视觉反馈的综合案例,对于深入理解Android图形系统和交互设计具有很高的参考价值。通过学习和实践,开发者可以...

    iOS 绘制不规则图形,并且添加点击事件 的两种方法

    总结,通过`BezierPath`我们可以灵活地绘制不规则图形,结合`hitTest(_:with:)`或`UIView`子类化,我们可以为这些图形添加点击事件。这种方式使得开发者能够创建具有交互性的自定义UI元素,提升用户体验。在实际项目...

    【cocos creator】TS监听不规则按钮点击事件,判断点在不规则区域内

    9. **资源管理**:压缩包中的`touchCheck`可能是用于演示或测试的资源,可能包含了一个不规则形状的按钮图片或预设,以及相关的ts脚本文件。解压后放入工程的`assets`目录,可以在Cocos Creator的资源管理器中查看和...

    JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解

    对于大多数游戏场景来说,可能更加适合使用基于矩形包围盒的检测算法,而对于需要精确碰撞的游戏元素(如复杂多边形或不规则形状),像素检测算法则成为了必要的选择。 总结来说,像素检测算法以其精确性在某些特定...

    多个物体碰撞运动演示游戏java语言

    在这个游戏中,Java的类库和面向对象特性被用来构建游戏的核心逻辑,包括小球的创建、运动状态的管理以及碰撞检测。 其次,游戏中的"碰撞"是核心功能之一。在物理世界中,物体碰撞遵循一定的力学规则,如动量守恒和...

    Unity拼图游戏,实现拼图碎片的无缝移动和动画效果(列表->面板),相邻碎片编组

    7. **碰撞检测和事件触发**:Unity的碰撞检测系统(Collider和Physics)可以帮助识别碎片之间的接触。当碎片之间发生碰撞时,可以触发相应的事件,如碎片的无缝移动或动画播放。 8. **优化与性能**:为了保证游戏在...

    坦克大战图片+音效版

    7. **游戏逻辑**:坦克大战的核心算法包括坦克的移动规则、碰撞检测、得分计算等。这些都需要开发者编写精确的逻辑代码来实现,例如,使用二维数组表示地图,通过坐标比较进行碰撞检测。 8. **文件I/O操作**:在...

    图片随意拖动

    这可能涉及复杂的碰撞检测和排序算法。 7. 响应式设计:在不同尺寸的设备上,图片拖动的效果需要保持一致。因此,开发者需要考虑响应式设计,确保图片大小和位置在不同分辨率和屏幕方向下都能正确显示。 8. 性能...

    c#基于form实现多球连续动态碰撞

    综上所述,实现"C#基于Form实现多球连续动态碰撞"项目需要对Windows Forms、图形绘制、碰撞检测以及物理原理有深入了解。通过这个项目,不仅可以提升C#编程技能,还能增强对实时系统和物理模拟的理解。

    Java实现潜艇大战游戏源码

    这通常涉及到几何形状的比较,如矩形碰撞检测或更复杂的算法,如旋转包容边界盒(AABB)或分离轴定理(SAT)。 7. **游戏逻辑**:潜艇的移动规则、炮弹轨迹、命中判定、得分系统等都属于游戏逻辑。这部分代码需要...

    1991版坦克大战图片资源

    这通常涉及到几何形状的比较,例如矩形或圆形的碰撞检测算法。 5. **性能优化**:大量图像可能导致内存占用过高,可以考虑使用纹理 atlases(将多个小图打包成一张大图)和精灵表来减少绘制调用次数,提高渲染效率...

    坦克大战开发图片

    开发者需要编写代码来加载图片、绘制精灵、处理碰撞检测以及实现坦克的动画效果。 总的来说,"坦克大战开发图片"是一个包含坦克游戏核心元素的资源集合,它为开发者提供了构建游戏世界的视觉基础,通过结合编程和...

    java开发的坦克大战图片版游戏

    这些都需要用到数据结构(如数组或链表)来存储游戏状态,以及算法(如碰撞检测算法)来处理游戏规则。例如,开发者可能使用二维数组来表示游戏地图,每个元素代表地图上的一个单位,通过遍历这个数组,可以实现坦克...

    坦克大战C语言(easyx图形插件)源代码

    4. **对象模型**:坦克、子弹等游戏对象的定义和操作,包括属性(位置、方向等)和行为(移动、碰撞检测)。 5. **文件操作**:如何读取和显示图像资源,理解二进制文件和图像文件的处理。 6. **碰撞检测**:实现...

    javascript图片特效

    - 游戏开发:JavaScript也可用于构建简单的网页游戏,涉及到图片的移动、碰撞检测等特效。 综上所述,JavaScript图片特效是网页设计中的重要组成部分,通过熟练掌握这些知识点,开发者能够创造出丰富多样的动态...

    坦克大战(单机版和图片版)源代码

    开发者可能使用了矩形碰撞检测或者更精确的像素级碰撞检测算法。同时,游戏规则的实现,如坦克生命值、得分系统、胜利条件等,也需要严谨的逻辑来实现。 最后,测试和调试也是必不可少的部分。开发者需要确保游戏在...

Global site tag (gtag.js) - Google Analytics