`
NewTamato
  • 浏览: 103148 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

复杂的碰撞检测 工具类

阅读更多

  
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;
              }
         }
 }

分享到:
评论

相关推荐

    flash AS3.0检测碰撞工具类 超好用

    本篇文章将详细介绍AS3.0中的碰撞检测工具类以及如何使用它们。 首先,AS3.0提供了基本的几何形状类,如Rectangle和Circle,这些类可以用来进行简单的碰撞检测。例如,你可以比较两个Rectangle对象的x、y坐标和宽度...

    《实时碰撞检测算法技术》

    基于GPU的碰撞检测利用现代图形处理器强大的并行计算能力,能够显著提高碰撞检测的效率,尤其是在处理复杂场景和大量对象时。 在进行碰撞检测时,数值健壮性和几何健壮性同样重要。数值健壮性关注算法在不同数值...

    实时碰撞检测算法技术

    - 利用C++的面向对象特性设计类来表示不同的几何形状,并封装碰撞检测方法。 - 使用STL库提高代码效率,例如`std::vector`存储物体列表,`std::pair`表示碰撞结果。 - 编写高效的迭代器和搜索算法,减少不必要的...

    ActionScript碰撞检测封装类

    本资源提供的“ActionScript碰撞检测封装类”是一个专门用于处理游戏中的对象碰撞问题的工具。 碰撞检测的基本目标是判断游戏中的两个或多个对象是否发生接触,这对于游戏逻辑的执行至关重要。例如,在一个平台游戏...

    AABB包围盒碰撞检测算法1

    总结来说,AABB包围盒是游戏开发中用于碰撞检测的有效工具,它通过简单的几何形状简化了复杂的碰撞计算。在二维和三维场景中,通过比较物体在各个轴上的投影边界,可以快速判断物体之间是否存在碰撞。在Cocos2d-x等...

    快速多边形碰撞检测

    对于凹多边形或复杂形状的碰撞检测,通常需要更高级的算法,如包围盒(如AABB、OBB)、分而治之(如Octree、kd-tree)和多边形细分等。 总的来说,"快速多边形碰撞检测"是计算机图形学中的一个重要课题,通过优化...

    Ogre碰撞检测

    除了基本的AABB和球查询,Ogre还支持更复杂的碰撞检测,如OBB( Oriented Bounding Box,有向包围盒)和多边形碰撞。OBB能够更好地适应非轴对齐的几何形状,而多边形碰撞则适用于不规则形状的物体。 五、Ogre的碰撞...

    J2me-Layermanager碰撞检测

    在Java 2 Micro Edition (J2ME)平台上开发游戏时,高效的碰撞检测是至关重要的,尤其是在涉及多个游戏对象...无论是简单的平台跳跃游戏还是复杂的策略游戏,`LayerManager`都是实现高效图层管理和碰撞检测的重要工具。

    一些工具类的整合

    再来说说网络辅助工具类,这类工具通常包括处理HTTP请求、响应、网络状态检测等功能。例如,你可以创建一个工具类,提供异步或同步的HTTP请求方法,支持GET、POST等多种请求方式,并能处理返回的JSON或XML数据。此外...

    AS3.0高级碰撞检测

    总的来说,AS3.0的高级碰撞检测提供了一种强大的工具来处理复杂的图形碰撞。通过理解位图数据和透明度的处理,以及有效地利用`BitmapData.hitTest`,开发者可以创建出更为精细和交互丰富的Flash内容,尤其是在游戏...

    osg和qt相结合编程例子(碰撞检测基础)

    4. **碰撞检测**:这是教程的重点,可能包括介绍osg中的碰撞检测机制,如IntersectionVisitor类,它是osg中用于检测几何对象之间是否相交的工具。 5. **IntersectionVisitor使用**:如何创建和使用...

    Unity3d中的碰撞检测教程

    ### Unity3D中的碰撞检测详解 #### 一、引言 ...无论是简单的碰撞检测还是复杂的触发器逻辑,Unity都提供了强大的支持。开发者可以通过灵活运用这些工具和技术,实现出更加真实和有趣的交互效果。

    不规则碰撞检测

    "不规则碰撞检测"就是指处理那些形状不规则的物体之间的碰撞情况,比如带有复杂边缘或者多边形的物体。本知识点主要围绕如何实现这样一个功能进行讲解。 首先,我们要理解碰撞检测的基本原理。碰撞检测通常分为两个...

    XNA物理碰撞检测代码

    总之,XNA提供的物理碰撞检测工具使开发者能够轻松地在C#环境中实现游戏中的碰撞逻辑。通过理解基本原理和适当优化,我们可以创建出更加真实的互动体验。而"TransformedCollision"可能涉及到了更高级的碰撞检测技术...

    基于ThreeJS的横穿马路碰撞检测效果

    本主题将深入探讨如何利用Three.js实现一个横穿马路的碰撞检测效果,这对于虚拟现实、游戏开发或者交通模拟等应用具有重要意义。 首先,我们要理解Three.js的基本概念。Three.js是一个基于WebGL的3D库,它封装了...

    cocos2d-x使用box2d来做碰撞检测

    本文将详细介绍如何在Cocos2d-x框架下利用Box2D进行碰撞检测,帮助开发者构建出更加生动有趣的游戏场景。 Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,支持多种编程语言,如C++、Lua和JS。Box2D则是由 Erin ...

    AS3.0像素级别精确检测碰撞

    通过这样的自定义类,开发者可以实现更复杂的碰撞检测逻辑,提高游戏或其他互动应用的精确性和用户体验。在实际项目中,只需直接调用这个类的静态方法,就可以轻松地实现像素级别的碰撞检测。 总之,AS3.0的像素...

    cocos2d-x游戏开发系列教程-坦克大战游戏之所有坦克之间的碰撞检测

    2. **碰撞检测接口**:在坦克类中,可以定义一个`checkCollision()`方法,接收另一个坦克对象作为参数,通过比较各自的边界矩形来判断碰撞。此方法内部会调用`CGRectIntersectsRect()`。 3. **更新循环**:在游戏主...

    libgdx 碰撞检测

    首先,我们可以使用 `Rectangle` 类进行矩形间的碰撞检测。`Rectangle` 类提供了 `overlaps()` 方法,通过比较两个矩形的边界来判断它们是否相交。这种方法简单且快速,适用于角色、平台或者其他基本形状的碰撞检测...

    Java实现小球碰撞检测

    在计算机图形学中,模拟物体间的碰撞检测是一项基础但至关重要的任务,特别是在游戏开发和物理模拟领域。在Java中实现小球碰撞检测,通常涉及到几何学、物理学以及编程技巧。以下将详细介绍如何利用平面向量和冲量...

Global site tag (gtag.js) - Google Analytics