[ActionScript 3.0] 像素级碰撞检测

  1 package
  2 {
  3     import flash.display.BitmapData;
  4     import flash.display.BlendMode;
  5     import flash.display.DisplayObject;
  6     import flash.display.Sprite;
  7     import flash.geom.ColorTransform;
  8     import flash.geom.Matrix;
  9     import flash.geom.Point;
 10     import flash.geom.Rectangle;
 11
 12     public class HitTest
 13     {
 14         /**
 15          * 碰撞检测
 16          * @param    target1
 17          * @param    target2
 18          * @param    accurracy
 19          * @return
 20          */
 21         public static function complexHitTestObject( target1:DisplayObject, target2:DisplayObject,  accurracy:Number = 1 ):Boolean
 22         {
 23             return complexIntersectionRectangle( target1, target2, accurracy ).width != 0;
 24         }
 25         /**
 26          *
 27          * @param    target1
 28          * @param    target2
 29          * @return
 30          */
 31         public static function intersectionRectangle( target1:DisplayObject, target2:DisplayObject ):Rectangle
 32         {
 33             // If either of the items don‘t have a reference to stage, then they are not in a display list
 34             // or if a simple hitTestObject is false, they cannot be intersecting.
 35             if( !target1.root || !target2.root || !target1.hitTestObject( target2 ) ) return new Rectangle();
 36             // Get the bounds of each DisplayObject.
 37             var bounds1:Rectangle = target1.getBounds( target1.root );
 38             var bounds2:Rectangle = target2.getBounds( target2.root );
 39             // Determine test area boundaries.
 40             var intersection:Rectangle = new Rectangle();
 41             intersection.x   = Math.max( bounds1.x, bounds2.x );
 42             intersection.y    = Math.max( bounds1.y, bounds2.y );
 43             intersection.width      = Math.min( ( bounds1.x + bounds1.width ) - intersection.x, ( bounds2.x + bounds2.width ) - intersection.x );
 44             intersection.height = Math.min( ( bounds1.y + bounds1.height ) - intersection.y, ( bounds2.y + bounds2.height ) - intersection.y );
 45             return intersection;
 46         }
 47         /**
 48          *
 49          * @param    target1
 50          * @param    target2
 51          * @param    accurracy
 52          * @return
 53          */
 54         public static function complexIntersectionRectangle( target1:DisplayObject, target2:DisplayObject, accurracy:Number = 1 ):Rectangle
 55         {
 56             if( accurracy <= 0 ) throw new Error( "ArgumentError: Error #5001: Invalid value for accurracy", 5001 );
 57             // If a simple hitTestObject is false, they cannot be intersecting.
 58             if( !target1.hitTestObject( target2 ) ) return new Rectangle();
 59             var hitRectangle:Rectangle = intersectionRectangle( target1, target2 );
 60             // If their boundaries are no interesecting, they cannot be intersecting.
 61             if( hitRectangle.width * accurracy <1 || hitRectangle.height * accurracy <1 ) return new Rectangle();
 62             var bitmapData:BitmapData = new BitmapData( hitRectangle.width * accurracy, hitRectangle.height * accurracy, false, 0x000000 );
 63             // Draw the first target.
 64             bitmapData.draw( target1, HitTest.getDrawMatrix( target1, hitRectangle, accurracy ), new ColorTransform( 1, 1, 1, 1, 255, -255, -255, 255 ) );
 65             // Overlay the second target.
 66             bitmapData.draw( target2, HitTest.getDrawMatrix( target2, hitRectangle, accurracy ), new ColorTransform( 1, 1, 1, 1, 255, 255, 255, 255 ), BlendMode.DIFFERENCE );
 67             // Find the intersection.
 68             var intersection:Rectangle = bitmapData.getColorBoundsRect( 0xFFFFFFFF,0xFF00FFFF );
 69             bitmapData.dispose();
 70             // Alter width and positions to compensate for accurracy
 71             if( accurracy != 1 )
 72             {
 73                 intersection.x /= accurracy;
 74                 intersection.y /= accurracy;
 75                 intersection.width /= accurracy;
 76                 intersection.height /= accurracy;
 77             }
 78             intersection.x += hitRectangle.x;
 79             intersection.y += hitRectangle.y;
 80             return intersection;
 81         }
 82         /**
 83          *
 84          * @param    target
 85          * @param    hitRectangle
 86          * @param    accurracy
 87          * @return
 88          */
 89         protected static function getDrawMatrix( target:DisplayObject, hitRectangle:Rectangle, accurracy:Number ):Matrix
 90         {
 91             var localToGlobal:Point;;
 92             var matrix:Matrix;
 93             var rootConcatenatedMatrix:Matrix = target.root.transform.concatenatedMatrix;
 94             localToGlobal = target.localToGlobal( new Point( ) );
 95             matrix = target.transform.concatenatedMatrix;
 96             matrix.tx = localToGlobal.x - hitRectangle.x;
 97             matrix.ty = localToGlobal.y - hitRectangle.y;
 98             matrix.a = matrix.a / rootConcatenatedMatrix.a;
 99             matrix.d = matrix.d / rootConcatenatedMatrix.d;
100             if( accurracy != 1 ) matrix.scale( accurracy, accurracy );
101             return matrix;
102         }
103     }
104 } 
时间: 2024-10-29 03:30:37

