package com.easyasrpg.implement.algorithm
{
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
{
/**
*复杂的碰撞检测
* @param target1
* @param target2
* @param accurracy
* @return
*
*/
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;
}
}
}
分享到:
相关推荐
本篇文章将详细介绍AS3.0中的碰撞检测工具类以及如何使用它们。 首先,AS3.0提供了基本的几何形状类,如Rectangle和Circle,这些类可以用来进行简单的碰撞检测。例如,你可以比较两个Rectangle对象的x、y坐标和宽度...
基于GPU的碰撞检测利用现代图形处理器强大的并行计算能力,能够显著提高碰撞检测的效率,尤其是在处理复杂场景和大量对象时。 在进行碰撞检测时,数值健壮性和几何健壮性同样重要。数值健壮性关注算法在不同数值...
- 利用C++的面向对象特性设计类来表示不同的几何形状,并封装碰撞检测方法。 - 使用STL库提高代码效率,例如`std::vector`存储物体列表,`std::pair`表示碰撞结果。 - 编写高效的迭代器和搜索算法,减少不必要的...
本资源提供的“ActionScript碰撞检测封装类”是一个专门用于处理游戏中的对象碰撞问题的工具。 碰撞检测的基本目标是判断游戏中的两个或多个对象是否发生接触,这对于游戏逻辑的执行至关重要。例如,在一个平台游戏...
总结来说,AABB包围盒是游戏开发中用于碰撞检测的有效工具,它通过简单的几何形状简化了复杂的碰撞计算。在二维和三维场景中,通过比较物体在各个轴上的投影边界,可以快速判断物体之间是否存在碰撞。在Cocos2d-x等...
对于凹多边形或复杂形状的碰撞检测,通常需要更高级的算法,如包围盒(如AABB、OBB)、分而治之(如Octree、kd-tree)和多边形细分等。 总的来说,"快速多边形碰撞检测"是计算机图形学中的一个重要课题,通过优化...
除了基本的AABB和球查询,Ogre还支持更复杂的碰撞检测,如OBB( Oriented Bounding Box,有向包围盒)和多边形碰撞。OBB能够更好地适应非轴对齐的几何形状,而多边形碰撞则适用于不规则形状的物体。 五、Ogre的碰撞...
在Java 2 Micro Edition (J2ME)平台上开发游戏时,高效的碰撞检测是至关重要的,尤其是在涉及多个游戏对象...无论是简单的平台跳跃游戏还是复杂的策略游戏,`LayerManager`都是实现高效图层管理和碰撞检测的重要工具。
再来说说网络辅助工具类,这类工具通常包括处理HTTP请求、响应、网络状态检测等功能。例如,你可以创建一个工具类,提供异步或同步的HTTP请求方法,支持GET、POST等多种请求方式,并能处理返回的JSON或XML数据。此外...
总的来说,AS3.0的高级碰撞检测提供了一种强大的工具来处理复杂的图形碰撞。通过理解位图数据和透明度的处理,以及有效地利用`BitmapData.hitTest`,开发者可以创建出更为精细和交互丰富的Flash内容,尤其是在游戏...
4. **碰撞检测**:这是教程的重点,可能包括介绍osg中的碰撞检测机制,如IntersectionVisitor类,它是osg中用于检测几何对象之间是否相交的工具。 5. **IntersectionVisitor使用**:如何创建和使用...
### Unity3D中的碰撞检测详解 #### 一、引言 ...无论是简单的碰撞检测还是复杂的触发器逻辑,Unity都提供了强大的支持。开发者可以通过灵活运用这些工具和技术,实现出更加真实和有趣的交互效果。
"不规则碰撞检测"就是指处理那些形状不规则的物体之间的碰撞情况,比如带有复杂边缘或者多边形的物体。本知识点主要围绕如何实现这样一个功能进行讲解。 首先,我们要理解碰撞检测的基本原理。碰撞检测通常分为两个...
总之,XNA提供的物理碰撞检测工具使开发者能够轻松地在C#环境中实现游戏中的碰撞逻辑。通过理解基本原理和适当优化,我们可以创建出更加真实的互动体验。而"TransformedCollision"可能涉及到了更高级的碰撞检测技术...
本主题将深入探讨如何利用Three.js实现一个横穿马路的碰撞检测效果,这对于虚拟现实、游戏开发或者交通模拟等应用具有重要意义。 首先,我们要理解Three.js的基本概念。Three.js是一个基于WebGL的3D库,它封装了...
本文将详细介绍如何在Cocos2d-x框架下利用Box2D进行碰撞检测,帮助开发者构建出更加生动有趣的游戏场景。 Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,支持多种编程语言,如C++、Lua和JS。Box2D则是由 Erin ...
通过这样的自定义类,开发者可以实现更复杂的碰撞检测逻辑,提高游戏或其他互动应用的精确性和用户体验。在实际项目中,只需直接调用这个类的静态方法,就可以轻松地实现像素级别的碰撞检测。 总之,AS3.0的像素...
2. **碰撞检测接口**:在坦克类中,可以定义一个`checkCollision()`方法,接收另一个坦克对象作为参数,通过比较各自的边界矩形来判断碰撞。此方法内部会调用`CGRectIntersectsRect()`。 3. **更新循环**:在游戏主...
首先,我们可以使用 `Rectangle` 类进行矩形间的碰撞检测。`Rectangle` 类提供了 `overlaps()` 方法,通过比较两个矩形的边界来判断它们是否相交。这种方法简单且快速,适用于角色、平台或者其他基本形状的碰撞检测...
在计算机图形学中,模拟物体间的碰撞检测是一项基础但至关重要的任务,特别是在游戏开发和物理模拟领域。在Java中实现小球碰撞检测,通常涉及到几何学、物理学以及编程技巧。以下将详细介绍如何利用平面向量和冲量...