home *** CD-ROM | disk | FTP | other *** search
- package com.lofiminds.gm
- {
- import flash.utils.Dictionary;
-
- public final class Collisions
- {
-
- private static var cdLine:CollisionData = new CollisionData();
-
- private static var classes:Array = new Array();
-
- private static var gCollisionContext:CollisionContext = new CollisionContext();
-
- private static var groupDuplicateMap:Dictionary = new Dictionary();
-
- private static var groups:Array = new Array();
-
- private static var obbCenterDiff:Vector = new Vector();
-
- private static var debugCd:CollisionData;
-
-
- public function Collisions()
- {
- super();
- }
-
- private static function SeparatedOnAxis(param1:CollisionData, param2:CollisionData, param3:Vector) : Boolean
- {
- var _loc4_:Number = Math.abs(param3.dot(obbCenterDiff));
- return GetProjectedRadius(param1,param3) + GetProjectedRadius(param2,param3) < _loc4_;
- }
-
- internal static function drawCollisionBounds(param1:GameGraphics) : void
- {
- var _loc3_:Array = null;
- var _loc4_:int = 0;
- var _loc5_:GameObject = null;
- var _loc6_:CollisionData = null;
- var _loc7_:Number = NaN;
- var _loc8_:Number = NaN;
- var _loc9_:Number = NaN;
- var _loc10_:Number = NaN;
- var _loc11_:Number = NaN;
- var _loc12_:Number = NaN;
- param1.lineStyle(2,16711680);
- var _loc2_:int = 0;
- while(_loc2_ < classes.length)
- {
- _loc3_ = Instances.getAllOfClass(classes[_loc2_]);
- if(_loc3_ != null)
- {
- _loc4_ = 0;
- while(_loc4_ < _loc3_.length)
- {
- if((_loc5_ = GameObject(_loc3_[_loc4_])).image != null)
- {
- if((_loc6_ = _loc5_.collisionData).isAABB)
- {
- param1.drawRect(_loc6_.aabbRect);
- }
- else
- {
- _loc7_ = _loc6_.obbAxisX.x * _loc6_.obbExtentX;
- _loc8_ = _loc6_.obbAxisX.y * _loc6_.obbExtentX;
- _loc9_ = _loc6_.obbAxisY.x * _loc6_.obbExtentY;
- _loc10_ = _loc6_.obbAxisY.y * _loc6_.obbExtentY;
- _loc11_ = _loc6_.obbCenterX - _loc7_ - _loc9_;
- _loc12_ = _loc6_.obbCenterY - _loc8_ - _loc10_;
- param1.moveTo(_loc11_,_loc12_);
- _loc11_ = _loc6_.obbCenterX + _loc7_ - _loc9_;
- _loc12_ = _loc6_.obbCenterY + _loc8_ - _loc10_;
- param1.lineTo(_loc11_,_loc12_);
- _loc11_ = _loc6_.obbCenterX + _loc7_ + _loc9_;
- _loc12_ = _loc6_.obbCenterY + _loc8_ + _loc10_;
- param1.lineTo(_loc11_,_loc12_);
- _loc11_ = _loc6_.obbCenterX - _loc7_ + _loc9_;
- _loc12_ = _loc6_.obbCenterY - _loc8_ + _loc10_;
- param1.lineTo(_loc11_,_loc12_);
- _loc11_ = _loc6_.obbCenterX - _loc7_ - _loc9_;
- _loc12_ = _loc6_.obbCenterY - _loc8_ - _loc10_;
- param1.lineTo(_loc11_,_loc12_);
- }
- }
- _loc4_++;
- }
- }
- _loc2_++;
- }
- }
-
- public static function line_collision(param1:Number, param2:Number, param3:Number, param4:Number, param5:Class) : GameObject
- {
- var _loc12_:GameObject = null;
- if(classes.indexOf(param5) == -1)
- {
- throw new Error("must call register on class");
- }
- var _loc6_:Array;
- if((_loc6_ = Instances.getAllOfClass(param5)) == null)
- {
- return null;
- }
- var _loc7_:Number = GameUtil.point_distance(param1,param2,param3,param4);
- var _loc8_:Number = GameUtil.point_direction(param1,param2,param3,param4);
- _loc7_ *= 0.5;
- cdLine.obbCenterX = param1 + GameUtil.lengthdir_x(_loc7_,_loc8_);
- cdLine.obbCenterY = param2 + GameUtil.lengthdir_y(_loc7_,_loc8_);
- cdLine.obbExtentX = _loc7_;
- cdLine.obbExtentY = 2;
- var _loc9_:Number = Math.sin(0 - _loc8_);
- var _loc10_:Number = Math.cos(_loc8_);
- cdLine.obbAxisX.x = _loc10_;
- cdLine.obbAxisX.y = _loc9_;
- cdLine.obbAxisY.x = -_loc9_;
- cdLine.obbAxisY.y = _loc10_;
- var _loc11_:int = 0;
- while(_loc11_ < _loc6_.length)
- {
- if((_loc12_ = _loc6_[_loc11_] as GameObject).image != null)
- {
- if(testOBB_vs_OBB(cdLine,_loc12_.collisionData))
- {
- return _loc12_;
- }
- }
- _loc11_++;
- }
- return null;
- }
-
- internal static function update() : void
- {
- var _loc3_:CollisionData = null;
- var _loc4_:CollisionData = null;
- var _loc5_:Array = null;
- var _loc6_:int = 0;
- var _loc7_:GameObject = null;
- var _loc8_:CollisionGroup = null;
- var _loc9_:Array = null;
- var _loc10_:int = 0;
- var _loc11_:int = 0;
- var _loc12_:GameObject = null;
- var _loc13_:Boolean = false;
- var _loc1_:int = 0;
- while(_loc1_ < classes.length)
- {
- if((_loc5_ = Instances.getAllOfClass(classes[_loc1_])) != null)
- {
- _loc6_ = 0;
- while(_loc6_ < _loc5_.length)
- {
- if((_loc7_ = GameObject(_loc5_[_loc6_])).image != null)
- {
- _loc7_.prepareCollisionData();
- }
- _loc6_++;
- }
- }
- _loc1_++;
- }
- var _loc2_:CollisionContext = gCollisionContext;
- _loc1_ = 0;
- while(_loc1_ < groups.length)
- {
- _loc8_ = groups[_loc1_] as CollisionGroup;
- _loc5_ = Instances.getAllOfClass(_loc8_.class1);
- _loc9_ = Instances.getAllOfClass(_loc8_.class2);
- if(!(_loc5_ == null || _loc9_ == null))
- {
- _loc6_ = 0;
- while(_loc6_ < _loc5_.length)
- {
- if((_loc7_ = GameObject(_loc5_[_loc6_])).image != null)
- {
- _loc3_ = _loc7_.collisionData;
- _loc11_ = _loc10_ = _loc5_ == _loc9_ ? _loc6_ + 1 : 0;
- while(_loc11_ < _loc9_.length)
- {
- if((_loc12_ = GameObject(_loc9_[_loc11_])).image != null)
- {
- _loc4_ = _loc12_.collisionData;
- if(_loc3_.isAABB && _loc4_.isAABB)
- {
- _loc13_ = _loc3_.aabbRect.intersects(_loc4_.aabbRect);
- }
- else
- {
- _loc13_ = testOBB_vs_OBB(_loc3_,_loc4_);
- }
- if(_loc13_)
- {
- _loc2_.other = _loc12_;
- _loc7_.onCollision(_loc2_);
- _loc2_.other = _loc7_;
- _loc12_.onCollision(_loc2_);
- break;
- }
- }
- _loc11_++;
- }
- }
- _loc6_++;
- }
- }
- _loc1_++;
- }
- }
-
- private static function GetProjectedRadius(param1:CollisionData, param2:Vector) : Number
- {
- return param1.obbExtentX * Math.abs(param2.dot(param1.obbAxisX)) + param1.obbExtentY * Math.abs(param2.dot(param1.obbAxisY));
- }
-
- public static function registerClass(param1:Class) : void
- {
- if(classes.indexOf(param1) == -1)
- {
- classes.push(param1);
- }
- }
-
- private static function testOBB_vs_OBB(param1:CollisionData, param2:CollisionData) : Boolean
- {
- obbCenterDiff.x = param1.obbCenterX - param2.obbCenterX;
- obbCenterDiff.y = param1.obbCenterY - param2.obbCenterY;
- if(SeparatedOnAxis(param1,param2,param1.obbAxisX))
- {
- return false;
- }
- if(SeparatedOnAxis(param1,param2,param1.obbAxisY))
- {
- return false;
- }
- if(SeparatedOnAxis(param1,param2,param2.obbAxisX))
- {
- return false;
- }
- if(SeparatedOnAxis(param1,param2,param2.obbAxisY))
- {
- return false;
- }
- return true;
- }
-
- public static function registerGroup(param1:Class, param2:Class) : void
- {
- var _loc3_:String = String(param1) + String(param2);
- if(groupDuplicateMap[_loc3_] != null)
- {
- throw new Error("duplicate collisiongroups: " + _loc3_);
- }
- trace("dupkey:" + _loc3_);
- groupDuplicateMap[_loc3_] = 1;
- registerClass(param1);
- registerClass(param2);
- var _loc4_:CollisionGroup;
- (_loc4_ = new CollisionGroup()).class1 = param1;
- _loc4_.class2 = param2;
- groups.push(_loc4_);
- }
- }
- }
-
- final class CollisionGroup
- {
-
-
- internal var class1:Class;
-
- internal var class2:Class;
-
- public function CollisionGroup()
- {
- super();
- }
- }
-