[ActionScript 3.0] 像素级碰撞检测的相关文章

显示对象的像素级碰撞检测

mc2.gotoAndStop(1); var bmd1 = new BitmapData(mc1.width, mc1.height, true, 0); bmd1.draw(mc1); var bmd2 = new BitmapData(mc2.width, mc2.height, true, 0); bmd2.draw(mc2); stage.addEventListener(Event.ENTER_FRAME,frameFunc); function frameFunc(e:Event)

分享一位国外大牛写的不规则物体像素级碰撞检测算法及详解

最近在做一个有关投篮的小游戏,需要用到像素级碰撞检测,as3自带的hitTestObject显然无法满足需要.网上搜寻了一下,在9ria挖坟挖到两篇好文章: 分享一个超高效的不规则物体碰撞检测的类~~ [Lii]超高效的不规则物体碰撞检测<效率优化> 第一篇文章介绍了一位国外大牛写的不规则物体像素级碰撞检测算法,原理是用bitmap绘制两对象不透明区域,利用混合模式计算出两对象的相交区域. 第二篇文章则在该算法的基础上进行了效率的优化,原理是判断出两对象发生hitTestObject碰撞后,将

cocos2d-x像素级触摸处理

最近研究了一下像素级的触摸处理,有时候我们用一个不规则的图形作为一个按钮,这个不规则的图形是一张矩形的png图片,很可能图片的实际有效的显示内容只占整个png图片的很小一部分,剩下的大部分都是png图片的透明区域,我们想把这部分透明区域过滤掉,实现一个触摸到真实的内容才会有按钮响应的效果. 刚开始试图通过CCSprite直接获取到纹理的像素信息,但是cocos2d-x并没有给我们提供直接通过CCSprite获取像素信息的接口,研究了几个网上的Demo,发现通过使用RenderTexture重绘可

OpenCV中feature2D学习——亚像素级角点检测(cornerSubPix)

概述 除了利用Harris进行角点检测和利用Shi-Tomasi方法进行角点检测外,还可以使用cornerEigenValsAndVecs()函数和cornerMinEigenVal()函数自定义角点检测函数.如果对角点的精度有更高的要求,可以用cornerSubPix()函数将角点定位到子像素,从而取得亚像素级别的角点检测效果. cornerSubPix()函数 (1)函数原型 cornerSubPix()函数在角点检测中精确化角点位置,其函数原型如下: C++: void cornerSub

亚像素级角点定位

代码示例: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace cv; using namespace std; #define WINDOW_NAME "Shi-Tom

OpenCv_cvFindCornerSubPix()查找亚像素级角点

如果我们进行图像处理的目的不是用于识别特征点而是进行稽核测量,则通常需要更高的精度,而cvGoodFeatureToTrack()只能提供简单的像素坐标值,但有时候我们会需要实际坐标值而不是证书坐标值,例如,我们想要确定图形中一个尖锐的峰值点的位置,但是峰值点的位置一般都不会位于一个像素点的正中心,,这时候就可以使用亚像素检测方法. 亚像素级角点的位置在社星际标定.跟踪并重建蛇形阿基的轨迹或者重建被跟踪目标的三维结构时就是一个基本的测量值.通过cvGoodFeaturesToTrack()函数可

OpenCV亚像素级的角点检测

亚像素级的角点检测 目标 在本教程中我们将涉及以下内容: 使用OpenCV函数 cornerSubPix 寻找更精确的角点位置 (不是整数类型的位置,而是更精确的浮点类型位置). 理论 代码 这个教程的代码如下所示.源代码还可以从 这个链接下载得到 #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #inclu

[ActionScript 3.0] as3处理xml的功能和遍历节点

as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式. XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据.将数据加载到 XML 对象时,ActionScript 会分析数据并将其分层结构加载到内存(如果 XML 数据格式有误,它会发送运行时错误). 利用 XML 和 XMLList 对象的运算符和方法可以轻松遍历 XML 数据的结构. 1.读取外部 XML 文档 可以使用 URLLoader 类从 URL 加载 XML 数据.若

ActionScript 3.0 for the Lunder Algorithm

package com.feiruo.Calendar.LunderCalendar { /* *@ClassName: package:com.feiruo.Calendar.LunderCalendar::LunarDate *@INTRO: Calculating lunar and solar terms and other settings. *@Author: feiruo *@Language: ActionScript 3.0 *@SDKVersion: Flash Player