STORY   LOOP   FURRY   PORN   GAMES
• C •   SERVICES [?] [R] RND   POPULAR
Archived flashes:
228054
/disc/ · /res/     /show/ · /fap/ · /gg/ · /swf/P0001 · P2560 · P5120

<div style="position:absolute;top:-99px;left:-99px;"><img src="http://swfchan.com:57475/53094494?noj=FRM53094494-25DC" width="1" height="1"></div>

Air Battle.swf

This is the info page for
Flash #48516

(Click the ID number above for more basic data on this flash file.)


Text
loading...

ActionScript [AS3]

Section 1
//b2CircleDef (Box2D.Collision.Shapes.b2CircleDef) package Box2D.Collision.Shapes { import Box2D.Common.Math.*; public class b2CircleDef extends b2ShapeDef { public var radius:Number; public var localPosition:b2Vec2; public function b2CircleDef(){ localPosition = new b2Vec2(0, 0); super(); type = b2Shape.e_circleShape; radius = 1; } } }//package Box2D.Collision.Shapes
Section 2
//b2CircleShape (Box2D.Collision.Shapes.b2CircleShape) package Box2D.Collision.Shapes { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Common.*; public class b2CircleShape extends b2Shape { public var m_localPosition:b2Vec2; public var m_radius:Number; public function b2CircleShape(def:b2ShapeDef){ m_localPosition = new b2Vec2(); super(def); var circleDef:b2CircleDef = (def as b2CircleDef); m_type = e_circleShape; m_localPosition.SetV(circleDef.localPosition); m_radius = circleDef.radius; } override public function TestSegment(transform:b2XForm, lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):int{ var sY:Number; var tMat:b2Mat22 = transform.R; var positionX:Number = (transform.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y))); var positionY:Number = (transform.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y))); var sX:Number = (segment.p1.x - positionX); sY = (segment.p1.y - positionY); var b:Number = (((sX * sX) + (sY * sY)) - (m_radius * m_radius)); if (b < 0){ lambda[0] = 0; return (e_startsInsideCollide); }; var rX:Number = (segment.p2.x - segment.p1.x); var rY:Number = (segment.p2.y - segment.p1.y); var c:Number = ((sX * rX) + (sY * rY)); var rr:Number = ((rX * rX) + (rY * rY)); var sigma:Number = ((c * c) - (rr * b)); if ((((sigma < 0)) || ((rr < Number.MIN_VALUE)))){ return (e_missCollide); }; var a:Number = -((c + Math.sqrt(sigma))); if ((((0 <= a)) && ((a <= (maxLambda * rr))))){ a = (a / rr); lambda[0] = a; normal.x = (sX + (a * rX)); normal.y = (sY + (a * rY)); normal.Normalize(); return (e_hitCollide); }; return (e_missCollide); } public function GetLocalPosition():b2Vec2{ return (m_localPosition); } public function GetRadius():Number{ return (m_radius); } override public function ComputeSweptAABB(aabb:b2AABB, transform1:b2XForm, transform2:b2XForm):void{ var tMat:b2Mat22; tMat = transform1.R; var p1X:Number = (transform1.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y))); var p1Y:Number = (transform1.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y))); tMat = transform2.R; var p2X:Number = (transform2.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y))); var p2Y:Number = (transform2.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y))); aabb.lowerBound.Set((((p1X < p2X)) ? p1X : p2X - m_radius), (((p1Y < p2Y)) ? p1Y : p2Y - m_radius)); aabb.upperBound.Set((((p1X > p2X)) ? p1X : p2X + m_radius), (((p1Y > p2Y)) ? p1Y : p2Y + m_radius)); } override public function ComputeMass(massData:b2MassData):void{ massData.mass = (((m_density * b2Settings.b2_pi) * m_radius) * m_radius); massData.center.SetV(m_localPosition); massData.I = (massData.mass * (((0.5 * m_radius) * m_radius) + ((m_localPosition.x * m_localPosition.x) + (m_localPosition.y * m_localPosition.y)))); } override public function UpdateSweepRadius(center:b2Vec2):void{ var dX:Number = (m_localPosition.x - center.x); var dY:Number = (m_localPosition.y - center.y); dX = Math.sqrt(((dX * dX) + (dY * dY))); m_sweepRadius = ((dX + m_radius) - b2Settings.b2_toiSlop); } override public function ComputeAABB(aabb:b2AABB, transform:b2XForm):void{ var tMat:b2Mat22 = transform.R; var pX:Number = (transform.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y))); var pY:Number = (transform.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y))); aabb.lowerBound.Set((pX - m_radius), (pY - m_radius)); aabb.upperBound.Set((pX + m_radius), (pY + m_radius)); } override public function TestPoint(transform:b2XForm, p:b2Vec2):Boolean{ var tMat:b2Mat22 = transform.R; var dX:Number = (transform.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y))); var dY:Number = (transform.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y))); dX = (p.x - dX); dY = (p.y - dY); return ((((dX * dX) + (dY * dY)) <= (m_radius * m_radius))); } } }//package Box2D.Collision.Shapes
Section 3
//b2FilterData (Box2D.Collision.Shapes.b2FilterData) package Box2D.Collision.Shapes { public class b2FilterData { public var maskBits:uint;// = 0xFFFF public var groupIndex:int;// = 0 public var categoryBits:uint;// = 1 public function b2FilterData(){ super(); } public function Copy():b2FilterData{ var copy:b2FilterData = new b2FilterData(); copy.categoryBits = categoryBits; copy.maskBits = maskBits; copy.groupIndex = groupIndex; return (copy); } } }//package Box2D.Collision.Shapes
Section 4
//b2MassData (Box2D.Collision.Shapes.b2MassData) package Box2D.Collision.Shapes { import Box2D.Common.Math.*; public class b2MassData { public var mass:Number;// = 0 public var center:b2Vec2; public var I:Number;// = 0 public function b2MassData(){ center = new b2Vec2(0, 0); super(); } } }//package Box2D.Collision.Shapes
Section 5
//b2PolygonDef (Box2D.Collision.Shapes.b2PolygonDef) package Box2D.Collision.Shapes { import Box2D.Common.Math.*; import Box2D.Common.*; public class b2PolygonDef extends b2ShapeDef { public var vertices:Array; public var vertexCount:int; private static var s_mat:b2Mat22 = new b2Mat22(); public function b2PolygonDef(){ vertices = new Array(b2Settings.b2_maxPolygonVertices); super(); type = b2Shape.e_polygonShape; vertexCount = 0; var i:int; while (i < b2Settings.b2_maxPolygonVertices) { vertices[i] = new b2Vec2(); i++; }; } public function SetAsOrientedBox(hx:Number, hy:Number, center:b2Vec2=null, angle:Number=0):void{ var xfPosition:b2Vec2; var xfR:b2Mat22; var i:int; vertexCount = 4; vertices[0].Set(-(hx), -(hy)); vertices[1].Set(hx, -(hy)); vertices[2].Set(hx, hy); vertices[3].Set(-(hx), hy); if (center){ xfPosition = center; xfR = s_mat; xfR.Set(angle); i = 0; while (i < vertexCount) { center = vertices[i]; hx = (xfPosition.x + ((xfR.col1.x * center.x) + (xfR.col2.x * center.y))); center.y = (xfPosition.y + ((xfR.col1.y * center.x) + (xfR.col2.y * center.y))); center.x = hx; i++; }; }; } public function SetAsBox(hx:Number, hy:Number):void{ vertexCount = 4; vertices[0].Set(-(hx), -(hy)); vertices[1].Set(hx, -(hy)); vertices[2].Set(hx, hy); vertices[3].Set(-(hx), hy); } } }//package Box2D.Collision.Shapes
Section 6
//b2PolygonShape (Box2D.Collision.Shapes.b2PolygonShape) package Box2D.Collision.Shapes { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Common.*; public class b2PolygonShape extends b2Shape { public var m_coreVertices:Array; public var m_vertices:Array; private var s_supportVec:b2Vec2; public var m_centroid:b2Vec2; public var m_normals:Array; public var m_obb:b2OBB; public var m_vertexCount:int; private static var s_computeMat:b2Mat22 = new b2Mat22(); private static var s_sweptAABB1:b2AABB = new b2AABB(); private static var s_sweptAABB2:b2AABB = new b2AABB(); public function b2PolygonShape(def:b2ShapeDef){ var i:int; var edgeX:Number; var edgeY:Number; var len:Number; var n1X:Number; var n1Y:Number; var n2X:Number; var n2Y:Number; var vX:Number; var vY:Number; var dX:Number; var dY:Number; var det:Number; s_supportVec = new b2Vec2(); m_obb = new b2OBB(); m_vertices = new Array(b2Settings.b2_maxPolygonVertices); m_normals = new Array(b2Settings.b2_maxPolygonVertices); m_coreVertices = new Array(b2Settings.b2_maxPolygonVertices); super(def); m_type = e_polygonShape; var poly:b2PolygonDef = (def as b2PolygonDef); m_vertexCount = poly.vertexCount; var i1:int = i; var i2:int = i; i = 0; while (i < m_vertexCount) { m_vertices[i] = poly.vertices[i].Copy(); i++; }; i = 0; while (i < m_vertexCount) { i1 = i; i2 = (((i + 1) < m_vertexCount)) ? (i + 1) : 0; edgeX = (m_vertices[i2].x - m_vertices[i1].x); edgeY = (m_vertices[i2].y - m_vertices[i1].y); len = Math.sqrt(((edgeX * edgeX) + (edgeY * edgeY))); m_normals[i] = new b2Vec2((edgeY / len), (-(edgeX) / len)); i++; }; m_centroid = ComputeCentroid(poly.vertices, poly.vertexCount); ComputeOBB(m_obb, m_vertices, m_vertexCount); i = 0; while (i < m_vertexCount) { i1 = (((i - 1) >= 0)) ? (i - 1) : (m_vertexCount - 1); i2 = i; n1X = m_normals[i1].x; n1Y = m_normals[i1].y; n2X = m_normals[i2].x; n2Y = m_normals[i2].y; vX = (m_vertices[i].x - m_centroid.x); vY = (m_vertices[i].y - m_centroid.y); dX = (((n1X * vX) + (n1Y * vY)) - b2Settings.b2_toiSlop); dY = (((n2X * vX) + (n2Y * vY)) - b2Settings.b2_toiSlop); det = (1 / ((n1X * n2Y) - (n1Y * n2X))); m_coreVertices[i] = new b2Vec2(((det * ((n2Y * dX) - (n1Y * dY))) + m_centroid.x), ((det * ((n1X * dY) - (n2X * dX))) + m_centroid.y)); i++; }; } override public function ComputeSweptAABB(aabb:b2AABB, transform1:b2XForm, transform2:b2XForm):void{ var aabb1:b2AABB = s_sweptAABB1; var aabb2:b2AABB = s_sweptAABB2; ComputeAABB(aabb1, transform1); ComputeAABB(aabb2, transform2); aabb.lowerBound.Set(((aabb1.lowerBound.x < aabb2.lowerBound.x)) ? aabb1.lowerBound.x : aabb2.lowerBound.x, ((aabb1.lowerBound.y < aabb2.lowerBound.y)) ? aabb1.lowerBound.y : aabb2.lowerBound.y); aabb.upperBound.Set(((aabb1.upperBound.x > aabb2.upperBound.x)) ? aabb1.upperBound.x : aabb2.upperBound.x, ((aabb1.upperBound.y > aabb2.upperBound.y)) ? aabb1.upperBound.y : aabb2.upperBound.y); } public function GetVertices():Array{ return (m_vertices); } public function GetCoreVertices():Array{ return (m_coreVertices); } public function GetCentroid():b2Vec2{ return (m_centroid); } public function GetOBB():b2OBB{ return (m_obb); } public function GetFirstVertex(xf:b2XForm):b2Vec2{ return (b2Math.b2MulX(xf, m_coreVertices[0])); } public function Centroid(xf:b2XForm):b2Vec2{ return (b2Math.b2MulX(xf, m_centroid)); } override public function TestSegment(xf:b2XForm, lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):int{ var tX:Number; var tY:Number; var tMat:b2Mat22; var tVec:b2Vec2; var numerator:Number; var denominator:Number; var lower:Number = 0; var upper:Number = maxLambda; tX = (segment.p1.x - xf.position.x); tY = (segment.p1.y - xf.position.y); tMat = xf.R; var p1X:Number = ((tX * tMat.col1.x) + (tY * tMat.col1.y)); var p1Y:Number = ((tX * tMat.col2.x) + (tY * tMat.col2.y)); tX = (segment.p2.x - xf.position.x); tY = (segment.p2.y - xf.position.y); tMat = xf.R; var p2X:Number = ((tX * tMat.col1.x) + (tY * tMat.col1.y)); var p2Y:Number = ((tX * tMat.col2.x) + (tY * tMat.col2.y)); var dX:Number = (p2X - p1X); var dY:Number = (p2Y - p1Y); var index = -1; var i:int; while (i < m_vertexCount) { tVec = m_vertices[i]; tX = (tVec.x - p1X); tY = (tVec.y - p1Y); tVec = m_normals[i]; numerator = ((tVec.x * tX) + (tVec.y * tY)); denominator = ((tVec.x * dX) + (tVec.y * dY)); if ((((denominator < 0)) && ((numerator < (lower * denominator))))){ lower = (numerator / denominator); index = i; } else { if ((((denominator > 0)) && ((numerator < (upper * denominator))))){ upper = (numerator / denominator); }; }; if (upper < lower){ return (e_missCollide); }; i++; }; if (index >= 0){ lambda[0] = lower; tMat = xf.R; tVec = m_normals[index]; normal.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); normal.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); return (e_hitCollide); }; lambda[0] = 0; return (e_startsInsideCollide); } override public function ComputeMass(massData:b2MassData):void{ var p2:b2Vec2; var p3:b2Vec2; var e1X:Number; var e1Y:Number; var e2X:Number; var e2Y:Number; var D:Number; var triangleArea:Number; var px:Number; var py:Number; var ex1:Number; var ey1:Number; var ex2:Number; var ey2:Number; var intx2:Number; var inty2:Number; var centerX:Number = 0; var centerY:Number = 0; var area:Number = 0; var I:Number = 0; var p1X:Number = 0; var p1Y:Number = 0; var k_inv3:Number = (1 / 3); var i:int; while (i < m_vertexCount) { p2 = m_vertices[i]; p3 = (((i + 1) < m_vertexCount)) ? m_vertices[int((i + 1))] : m_vertices[0]; e1X = (p2.x - p1X); e1Y = (p2.y - p1Y); e2X = (p3.x - p1X); e2Y = (p3.y - p1Y); D = ((e1X * e2Y) - (e1Y * e2X)); triangleArea = (0.5 * D); area = (area + triangleArea); centerX = (centerX + ((triangleArea * k_inv3) * ((p1X + p2.x) + p3.x))); centerY = (centerY + ((triangleArea * k_inv3) * ((p1Y + p2.y) + p3.y))); px = p1X; py = p1Y; ex1 = e1X; ey1 = e1Y; ex2 = e2X; ey2 = e2Y; intx2 = ((k_inv3 * ((0.25 * (((ex1 * ex1) + (ex2 * ex1)) + (ex2 * ex2))) + ((px * ex1) + (px * ex2)))) + ((0.5 * px) * px)); inty2 = ((k_inv3 * ((0.25 * (((ey1 * ey1) + (ey2 * ey1)) + (ey2 * ey2))) + ((py * ey1) + (py * ey2)))) + ((0.5 * py) * py)); I = (I + (D * (intx2 + inty2))); i++; }; massData.mass = (m_density * area); centerX = (centerX * (1 / area)); centerY = (centerY * (1 / area)); massData.center.Set(centerX, centerY); massData.I = (m_density * I); } public function GetNormals():Array{ return (m_normals); } public function Support(xf:b2XForm, dX:Number, dY:Number):b2Vec2{ var tVec:b2Vec2; var tMat:b2Mat22; var value:Number; tMat = xf.R; var dLocalX:Number = ((dX * tMat.col1.x) + (dY * tMat.col1.y)); var dLocalY:Number = ((dX * tMat.col2.x) + (dY * tMat.col2.y)); var bestIndex:int; tVec = m_coreVertices[0]; var bestValue:Number = ((tVec.x * dLocalX) + (tVec.y * dLocalY)); var i = 1; while (i < m_vertexCount) { tVec = m_coreVertices[i]; value = ((tVec.x * dLocalX) + (tVec.y * dLocalY)); if (value > bestValue){ bestIndex = i; bestValue = value; }; i++; }; tMat = xf.R; tVec = m_coreVertices[bestIndex]; s_supportVec.x = (xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); s_supportVec.y = (xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); return (s_supportVec); } public function GetVertexCount():int{ return (m_vertexCount); } override public function ComputeAABB(aabb:b2AABB, xf:b2XForm):void{ var tMat:b2Mat22; var tVec:b2Vec2; var R:b2Mat22 = s_computeMat; tMat = xf.R; tVec = m_obb.R.col1; R.col1.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); R.col1.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); tVec = m_obb.R.col2; R.col2.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); R.col2.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); R.Abs(); var absR:b2Mat22 = R; tVec = m_obb.extents; var hX:Number = ((absR.col1.x * tVec.x) + (absR.col2.x * tVec.y)); var hY:Number = ((absR.col1.y * tVec.x) + (absR.col2.y * tVec.y)); tMat = xf.R; tVec = m_obb.center; var positionX:Number = (xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var positionY:Number = (xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); aabb.lowerBound.Set((positionX - hX), (positionY - hY)); aabb.upperBound.Set((positionX + hX), (positionY + hY)); } override public function UpdateSweepRadius(center:b2Vec2):void{ var tVec:b2Vec2; var dX:Number; var dY:Number; m_sweepRadius = 0; var i:int; while (i < m_vertexCount) { tVec = m_coreVertices[i]; dX = (tVec.x - center.x); dY = (tVec.y - center.y); dX = Math.sqrt(((dX * dX) + (dY * dY))); if (dX > m_sweepRadius){ m_sweepRadius = dX; }; i++; }; } override public function TestPoint(xf:b2XForm, p:b2Vec2):Boolean{ var tVec:b2Vec2; var dot:Number; var tMat:b2Mat22 = xf.R; var tX:Number = (p.x - xf.position.x); var tY:Number = (p.y - xf.position.y); var pLocalX:Number = ((tX * tMat.col1.x) + (tY * tMat.col1.y)); var pLocalY:Number = ((tX * tMat.col2.x) + (tY * tMat.col2.y)); var i:int; while (i < m_vertexCount) { tVec = m_vertices[i]; tX = (pLocalX - tVec.x); tY = (pLocalY - tVec.y); tVec = m_normals[i]; dot = ((tVec.x * tX) + (tVec.y * tY)); if (dot > 0){ return (false); }; i++; }; return (true); } public static function ComputeCentroid(vs:Array, count:int):b2Vec2{ var c:b2Vec2; var inv3:Number; var p2:b2Vec2; var p3:b2Vec2; var e1X:Number; var e1Y:Number; var e2X:Number; var e2Y:Number; var D:Number; var triangleArea:Number; c = new b2Vec2(); var area:Number = 0; var p1X:Number = 0; var p1Y:Number = 0; inv3 = (1 / 3); var i:int; while (i < count) { p2 = vs[i]; p3 = (((i + 1) < count)) ? vs[int((i + 1))] : vs[0]; e1X = (p2.x - p1X); e1Y = (p2.y - p1Y); e2X = (p3.x - p1X); e2Y = (p3.y - p1Y); D = ((e1X * e2Y) - (e1Y * e2X)); triangleArea = (0.5 * D); area = (area + triangleArea); c.x = (c.x + ((triangleArea * inv3) * ((p1X + p2.x) + p3.x))); c.y = (c.y + ((triangleArea * inv3) * ((p1Y + p2.y) + p3.y))); i++; }; c.x = (c.x * (1 / area)); c.y = (c.y * (1 / area)); return (c); } public static function ComputeOBB(obb:b2OBB, vs:Array, count:int):void{ var i:int; var root:b2Vec2; var uxX:Number; var uxY:Number; var length:Number; var uyX:Number; var uyY:Number; var lowerX:Number; var lowerY:Number; var upperX:Number; var upperY:Number; var j:int; var area:Number; var dX:Number; var dY:Number; var rX:Number; var rY:Number; var centerX:Number; var centerY:Number; var tMat:b2Mat22; var p:Array = new Array((b2Settings.b2_maxPolygonVertices + 1)); i = 0; while (i < count) { p[i] = vs[i]; i++; }; p[count] = p[0]; var minArea:Number = Number.MAX_VALUE; i = 1; while (i <= count) { root = p[int((i - 1))]; uxX = (p[i].x - root.x); uxY = (p[i].y - root.y); length = Math.sqrt(((uxX * uxX) + (uxY * uxY))); uxX = (uxX / length); uxY = (uxY / length); uyX = -(uxY); uyY = uxX; lowerX = Number.MAX_VALUE; lowerY = Number.MAX_VALUE; upperX = -(Number.MAX_VALUE); upperY = -(Number.MAX_VALUE); j = 0; while (j < count) { dX = (p[j].x - root.x); dY = (p[j].y - root.y); rX = ((uxX * dX) + (uxY * dY)); rY = ((uyX * dX) + (uyY * dY)); if (rX < lowerX){ lowerX = rX; }; if (rY < lowerY){ lowerY = rY; }; if (rX > upperX){ upperX = rX; }; if (rY > upperY){ upperY = rY; }; j++; }; area = ((upperX - lowerX) * (upperY - lowerY)); if (area < (0.95 * minArea)){ minArea = area; obb.R.col1.x = uxX; obb.R.col1.y = uxY; obb.R.col2.x = uyX; obb.R.col2.y = uyY; centerX = (0.5 * (lowerX + upperX)); centerY = (0.5 * (lowerY + upperY)); tMat = obb.R; obb.center.x = (root.x + ((tMat.col1.x * centerX) + (tMat.col2.x * centerY))); obb.center.y = (root.y + ((tMat.col1.y * centerX) + (tMat.col2.y * centerY))); obb.extents.x = (0.5 * (upperX - lowerX)); obb.extents.y = (0.5 * (upperY - lowerY)); }; i++; }; } } }//package Box2D.Collision.Shapes
Section 7
//b2Shape (Box2D.Collision.Shapes.b2Shape) package Box2D.Collision.Shapes { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class b2Shape { public var m_next:b2Shape; public var m_type:int; public var m_sweepRadius:Number; public var m_density:Number; public var m_filter:b2FilterData; public var m_friction:Number; public var m_isSensor:Boolean; public var m_restitution:Number; public var m_userData; public var m_proxyId:uint; public var m_body:b2Body; public static const e_polygonShape:int = 1; public static const e_hitCollide:int = 1; public static const e_missCollide:int = 0; public static const e_unknownShape:int = -1; public static const e_circleShape:int = 0; public static const e_shapeTypeCount:int = 2; public static const e_startsInsideCollide:int = -1; private static var s_resetAABB:b2AABB = new b2AABB(); private static var s_syncAABB:b2AABB = new b2AABB(); private static var s_proxyAABB:b2AABB = new b2AABB(); public function b2Shape(def:b2ShapeDef){ super(); m_userData = def.userData; m_friction = def.friction; m_restitution = def.restitution; m_density = def.density; m_body = null; m_sweepRadius = 0; m_next = null; m_proxyId = b2Pair.b2_nullProxy; m_filter = def.filter.Copy(); m_isSensor = def.isSensor; } public function SetUserData(data):void{ m_userData = data; } public function GetSweepRadius():Number{ return (m_sweepRadius); } public function GetNext():b2Shape{ return (m_next); } public function ComputeSweptAABB(aabb:b2AABB, xf1:b2XForm, xf2:b2XForm):void{ } public function GetType():int{ return (m_type); } public function GetRestitution():Number{ return (m_restitution); } public function GetFriction():Number{ return (m_friction); } public function GetFilterData():b2FilterData{ return (m_filter.Copy()); } public function TestSegment(xf:b2XForm, lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):int{ return (e_missCollide); } public function RefilterProxy(broadPhase:b2BroadPhase, transform:b2XForm):void{ if (m_proxyId == b2Pair.b2_nullProxy){ return; }; broadPhase.DestroyProxy(m_proxyId); var aabb:b2AABB = s_resetAABB; ComputeAABB(aabb, transform); var inRange:Boolean = broadPhase.InRange(aabb); if (inRange){ m_proxyId = broadPhase.CreateProxy(aabb, this); } else { m_proxyId = b2Pair.b2_nullProxy; }; } public function SetFilterData(filter:b2FilterData):void{ m_filter = filter.Copy(); } public function GetUserData(){ return (m_userData); } public function Synchronize(broadPhase:b2BroadPhase, transform1:b2XForm, transform2:b2XForm):Boolean{ if (m_proxyId == b2Pair.b2_nullProxy){ return (false); }; var aabb:b2AABB = s_syncAABB; ComputeSweptAABB(aabb, transform1, transform2); if (broadPhase.InRange(aabb)){ broadPhase.MoveProxy(m_proxyId, aabb); return (true); }; return (false); } public function ComputeMass(massData:b2MassData):void{ } public function IsSensor():Boolean{ return (m_isSensor); } public function DestroyProxy(broadPhase:b2BroadPhase):void{ if (m_proxyId != b2Pair.b2_nullProxy){ broadPhase.DestroyProxy(m_proxyId); m_proxyId = b2Pair.b2_nullProxy; }; } public function UpdateSweepRadius(center:b2Vec2):void{ } public function ComputeAABB(aabb:b2AABB, xf:b2XForm):void{ } public function GetBody():b2Body{ return (m_body); } public function CreateProxy(broadPhase:b2BroadPhase, transform:b2XForm):void{ var aabb:b2AABB = s_proxyAABB; ComputeAABB(aabb, transform); var inRange:Boolean = broadPhase.InRange(aabb); if (inRange){ m_proxyId = broadPhase.CreateProxy(aabb, this); } else { m_proxyId = b2Pair.b2_nullProxy; }; } public function TestPoint(xf:b2XForm, p:b2Vec2):Boolean{ return (false); } public static function Destroy(shape:b2Shape, allocator):void{ } public static function Create(def:b2ShapeDef, allocator):b2Shape{ switch (def.type){ case e_circleShape: return (new b2CircleShape(def)); case e_polygonShape: return (new b2PolygonShape(def)); default: return (null); }; } } }//package Box2D.Collision.Shapes
Section 8
//b2ShapeDef (Box2D.Collision.Shapes.b2ShapeDef) package Box2D.Collision.Shapes { public class b2ShapeDef { public var friction:Number;// = 0.2 public var isSensor:Boolean;// = false public var density:Number;// = 0 public var restitution:Number;// = 0 public var userData;// = null public var filter:b2FilterData; public var type:int; public function b2ShapeDef(){ type = b2Shape.e_unknownShape; filter = new b2FilterData(); super(); } } }//package Box2D.Collision.Shapes
Section 9
//b2AABB (Box2D.Collision.b2AABB) package Box2D.Collision { import Box2D.Common.Math.*; public class b2AABB { public var upperBound:b2Vec2; public var lowerBound:b2Vec2; public function b2AABB(){ lowerBound = new b2Vec2(); upperBound = new b2Vec2(); super(); } public function IsValid():Boolean{ var dX:Number = (upperBound.x - lowerBound.x); var dY:Number = (upperBound.y - lowerBound.y); var valid:Boolean = (((dX >= 0)) && ((dY >= 0))); valid = ((((valid) && (lowerBound.IsValid()))) && (upperBound.IsValid())); return (valid); } } }//package Box2D.Collision
Section 10
//b2Bound (Box2D.Collision.b2Bound) package Box2D.Collision { public class b2Bound { public var value:uint; public var proxyId:uint; public var stabbingCount:uint; public function b2Bound(){ super(); } public function Swap(b:b2Bound):void{ var tempValue:uint = value; var tempProxyId:uint = proxyId; var tempStabbingCount:uint = stabbingCount; value = b.value; proxyId = b.proxyId; stabbingCount = b.stabbingCount; b.value = tempValue; b.proxyId = tempProxyId; b.stabbingCount = tempStabbingCount; } public function IsLower():Boolean{ return (((value & 1) == 0)); } public function IsUpper():Boolean{ return (((value & 1) == 1)); } } }//package Box2D.Collision
Section 11
//b2BoundValues (Box2D.Collision.b2BoundValues) package Box2D.Collision { public class b2BoundValues { public var lowerValues:Array; public var upperValues:Array; public function b2BoundValues(){ lowerValues = [0, 0]; upperValues = [0, 0]; super(); } } }//package Box2D.Collision
Section 12
//b2BroadPhase (Box2D.Collision.b2BroadPhase) package Box2D.Collision { import Box2D.Common.Math.*; import Box2D.Common.*; public class b2BroadPhase { public var m_bounds:Array; public var m_worldAABB:b2AABB; public var m_querySortKeys:Array; public var m_freeProxy:uint; public var m_quantizationFactor:b2Vec2; public var m_proxyCount:int; public var m_proxyPool:Array; public var m_queryResultCount:int; public var m_pairManager:b2PairManager; public var m_timeStamp:uint; public var m_queryResults:Array; public static const b2_nullEdge:uint = 0xFFFF; public static const b2_invalid:uint = 0xFFFF; public static var s_validate:Boolean = false; public function b2BroadPhase(worldAABB:b2AABB, callback:b2PairCallback){ var i:int; var tProxy:b2Proxy; var j:int; m_pairManager = new b2PairManager(); m_proxyPool = new Array(b2Settings.b2_maxPairs); m_bounds = new Array((2 * b2Settings.b2_maxProxies)); m_querySortKeys = new Array(b2Settings.b2_maxProxies); m_queryResults = new Array(b2Settings.b2_maxProxies); m_quantizationFactor = new b2Vec2(); super(); m_pairManager.Initialize(this, callback); m_worldAABB = worldAABB; m_proxyCount = 0; i = 0; while (i < b2Settings.b2_maxProxies) { m_queryResults[i] = 0; m_querySortKeys[i] = 0; i++; }; m_bounds = new Array(2); i = 0; while (i < 2) { m_bounds[i] = new Array((2 * b2Settings.b2_maxProxies)); j = 0; while (j < (2 * b2Settings.b2_maxProxies)) { m_bounds[i][j] = new b2Bound(); j++; }; i++; }; var dX:Number = (worldAABB.upperBound.x - worldAABB.lowerBound.x); var dY:Number = (worldAABB.upperBound.y - worldAABB.lowerBound.y); m_quantizationFactor.x = (b2Settings.USHRT_MAX / dX); m_quantizationFactor.y = (b2Settings.USHRT_MAX / dY); i = 0; while (i < (b2Settings.b2_maxProxies - 1)) { tProxy = new b2Proxy(); m_proxyPool[i] = tProxy; tProxy.SetNext((i + 1)); tProxy.timeStamp = 0; tProxy.overlapCount = b2_invalid; tProxy.userData = null; i++; }; tProxy = new b2Proxy(); m_proxyPool[int((b2Settings.b2_maxProxies - 1))] = tProxy; tProxy.SetNext(b2Pair.b2_nullProxy); tProxy.timeStamp = 0; tProxy.overlapCount = b2_invalid; tProxy.userData = null; m_freeProxy = 0; m_timeStamp = 1; m_queryResultCount = 0; } public function QueryAABB(aabb:b2AABB, userData, maxCount:int):int{ var lowerIndex:uint; var upperIndex:uint; var proxy:b2Proxy; var lowerValues:Array = new Array(); var upperValues:Array = new Array(); ComputeBounds(lowerValues, upperValues, aabb); var lowerIndexOut:Array = [lowerIndex]; var upperIndexOut:Array = [upperIndex]; Query(lowerIndexOut, upperIndexOut, lowerValues[0], upperValues[0], m_bounds[0], (2 * m_proxyCount), 0); Query(lowerIndexOut, upperIndexOut, lowerValues[1], upperValues[1], m_bounds[1], (2 * m_proxyCount), 1); var count:int; var i:int; while ((((i < m_queryResultCount)) && ((count < maxCount)))) { proxy = m_proxyPool[m_queryResults[i]]; userData[i] = proxy.userData; i++; count++; }; m_queryResultCount = 0; IncrementTimeStamp(); return (count); } public function Commit():void{ m_pairManager.Commit(); } public function GetProxy(proxyId:int):b2Proxy{ var proxy:b2Proxy = m_proxyPool[proxyId]; if ((((proxyId == b2Pair.b2_nullProxy)) || ((proxy.IsValid() == false)))){ return (null); }; return (proxy); } private function IncrementTimeStamp():void{ var i:uint; if (m_timeStamp == b2Settings.USHRT_MAX){ i = 0; while (i < b2Settings.b2_maxProxies) { (m_proxyPool[i] as b2Proxy).timeStamp = 0; i++; }; m_timeStamp = 1; } else { m_timeStamp++; }; } private function Query(lowerQueryOut:Array, upperQueryOut:Array, lowerValue:uint, upperValue:uint, bounds:Array, boundCount:uint, axis:int):void{ var bound:b2Bound; var i:int; var s:int; var proxy:b2Proxy; var lowerQuery:uint = BinarySearch(bounds, boundCount, lowerValue); var upperQuery:uint = BinarySearch(bounds, boundCount, upperValue); var j:uint = lowerQuery; while (j < upperQuery) { bound = bounds[j]; if (bound.IsLower()){ IncrementOverlapCount(bound.proxyId); }; j++; }; if (lowerQuery > 0){ i = (lowerQuery - 1); bound = bounds[i]; s = bound.stabbingCount; while (s) { bound = bounds[i]; if (bound.IsLower()){ proxy = m_proxyPool[bound.proxyId]; if (lowerQuery <= proxy.upperBounds[axis]){ IncrementOverlapCount(bound.proxyId); s--; }; }; i--; }; }; lowerQueryOut[0] = lowerQuery; upperQueryOut[0] = upperQuery; } private function AddProxyResult(proxyId:uint, proxy:b2Proxy, maxCount:Number, sortKey:Function):void{ var tempKey2:Number; var tempId2:uint; var key:Number = sortKey(proxy.userData); if (key < 0){ return; }; var i:Number = 0; while ((((i < m_queryResultCount)) && ((m_querySortKeys[i] < key)))) { i++; }; var tempKey:Number = key; var tempId:uint = proxyId; m_queryResultCount = (m_queryResultCount + 1); if (m_queryResultCount > maxCount){ m_queryResultCount = maxCount; }; while (i < m_queryResultCount) { tempKey2 = m_querySortKeys[i]; tempId2 = m_queryResults[i]; m_querySortKeys[i] = tempKey; m_queryResults[i] = tempId; tempKey = tempKey2; tempId = tempId2; i++; }; } private function TestOverlapValidate(p1:b2Proxy, p2:b2Proxy):Boolean{ var bounds:Array; var bound1:b2Bound; var bound2:b2Bound; var axis:int; while (axis < 2) { bounds = m_bounds[axis]; bound1 = bounds[p1.lowerBounds[axis]]; bound2 = bounds[p2.upperBounds[axis]]; if (bound1.value > bound2.value){ return (false); }; bound1 = bounds[p1.upperBounds[axis]]; bound2 = bounds[p2.lowerBounds[axis]]; if (bound1.value < bound2.value){ return (false); }; axis++; }; return (true); } private function ComputeBounds(lowerValues:Array, upperValues:Array, aabb:b2AABB):void{ var minVertexX:Number = aabb.lowerBound.x; var minVertexY:Number = aabb.lowerBound.y; minVertexX = b2Math.b2Min(minVertexX, m_worldAABB.upperBound.x); minVertexY = b2Math.b2Min(minVertexY, m_worldAABB.upperBound.y); minVertexX = b2Math.b2Max(minVertexX, m_worldAABB.lowerBound.x); minVertexY = b2Math.b2Max(minVertexY, m_worldAABB.lowerBound.y); var maxVertexX:Number = aabb.upperBound.x; var maxVertexY:Number = aabb.upperBound.y; maxVertexX = b2Math.b2Min(maxVertexX, m_worldAABB.upperBound.x); maxVertexY = b2Math.b2Min(maxVertexY, m_worldAABB.upperBound.y); maxVertexX = b2Math.b2Max(maxVertexX, m_worldAABB.lowerBound.x); maxVertexY = b2Math.b2Max(maxVertexY, m_worldAABB.lowerBound.y); lowerValues[0] = (uint((m_quantizationFactor.x * (minVertexX - m_worldAABB.lowerBound.x))) & (b2Settings.USHRT_MAX - 1)); upperValues[0] = ((uint((m_quantizationFactor.x * (maxVertexX - m_worldAABB.lowerBound.x))) & 0xFFFF) | 1); lowerValues[1] = (uint((m_quantizationFactor.y * (minVertexY - m_worldAABB.lowerBound.y))) & (b2Settings.USHRT_MAX - 1)); upperValues[1] = ((uint((m_quantizationFactor.y * (maxVertexY - m_worldAABB.lowerBound.y))) & 0xFFFF) | 1); } public function CreateProxy(aabb:b2AABB, userData):uint{ var index:uint; var proxy:b2Proxy; var bounds:Array; var lowerIndex:uint; var upperIndex:uint; var lowerIndexOut:Array; var upperIndexOut:Array; var tArr:Array; var j:int; var tEnd:int; var tBound1:b2Bound; var tBound2:b2Bound; var tBoundAS3:b2Bound; var tIndex:int; var proxy2:b2Proxy; var proxyId:uint = m_freeProxy; proxy = m_proxyPool[proxyId]; m_freeProxy = proxy.GetNext(); proxy.overlapCount = 0; proxy.userData = userData; var boundCount:uint = (2 * m_proxyCount); var lowerValues:Array = new Array(); var upperValues:Array = new Array(); ComputeBounds(lowerValues, upperValues, aabb); var axis:int; while (axis < 2) { bounds = m_bounds[axis]; lowerIndexOut = [lowerIndex]; upperIndexOut = [upperIndex]; Query(lowerIndexOut, upperIndexOut, lowerValues[axis], upperValues[axis], bounds, boundCount, axis); lowerIndex = lowerIndexOut[0]; upperIndex = upperIndexOut[0]; tArr = new Array(); tEnd = (boundCount - upperIndex); j = 0; while (j < tEnd) { tArr[j] = new b2Bound(); tBound1 = tArr[j]; tBound2 = bounds[int((upperIndex + j))]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; tEnd = tArr.length; tIndex = (upperIndex + 2); j = 0; while (j < tEnd) { tBound2 = tArr[j]; tBound1 = bounds[int((tIndex + j))]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; tArr = new Array(); tEnd = (upperIndex - lowerIndex); j = 0; while (j < tEnd) { tArr[j] = new b2Bound(); tBound1 = tArr[j]; tBound2 = bounds[int((lowerIndex + j))]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; tEnd = tArr.length; tIndex = (lowerIndex + 1); j = 0; while (j < tEnd) { tBound2 = tArr[j]; tBound1 = bounds[int((tIndex + j))]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; upperIndex++; tBound1 = bounds[lowerIndex]; tBound2 = bounds[upperIndex]; tBound1.value = lowerValues[axis]; tBound1.proxyId = proxyId; tBound2.value = upperValues[axis]; tBound2.proxyId = proxyId; tBoundAS3 = bounds[int((lowerIndex - 1))]; tBound1.stabbingCount = ((lowerIndex == 0)) ? 0 : tBoundAS3.stabbingCount; tBoundAS3 = bounds[int((upperIndex - 1))]; tBound2.stabbingCount = tBoundAS3.stabbingCount; index = lowerIndex; while (index < upperIndex) { tBoundAS3 = bounds[index]; tBoundAS3.stabbingCount++; index++; }; index = lowerIndex; while (index < (boundCount + 2)) { tBound1 = bounds[index]; proxy2 = m_proxyPool[tBound1.proxyId]; if (tBound1.IsLower()){ proxy2.lowerBounds[axis] = index; } else { proxy2.upperBounds[axis] = index; }; index++; }; axis++; }; m_proxyCount++; var i:int; while (i < m_queryResultCount) { m_pairManager.AddBufferedPair(proxyId, m_queryResults[i]); i++; }; m_pairManager.Commit(); m_queryResultCount = 0; IncrementTimeStamp(); return (proxyId); } public function DestroyProxy(proxyId:uint):void{ var tBound1:b2Bound; var tBound2:b2Bound; var bounds:Array; var lowerIndex:uint; var upperIndex:uint; var lowerValue:uint; var upperValue:uint; var tArr:Array; var j:int; var tEnd:int; var tIndex:int; var index:uint; var index2:int; var proxy2:b2Proxy; var proxy:b2Proxy = m_proxyPool[proxyId]; var boundCount:int = (2 * m_proxyCount); var axis:int; while (axis < 2) { bounds = m_bounds[axis]; lowerIndex = proxy.lowerBounds[axis]; upperIndex = proxy.upperBounds[axis]; tBound1 = bounds[lowerIndex]; lowerValue = tBound1.value; tBound2 = bounds[upperIndex]; upperValue = tBound2.value; tArr = new Array(); tEnd = ((upperIndex - lowerIndex) - 1); j = 0; while (j < tEnd) { tArr[j] = new b2Bound(); tBound1 = tArr[j]; tBound2 = bounds[int(((lowerIndex + 1) + j))]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; tEnd = tArr.length; tIndex = lowerIndex; j = 0; while (j < tEnd) { tBound2 = tArr[j]; tBound1 = bounds[int((tIndex + j))]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; tArr = new Array(); tEnd = ((boundCount - upperIndex) - 1); j = 0; while (j < tEnd) { tArr[j] = new b2Bound(); tBound1 = tArr[j]; tBound2 = bounds[int(((upperIndex + 1) + j))]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; tEnd = tArr.length; tIndex = (upperIndex - 1); j = 0; while (j < tEnd) { tBound2 = tArr[j]; tBound1 = bounds[int((tIndex + j))]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; tEnd = (boundCount - 2); index = lowerIndex; while (index < tEnd) { tBound1 = bounds[index]; proxy2 = m_proxyPool[tBound1.proxyId]; if (tBound1.IsLower()){ proxy2.lowerBounds[axis] = index; } else { proxy2.upperBounds[axis] = index; }; index++; }; tEnd = (upperIndex - 1); index2 = lowerIndex; while (index2 < tEnd) { tBound1 = bounds[index2]; tBound1.stabbingCount--; index2++; }; Query([0], [0], lowerValue, upperValue, bounds, (boundCount - 2), axis); axis++; }; var i:int; while (i < m_queryResultCount) { m_pairManager.RemoveBufferedPair(proxyId, m_queryResults[i]); i++; }; m_pairManager.Commit(); m_queryResultCount = 0; IncrementTimeStamp(); proxy.userData = null; proxy.overlapCount = b2_invalid; proxy.lowerBounds[0] = b2_invalid; proxy.lowerBounds[1] = b2_invalid; proxy.upperBounds[0] = b2_invalid; proxy.upperBounds[1] = b2_invalid; proxy.SetNext(m_freeProxy); m_freeProxy = proxyId; m_proxyCount--; } public function TestOverlap(b:b2BoundValues, p:b2Proxy):Boolean{ var bounds:Array; var bound:b2Bound; var axis:int; while (axis < 2) { bounds = m_bounds[axis]; bound = bounds[p.upperBounds[axis]]; if (b.lowerValues[axis] > bound.value){ return (false); }; bound = bounds[p.lowerBounds[axis]]; if (b.upperValues[axis] < bound.value){ return (false); }; axis++; }; return (true); } public function Validate():void{ var pair:b2Pair; var proxy1:b2Proxy; var proxy2:b2Proxy; var overlap:Boolean; var bounds:b2Bound; var boundCount:uint; var stabbingCount:uint; var i:uint; var bound:b2Bound; var axis:int; while (axis < 2) { bounds = m_bounds[axis]; boundCount = (2 * m_proxyCount); stabbingCount = 0; i = 0; while (i < boundCount) { bound = bounds[i]; if (bound.IsLower() == true){ stabbingCount++; } else { stabbingCount--; }; i++; }; axis++; }; } private function IncrementOverlapCount(proxyId:uint):void{ var proxy:b2Proxy = m_proxyPool[proxyId]; if (proxy.timeStamp < m_timeStamp){ proxy.timeStamp = m_timeStamp; proxy.overlapCount = 1; } else { proxy.overlapCount = 2; m_queryResults[m_queryResultCount] = proxyId; m_queryResultCount++; }; } public function InRange(aabb:b2AABB):Boolean{ var dX:Number; var dY:Number; var d2X:Number; var d2Y:Number; dX = aabb.lowerBound.x; dY = aabb.lowerBound.y; dX = (dX - m_worldAABB.upperBound.x); dY = (dY - m_worldAABB.upperBound.y); d2X = m_worldAABB.lowerBound.x; d2Y = m_worldAABB.lowerBound.y; d2X = (d2X - aabb.upperBound.x); d2Y = (d2Y - aabb.upperBound.y); dX = b2Math.b2Max(dX, d2X); dY = b2Math.b2Max(dY, d2Y); return ((b2Math.b2Max(dX, dY) < 0)); } public function QuerySegment(segment:b2Segment, userData, maxCount:int, sortKey:Function):int{ var xIndex:int; var yIndex:int; var proxyId:uint; var proxy:b2Proxy; var lowerIndex:uint; var upperIndex:uint; var xProgress:Number; var yProgress:Number; var i:Number; var A:Number; var B:Number; var tempValue:uint; var maxLamda:Number = 1; var dx:Number = ((segment.p2.x - segment.p1.x) * m_quantizationFactor.x); var dy:Number = ((segment.p2.y - segment.p1.y) * m_quantizationFactor.y); var sx:int = ((dx < -(Number.MIN_VALUE))) ? -1 : ((dx > Number.MIN_VALUE)) ? 1 : 0; var sy:int = ((dy < -(Number.MIN_VALUE))) ? -1 : ((dy > Number.MIN_VALUE)) ? 1 : 0; var p1x:Number = (m_quantizationFactor.x * (segment.p1.x - m_worldAABB.lowerBound.x)); var p1y:Number = (m_quantizationFactor.y * (segment.p1.y - m_worldAABB.lowerBound.y)); var startValues:Array = new Array(); var startValues2:Array = new Array(); startValues[0] = (uint(p1x) & (b2Settings.USHRT_MAX - 1)); startValues[1] = (uint(p1y) & (b2Settings.USHRT_MAX - 1)); startValues2[0] = (startValues[0] + 1); startValues2[1] = (startValues[1] + 1); var startIndices:Array = new Array(); var lowerIndexOut:Array = [lowerIndex]; var upperIndexOut:Array = [upperIndex]; Query(lowerIndexOut, upperIndexOut, startValues[0], startValues2[0], m_bounds[0], (2 * m_proxyCount), 0); if (sx >= 0){ xIndex = (upperIndexOut[0] - 1); } else { xIndex = lowerIndexOut[0]; }; Query(lowerIndexOut, upperIndexOut, startValues[1], startValues2[1], m_bounds[1], (2 * m_proxyCount), 1); if (sy >= 0){ yIndex = (upperIndexOut[0] - 1); } else { yIndex = lowerIndexOut[0]; }; if (sortKey != null){ i = 0; while (i < m_queryResultCount) { m_querySortKeys[i] = sortKey(m_proxyPool[m_queryResults[i]].userData); i++; }; i = 0; while (i < (m_queryResultCount - 1)) { A = m_querySortKeys[i]; B = m_querySortKeys[(i + 1)]; if (((A)<0) ? (B >= 0) : (((A > B)) && ((B >= 0)))){ m_querySortKeys[(i + 1)] = A; m_querySortKeys[i] = B; tempValue = m_queryResults[(i + 1)]; m_queryResults[(i + 1)] = m_queryResults[i]; m_queryResults[i] = tempValue; i--; if (i == -1){ i = 1; }; } else { i++; }; }; while ((((m_queryResultCount > 0)) && ((m_querySortKeys[(m_queryResultCount - 1)] < 0)))) { m_queryResultCount--; }; }; var b:Boolean; if ((((xIndex < 0)) || ((xIndex >= (m_proxyCount * 2))))){ b = false; }; if ((((yIndex < 0)) || ((yIndex >= (m_proxyCount * 2))))){ b = false; }; if (b){ if (sx != 0){ if (sx > 0){ xIndex++; if (xIndex == (m_proxyCount * 2)){ b = false; }; } else { xIndex--; if (xIndex < 0){ b = false; }; }; xProgress = ((m_bounds[0][xIndex].value - p1x) / dx); }; if (sy != 0){ if (sy > 0){ yIndex++; if (yIndex == (m_proxyCount * 2)){ b = false; }; } else { yIndex--; if (yIndex < 0){ b = false; }; }; yProgress = ((m_bounds[1][yIndex].value - p1y) / dy); }; }; while (b) { if ((((sy == 0)) || (((!((sx == 0))) && ((xProgress < yProgress)))))){ if (xProgress > maxLamda){ break; }; if (((sx > 0)) ? m_bounds[0][xIndex].IsLower() : m_bounds[0][xIndex].IsUpper()){ proxyId = m_bounds[0][xIndex].proxyId; proxy = m_proxyPool[proxyId]; if (sy >= 0){ if ((((proxy.lowerBounds[1] <= (yIndex - 1))) && ((proxy.upperBounds[1] >= yIndex)))){ if (sortKey != null){ AddProxyResult(proxyId, proxy, maxCount, sortKey); } else { m_queryResults[m_queryResultCount] = proxyId; m_queryResultCount++; }; }; } else { if ((((proxy.lowerBounds[1] <= yIndex)) && ((proxy.upperBounds[1] >= (yIndex + 1))))){ if (sortKey != null){ AddProxyResult(proxyId, proxy, maxCount, sortKey); } else { m_queryResults[m_queryResultCount] = proxyId; m_queryResultCount++; }; }; }; }; if (((((((!((sortKey == null))) && ((m_queryResultCount == maxCount)))) && ((m_queryResultCount > 0)))) && ((xProgress > m_querySortKeys[(m_queryResultCount - 1)])))){ break; }; if (sx > 0){ xIndex++; if (xIndex == (m_proxyCount * 2)){ break; }; } else { xIndex--; if (xIndex < 0){ break; }; }; xProgress = ((m_bounds[0][xIndex].value - p1x) / dx); } else { if (yProgress > maxLamda){ break; }; if (((sy > 0)) ? m_bounds[1][yIndex].IsLower() : m_bounds[1][yIndex].IsUpper()){ proxyId = m_bounds[1][yIndex].proxyId; proxy = m_proxyPool[proxyId]; if (sx >= 0){ if ((((proxy.lowerBounds[0] <= (xIndex - 1))) && ((proxy.upperBounds[0] >= xIndex)))){ if (sortKey != null){ AddProxyResult(proxyId, proxy, maxCount, sortKey); } else { m_queryResults[m_queryResultCount] = proxyId; m_queryResultCount++; }; }; } else { if ((((proxy.lowerBounds[0] <= xIndex)) && ((proxy.upperBounds[0] >= (xIndex + 1))))){ if (sortKey != null){ AddProxyResult(proxyId, proxy, maxCount, sortKey); } else { m_queryResults[m_queryResultCount] = proxyId; m_queryResultCount++; }; }; }; }; if (((((((!((sortKey == null))) && ((m_queryResultCount == maxCount)))) && ((m_queryResultCount > 0)))) && ((yProgress > m_querySortKeys[(m_queryResultCount - 1)])))){ break; }; if (sy > 0){ yIndex++; if (yIndex == (m_proxyCount * 2)){ break; }; } else { yIndex--; if (yIndex < 0){ break; }; }; yProgress = ((m_bounds[1][yIndex].value - p1y) / dy); }; }; var count:int; i = 0; while ((((i < m_queryResultCount)) && ((count < maxCount)))) { proxy = m_proxyPool[m_queryResults[i]]; userData[i] = proxy.userData; i++; count++; }; m_queryResultCount = 0; IncrementTimeStamp(); return (count); } public function MoveProxy(proxyId:uint, aabb:b2AABB):void{ var as3arr:Array; var as3int:int; var axis:uint; var index:uint; var bound:b2Bound; var prevBound:b2Bound; var nextBound:b2Bound; var nextProxyId:uint; var nextProxy:b2Proxy; var bounds:Array; var lowerIndex:uint; var upperIndex:uint; var lowerValue:uint; var upperValue:uint; var deltaLower:int; var deltaUpper:int; var prevProxyId:uint; var prevProxy:b2Proxy; if ((((proxyId == b2Pair.b2_nullProxy)) || ((b2Settings.b2_maxProxies <= proxyId)))){ return; }; if (aabb.IsValid() == false){ return; }; var boundCount:uint = (2 * m_proxyCount); var proxy:b2Proxy = m_proxyPool[proxyId]; var newValues:b2BoundValues = new b2BoundValues(); ComputeBounds(newValues.lowerValues, newValues.upperValues, aabb); var oldValues:b2BoundValues = new b2BoundValues(); axis = 0; while (axis < 2) { bound = m_bounds[axis][proxy.lowerBounds[axis]]; oldValues.lowerValues[axis] = bound.value; bound = m_bounds[axis][proxy.upperBounds[axis]]; oldValues.upperValues[axis] = bound.value; axis++; }; axis = 0; while (axis < 2) { bounds = m_bounds[axis]; lowerIndex = proxy.lowerBounds[axis]; upperIndex = proxy.upperBounds[axis]; lowerValue = newValues.lowerValues[axis]; upperValue = newValues.upperValues[axis]; bound = bounds[lowerIndex]; deltaLower = (lowerValue - bound.value); bound.value = lowerValue; bound = bounds[upperIndex]; deltaUpper = (upperValue - bound.value); bound.value = upperValue; if (deltaLower < 0){ index = lowerIndex; while ((((index > 0)) && ((lowerValue < (bounds[int((index - 1))] as b2Bound).value)))) { bound = bounds[index]; prevBound = bounds[int((index - 1))]; prevProxyId = prevBound.proxyId; prevProxy = m_proxyPool[prevBound.proxyId]; prevBound.stabbingCount++; if (prevBound.IsUpper() == true){ if (TestOverlap(newValues, prevProxy)){ m_pairManager.AddBufferedPair(proxyId, prevProxyId); }; as3arr = prevProxy.upperBounds; as3int = as3arr[axis]; as3int++; as3arr[axis] = as3int; bound.stabbingCount++; } else { as3arr = prevProxy.lowerBounds; as3int = as3arr[axis]; as3int++; as3arr[axis] = as3int; bound.stabbingCount--; }; as3arr = proxy.lowerBounds; as3int = as3arr[axis]; as3int--; as3arr[axis] = as3int; bound.Swap(prevBound); index--; }; }; if (deltaUpper > 0){ index = upperIndex; while ((((index < (boundCount - 1))) && (((bounds[int((index + 1))] as b2Bound).value <= upperValue)))) { bound = bounds[index]; nextBound = bounds[int((index + 1))]; nextProxyId = nextBound.proxyId; nextProxy = m_proxyPool[nextProxyId]; nextBound.stabbingCount++; if (nextBound.IsLower() == true){ if (TestOverlap(newValues, nextProxy)){ m_pairManager.AddBufferedPair(proxyId, nextProxyId); }; as3arr = nextProxy.lowerBounds; as3int = as3arr[axis]; as3int--; as3arr[axis] = as3int; bound.stabbingCount++; } else { as3arr = nextProxy.upperBounds; as3int = as3arr[axis]; as3int--; as3arr[axis] = as3int; bound.stabbingCount--; }; as3arr = proxy.upperBounds; as3int = as3arr[axis]; as3int++; as3arr[axis] = as3int; bound.Swap(nextBound); index++; }; }; if (deltaLower > 0){ index = lowerIndex; while ((((index < (boundCount - 1))) && (((bounds[int((index + 1))] as b2Bound).value <= lowerValue)))) { bound = bounds[index]; nextBound = bounds[int((index + 1))]; nextProxyId = nextBound.proxyId; nextProxy = m_proxyPool[nextProxyId]; nextBound.stabbingCount--; if (nextBound.IsUpper()){ if (TestOverlap(oldValues, nextProxy)){ m_pairManager.RemoveBufferedPair(proxyId, nextProxyId); }; as3arr = nextProxy.upperBounds; as3int = as3arr[axis]; as3int--; as3arr[axis] = as3int; bound.stabbingCount--; } else { as3arr = nextProxy.lowerBounds; as3int = as3arr[axis]; as3int--; as3arr[axis] = as3int; bound.stabbingCount++; }; as3arr = proxy.lowerBounds; as3int = as3arr[axis]; as3int++; as3arr[axis] = as3int; bound.Swap(nextBound); index++; }; }; if (deltaUpper < 0){ index = upperIndex; while ((((index > 0)) && ((upperValue < (bounds[int((index - 1))] as b2Bound).value)))) { bound = bounds[index]; prevBound = bounds[int((index - 1))]; prevProxyId = prevBound.proxyId; prevProxy = m_proxyPool[prevProxyId]; prevBound.stabbingCount--; if (prevBound.IsLower() == true){ if (TestOverlap(oldValues, prevProxy)){ m_pairManager.RemoveBufferedPair(proxyId, prevProxyId); }; as3arr = prevProxy.lowerBounds; as3int = as3arr[axis]; as3int++; as3arr[axis] = as3int; bound.stabbingCount--; } else { as3arr = prevProxy.upperBounds; as3int = as3arr[axis]; as3int++; as3arr[axis] = as3int; bound.stabbingCount++; }; as3arr = proxy.upperBounds; as3int = as3arr[axis]; as3int--; as3arr[axis] = as3int; bound.Swap(prevBound); index--; }; }; axis++; }; } public static function BinarySearch(bounds:Array, count:int, value:uint):uint{ var mid:int; var bound:b2Bound; var low:int; var high:int = (count - 1); while (low <= high) { mid = ((low + high) / 2); bound = bounds[mid]; if (bound.value > value){ high = (mid - 1); } else { if (bound.value < value){ low = (mid + 1); } else { return (uint(mid)); }; }; }; return (uint(low)); } } }//package Box2D.Collision
Section 13
//b2BufferedPair (Box2D.Collision.b2BufferedPair) package Box2D.Collision { public class b2BufferedPair { public var proxyId1:uint; public var proxyId2:uint; public function b2BufferedPair(){ super(); } } }//package Box2D.Collision
Section 14
//b2Collision (Box2D.Collision.b2Collision) package Box2D.Collision { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2Collision { public static const b2_nullFeature:uint = 0xFF; private static var b2CollidePolyTempVec:b2Vec2 = new b2Vec2(); public function b2Collision(){ super(); } public static function EdgeSeparation(poly1:b2PolygonShape, xf1:b2XForm, edge1:int, poly2:b2PolygonShape, xf2:b2XForm):Number{ var tMat:b2Mat22; var tVec:b2Vec2; var dot:Number; var count1:int = poly1.m_vertexCount; var vertices1:Array = poly1.m_vertices; var normals1:Array = poly1.m_normals; var count2:int = poly2.m_vertexCount; var vertices2:Array = poly2.m_vertices; tMat = xf1.R; tVec = normals1[edge1]; var normal1WorldX:Number = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); var normal1WorldY:Number = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); tMat = xf2.R; var normal1X:Number = ((tMat.col1.x * normal1WorldX) + (tMat.col1.y * normal1WorldY)); var normal1Y:Number = ((tMat.col2.x * normal1WorldX) + (tMat.col2.y * normal1WorldY)); var index:int; var minDot:Number = Number.MAX_VALUE; var i:int; while (i < count2) { tVec = vertices2[i]; dot = ((tVec.x * normal1X) + (tVec.y * normal1Y)); if (dot < minDot){ minDot = dot; index = i; }; i++; }; tVec = vertices1[edge1]; tMat = xf1.R; var v1X:Number = (xf1.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var v1Y:Number = (xf1.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); tVec = vertices2[index]; tMat = xf2.R; var v2X:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var v2Y:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); v2X = (v2X - v1X); v2Y = (v2Y - v1Y); var separation:Number = ((v2X * normal1WorldX) + (v2Y * normal1WorldY)); return (separation); } public static function b2TestOverlap(a:b2AABB, b:b2AABB):Boolean{ var t1:b2Vec2 = b.lowerBound; var t2:b2Vec2 = a.upperBound; var d1X:Number = (t1.x - t2.x); var d1Y:Number = (t1.y - t2.y); t1 = a.lowerBound; t2 = b.upperBound; var d2X:Number = (t1.x - t2.x); var d2Y:Number = (t1.y - t2.y); if ((((d1X > 0)) || ((d1Y > 0)))){ return (false); }; if ((((d2X > 0)) || ((d2Y > 0)))){ return (false); }; return (true); } public static function FindIncidentEdge(c:Array, poly1:b2PolygonShape, xf1:b2XForm, edge1:int, poly2:b2PolygonShape, xf2:b2XForm):void{ var tMat:b2Mat22; var tVec:b2Vec2; var tClip:ClipVertex; var dot:Number; var count1:int = poly1.m_vertexCount; var normals1:Array = poly1.m_normals; var count2:int = poly2.m_vertexCount; var vertices2:Array = poly2.m_vertices; var normals2:Array = poly2.m_normals; tMat = xf1.R; tVec = normals1[edge1]; var normal1X:Number = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); var normal1Y:Number = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); tMat = xf2.R; var tX:Number = ((tMat.col1.x * normal1X) + (tMat.col1.y * normal1Y)); normal1Y = ((tMat.col2.x * normal1X) + (tMat.col2.y * normal1Y)); normal1X = tX; var index:int; var minDot:Number = Number.MAX_VALUE; var i:int; while (i < count2) { tVec = normals2[i]; dot = ((normal1X * tVec.x) + (normal1Y * tVec.y)); if (dot < minDot){ minDot = dot; index = i; }; i++; }; var i1:int = index; var i2:int = (((i1 + 1) < count2)) ? (i1 + 1) : 0; tClip = c[0]; tVec = vertices2[i1]; tMat = xf2.R; tClip.v.x = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); tClip.v.y = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); tClip.id.features.referenceEdge = edge1; tClip.id.features.incidentEdge = i1; tClip.id.features.incidentVertex = 0; tClip = c[1]; tVec = vertices2[i2]; tMat = xf2.R; tClip.v.x = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); tClip.v.y = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); tClip.id.features.referenceEdge = edge1; tClip.id.features.incidentEdge = i2; tClip.id.features.incidentVertex = 1; } public static function b2CollidePolygons(manifold:b2Manifold, polyA:b2PolygonShape, xfA:b2XForm, polyB:b2PolygonShape, xfB:b2XForm):void{ var cv:ClipVertex; var poly1:b2PolygonShape; var poly2:b2PolygonShape; var edge1:int; var flip:uint; var np:int; var v12:b2Vec2; var separation:Number; var cp:b2ManifoldPoint; manifold.pointCount = 0; var edgeA:int; var edgeAO:Array = [edgeA]; var separationA:Number = FindMaxSeparation(edgeAO, polyA, xfA, polyB, xfB); edgeA = edgeAO[0]; if (separationA > 0){ return; }; var edgeB:int; var edgeBO:Array = [edgeB]; var separationB:Number = FindMaxSeparation(edgeBO, polyB, xfB, polyA, xfA); edgeB = edgeBO[0]; if (separationB > 0){ return; }; var xf1:b2XForm = new b2XForm(); var xf2:b2XForm = new b2XForm(); var k_relativeTol:Number = 0.98; var k_absoluteTol:Number = 0.001; if (separationB > ((k_relativeTol * separationA) + k_absoluteTol)){ poly1 = polyB; poly2 = polyA; xf1.Set(xfB); xf2.Set(xfA); edge1 = edgeB; flip = 1; } else { poly1 = polyA; poly2 = polyB; xf1.Set(xfA); xf2.Set(xfB); edge1 = edgeA; flip = 0; }; var incidentEdge:Array = [new ClipVertex(), new ClipVertex()]; FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); var count1:int = poly1.m_vertexCount; var vertices1:Array = poly1.m_vertices; var tVec:b2Vec2 = vertices1[edge1]; var v11:b2Vec2 = tVec.Copy(); if ((edge1 + 1) < count1){ tVec = vertices1[int((edge1 + 1))]; v12 = tVec.Copy(); } else { tVec = vertices1[0]; v12 = tVec.Copy(); }; var dv:b2Vec2 = b2Math.SubtractVV(v12, v11); var sideNormal:b2Vec2 = b2Math.b2MulMV(xf1.R, b2Math.SubtractVV(v12, v11)); sideNormal.Normalize(); var frontNormal:b2Vec2 = b2Math.b2CrossVF(sideNormal, 1); v11 = b2Math.b2MulX(xf1, v11); v12 = b2Math.b2MulX(xf1, v12); var frontOffset:Number = b2Math.b2Dot(frontNormal, v11); var sideOffset1:Number = -(b2Math.b2Dot(sideNormal, v11)); var sideOffset2:Number = b2Math.b2Dot(sideNormal, v12); var clipPoints1:Array = [new ClipVertex(), new ClipVertex()]; var clipPoints2:Array = [new ClipVertex(), new ClipVertex()]; np = ClipSegmentToLine(clipPoints1, incidentEdge, sideNormal.Negative(), sideOffset1); if (np < 2){ return; }; np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2); if (np < 2){ return; }; manifold.normal = (flip) ? frontNormal.Negative() : frontNormal.Copy(); var pointCount:int; var i:int; while (i < b2Settings.b2_maxManifoldPoints) { cv = clipPoints2[i]; separation = (b2Math.b2Dot(frontNormal, cv.v) - frontOffset); if (separation <= 0){ cp = manifold.points[pointCount]; cp.separation = separation; cp.localPoint1 = b2Math.b2MulXT(xfA, cv.v); cp.localPoint2 = b2Math.b2MulXT(xfB, cv.v); cp.id.key = cv.id._key; cp.id.features.flip = flip; pointCount++; }; i++; }; manifold.pointCount = pointCount; } public static function FindMaxSeparation(edgeIndex:Array, poly1:b2PolygonShape, xf1:b2XForm, poly2:b2PolygonShape, xf2:b2XForm):Number{ var tVec:b2Vec2; var tMat:b2Mat22; var bestEdge:int; var bestSeparation:Number; var increment:int; var dot:Number; var count1:int = poly1.m_vertexCount; var normals1:Array = poly1.m_normals; tMat = xf2.R; tVec = poly2.m_centroid; var dX:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var dY:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); tMat = xf1.R; tVec = poly1.m_centroid; dX = (dX - (xf1.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)))); dY = (dY - (xf1.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)))); var dLocal1X:Number = ((dX * xf1.R.col1.x) + (dY * xf1.R.col1.y)); var dLocal1Y:Number = ((dX * xf1.R.col2.x) + (dY * xf1.R.col2.y)); var edge:int; var maxDot:Number = -(Number.MAX_VALUE); var i:int; while (i < count1) { tVec = normals1[i]; dot = ((tVec.x * dLocal1X) + (tVec.y * dLocal1Y)); if (dot > maxDot){ maxDot = dot; edge = i; }; i++; }; var s:Number = EdgeSeparation(poly1, xf1, edge, poly2, xf2); if (s > 0){ return (s); }; var prevEdge:int = (((edge - 1) >= 0)) ? (edge - 1) : (count1 - 1); var sPrev:Number = EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2); if (sPrev > 0){ return (sPrev); }; var nextEdge:int = (((edge + 1) < count1)) ? (edge + 1) : 0; var sNext:Number = EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2); if (sNext > 0){ return (sNext); }; if ((((sPrev > s)) && ((sPrev > sNext)))){ increment = -1; bestEdge = prevEdge; bestSeparation = sPrev; } else { if (sNext > s){ increment = 1; bestEdge = nextEdge; bestSeparation = sNext; } else { edgeIndex[0] = edge; return (s); }; }; while (true) { if (increment == -1){ edge = (((bestEdge - 1) >= 0)) ? (bestEdge - 1) : (count1 - 1); } else { edge = (((bestEdge + 1) < count1)) ? (bestEdge + 1) : 0; }; s = EdgeSeparation(poly1, xf1, edge, poly2, xf2); if (s > 0){ return (s); }; if (s > bestSeparation){ bestEdge = edge; bestSeparation = s; } else { break; }; }; edgeIndex[0] = bestEdge; return (bestSeparation); } public static function ClipSegmentToLine(vOut:Array, vIn:Array, normal:b2Vec2, offset:Number):int{ var cv:ClipVertex; var numOut:int; var vIn0:b2Vec2; var vIn1:b2Vec2; var distance0:Number; var interp:Number; var tVec:b2Vec2; var cv2:ClipVertex; numOut = 0; cv = vIn[0]; vIn0 = cv.v; cv = vIn[1]; vIn1 = cv.v; distance0 = (b2Math.b2Dot(normal, vIn0) - offset); var distance1:Number = (b2Math.b2Dot(normal, vIn1) - offset); if (distance0 <= 0){ var _temp1 = numOut; numOut = (numOut + 1); var _local14 = _temp1; vOut[_local14] = vIn[0]; }; if (distance1 <= 0){ var _temp2 = numOut; numOut = (numOut + 1); _local14 = _temp2; vOut[_local14] = vIn[1]; }; if ((distance0 * distance1) < 0){ interp = (distance0 / (distance0 - distance1)); cv = vOut[numOut]; tVec = cv.v; tVec.x = (vIn0.x + (interp * (vIn1.x - vIn0.x))); tVec.y = (vIn0.y + (interp * (vIn1.y - vIn0.y))); cv = vOut[numOut]; if (distance0 > 0){ cv2 = vIn[0]; cv.id = cv2.id; } else { cv2 = vIn[1]; cv.id = cv2.id; }; numOut++; }; return (numOut); } public static function b2CollideCircles(manifold:b2Manifold, circle1:b2CircleShape, xf1:b2XForm, circle2:b2CircleShape, xf2:b2XForm):void{ var tMat:b2Mat22; var tVec:b2Vec2; var separation:Number; var dist:Number; var a:Number; manifold.pointCount = 0; tMat = xf1.R; tVec = circle1.m_localPosition; var p1X:Number = (xf1.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var p1Y:Number = (xf1.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); tMat = xf2.R; tVec = circle2.m_localPosition; var p2X:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var p2Y:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); var dX:Number = (p2X - p1X); var dY:Number = (p2Y - p1Y); var distSqr:Number = ((dX * dX) + (dY * dY)); var r1:Number = circle1.m_radius; var r2:Number = circle2.m_radius; var radiusSum:Number = (r1 + r2); if (distSqr > (radiusSum * radiusSum)){ return; }; if (distSqr < Number.MIN_VALUE){ separation = -(radiusSum); manifold.normal.Set(0, 1); } else { dist = Math.sqrt(distSqr); separation = (dist - radiusSum); a = (1 / dist); manifold.normal.x = (a * dX); manifold.normal.y = (a * dY); }; manifold.pointCount = 1; var tPoint:b2ManifoldPoint = manifold.points[0]; tPoint.id.key = 0; tPoint.separation = separation; p1X = (p1X + (r1 * manifold.normal.x)); p1Y = (p1Y + (r1 * manifold.normal.y)); p2X = (p2X - (r2 * manifold.normal.x)); p2Y = (p2Y - (r2 * manifold.normal.y)); var pX:Number = (0.5 * (p1X + p2X)); var pY:Number = (0.5 * (p1Y + p2Y)); var tX:Number = (pX - xf1.position.x); var tY:Number = (pY - xf1.position.y); tPoint.localPoint1.x = ((tX * xf1.R.col1.x) + (tY * xf1.R.col1.y)); tPoint.localPoint1.y = ((tX * xf1.R.col2.x) + (tY * xf1.R.col2.y)); tX = (pX - xf2.position.x); tY = (pY - xf2.position.y); tPoint.localPoint2.x = ((tX * xf2.R.col1.x) + (tY * xf2.R.col1.y)); tPoint.localPoint2.y = ((tX * xf2.R.col2.x) + (tY * xf2.R.col2.y)); } public static function b2CollidePolygonAndCircle(manifold:b2Manifold, polygon:b2PolygonShape, xf1:b2XForm, circle:b2CircleShape, xf2:b2XForm):void{ var tPoint:b2ManifoldPoint; var dX:Number; var dY:Number; var positionX:Number; var positionY:Number; var tVec:b2Vec2; var tMat:b2Mat22; var dist:Number; var pX:Number; var pY:Number; var s:Number; manifold.pointCount = 0; tMat = xf2.R; tVec = circle.m_localPosition; var cX:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var cY:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); dX = (cX - xf1.position.x); dY = (cY - xf1.position.y); tMat = xf1.R; var cLocalX:Number = ((dX * tMat.col1.x) + (dY * tMat.col1.y)); var cLocalY:Number = ((dX * tMat.col2.x) + (dY * tMat.col2.y)); var normalIndex:int; var separation:Number = -(Number.MAX_VALUE); var radius:Number = circle.m_radius; var vertexCount:int = polygon.m_vertexCount; var vertices:Array = polygon.m_vertices; var normals:Array = polygon.m_normals; var i:int; while (i < vertexCount) { tVec = vertices[i]; dX = (cLocalX - tVec.x); dY = (cLocalY - tVec.y); tVec = normals[i]; s = ((tVec.x * dX) + (tVec.y * dY)); if (s > radius){ return; }; if (s > separation){ separation = s; normalIndex = i; }; i++; }; if (separation < Number.MIN_VALUE){ manifold.pointCount = 1; tVec = normals[normalIndex]; tMat = xf1.R; manifold.normal.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); manifold.normal.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); tPoint = manifold.points[0]; tPoint.id.features.incidentEdge = normalIndex; tPoint.id.features.incidentVertex = b2_nullFeature; tPoint.id.features.referenceEdge = 0; tPoint.id.features.flip = 0; positionX = (cX - (radius * manifold.normal.x)); positionY = (cY - (radius * manifold.normal.y)); dX = (positionX - xf1.position.x); dY = (positionY - xf1.position.y); tMat = xf1.R; tPoint.localPoint1.x = ((dX * tMat.col1.x) + (dY * tMat.col1.y)); tPoint.localPoint1.y = ((dX * tMat.col2.x) + (dY * tMat.col2.y)); dX = (positionX - xf2.position.x); dY = (positionY - xf2.position.y); tMat = xf2.R; tPoint.localPoint2.x = ((dX * tMat.col1.x) + (dY * tMat.col1.y)); tPoint.localPoint2.y = ((dX * tMat.col2.x) + (dY * tMat.col2.y)); tPoint.separation = (separation - radius); return; }; var vertIndex1:int = normalIndex; var vertIndex2:int = (((vertIndex1 + 1) < vertexCount)) ? (vertIndex1 + 1) : 0; tVec = vertices[vertIndex1]; var tVec2:b2Vec2 = vertices[vertIndex2]; var eX:Number = (tVec2.x - tVec.x); var eY:Number = (tVec2.y - tVec.y); var length:Number = Math.sqrt(((eX * eX) + (eY * eY))); eX = (eX / length); eY = (eY / length); dX = (cLocalX - tVec.x); dY = (cLocalY - tVec.y); var u:Number = ((dX * eX) + (dY * eY)); tPoint = manifold.points[0]; if (u <= 0){ pX = tVec.x; pY = tVec.y; tPoint.id.features.incidentEdge = b2_nullFeature; tPoint.id.features.incidentVertex = vertIndex1; } else { if (u >= length){ pX = tVec2.x; pY = tVec2.y; tPoint.id.features.incidentEdge = b2_nullFeature; tPoint.id.features.incidentVertex = vertIndex2; } else { pX = ((eX * u) + tVec.x); pY = ((eY * u) + tVec.y); tPoint.id.features.incidentEdge = normalIndex; tPoint.id.features.incidentVertex = 0; }; }; dX = (cLocalX - pX); dY = (cLocalY - pY); dist = Math.sqrt(((dX * dX) + (dY * dY))); dX = (dX / dist); dY = (dY / dist); if (dist > radius){ return; }; manifold.pointCount = 1; tMat = xf1.R; manifold.normal.x = ((tMat.col1.x * dX) + (tMat.col2.x * dY)); manifold.normal.y = ((tMat.col1.y * dX) + (tMat.col2.y * dY)); positionX = (cX - (radius * manifold.normal.x)); positionY = (cY - (radius * manifold.normal.y)); dX = (positionX - xf1.position.x); dY = (positionY - xf1.position.y); tMat = xf1.R; tPoint.localPoint1.x = ((dX * tMat.col1.x) + (dY * tMat.col1.y)); tPoint.localPoint1.y = ((dX * tMat.col2.x) + (dY * tMat.col2.y)); dX = (positionX - xf2.position.x); dY = (positionY - xf2.position.y); tMat = xf2.R; tPoint.localPoint2.x = ((dX * tMat.col1.x) + (dY * tMat.col1.y)); tPoint.localPoint2.y = ((dX * tMat.col2.x) + (dY * tMat.col2.y)); tPoint.separation = (dist - radius); tPoint.id.features.referenceEdge = 0; tPoint.id.features.flip = 0; } } }//package Box2D.Collision
Section 15
//b2ContactID (Box2D.Collision.b2ContactID) package Box2D.Collision { public class b2ContactID { public var _key:uint; public var features:Features; public function b2ContactID(){ features = new Features(); super(); features._m_id = this; } public function Set(id:b2ContactID):void{ key = id._key; } public function Copy():b2ContactID{ var id:b2ContactID = new b2ContactID(); id.key = key; return (id); } public function set key(value:uint):void{ _key = value; features._referenceEdge = (_key & 0xFF); features._incidentEdge = (((_key & 0xFF00) >> 8) & 0xFF); features._incidentVertex = (((_key & 0xFF0000) >> 16) & 0xFF); features._flip = (((_key & 4278190080) >> 24) & 0xFF); } public function get key():uint{ return (_key); } } }//package Box2D.Collision
Section 16
//b2ContactPoint (Box2D.Collision.b2ContactPoint) package Box2D.Collision { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class b2ContactPoint { public var friction:Number; public var separation:Number; public var normal:b2Vec2; public var position:b2Vec2; public var restitution:Number; public var shape1:b2Shape; public var shape2:b2Shape; public var id:b2ContactID; public var velocity:b2Vec2; public function b2ContactPoint(){ position = new b2Vec2(); velocity = new b2Vec2(); normal = new b2Vec2(); id = new b2ContactID(); super(); } } }//package Box2D.Collision
Section 17
//b2Distance (Box2D.Collision.b2Distance) package Box2D.Collision { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2Distance { private static var s_p2s:Array = [new b2Vec2(), new b2Vec2(), new b2Vec2()]; private static var s_p1s:Array = [new b2Vec2(), new b2Vec2(), new b2Vec2()]; private static var s_points:Array = [new b2Vec2(), new b2Vec2(), new b2Vec2()]; private static var gPoint:b2Point = new b2Point(); public static var g_GJK_Iterations:int = 0; public function b2Distance(){ super(); } public static function InPoints(w:b2Vec2, points:Array, pointCount:int):Boolean{ var points_i:b2Vec2; var dX:Number; var dY:Number; var mX:Number; var mY:Number; var k_tolerance:Number = (100 * Number.MIN_VALUE); var i:int; while (i < pointCount) { points_i = points[i]; dX = Math.abs((w.x - points_i.x)); dY = Math.abs((w.y - points_i.y)); mX = Math.max(Math.abs(w.x), Math.abs(points_i.x)); mY = Math.max(Math.abs(w.y), Math.abs(points_i.y)); if ((((dX < (k_tolerance * (mX + 1)))) && ((dY < (k_tolerance * (mY + 1)))))){ return (true); }; i++; }; return (false); } public static function DistanceGeneric(x1:b2Vec2, x2:b2Vec2, shape1, xf1:b2XForm, shape2, xf2:b2XForm):Number{ var tVec:b2Vec2; var vX:Number; var vY:Number; var w1:b2Vec2; var w2:b2Vec2; var wX:Number; var wY:Number; var vw:Number; var maxSqr:Number; var i:int; var p1s:Array = s_p1s; var p2s:Array = s_p2s; var points:Array = s_points; var pointCount:int; x1.SetV(shape1.GetFirstVertex(xf1)); x2.SetV(shape2.GetFirstVertex(xf2)); var vSqr:Number = 0; var maxIterations = 20; var iter:int; while (iter < maxIterations) { vX = (x2.x - x1.x); vY = (x2.y - x1.y); w1 = shape1.Support(xf1, vX, vY); w2 = shape2.Support(xf2, -(vX), -(vY)); vSqr = ((vX * vX) + (vY * vY)); wX = (w2.x - w1.x); wY = (w2.y - w1.y); vw = ((vX * wX) + (vY * wY)); if ((vSqr - ((vX * wX) + (vY * wY))) <= (0.01 * vSqr)){ if (pointCount == 0){ x1.SetV(w1); x2.SetV(w2); }; g_GJK_Iterations = iter; return (Math.sqrt(vSqr)); }; switch (pointCount){ case 0: tVec = p1s[0]; tVec.SetV(w1); tVec = p2s[0]; tVec.SetV(w2); tVec = points[0]; tVec.x = wX; tVec.y = wY; x1.SetV(p1s[0]); x2.SetV(p2s[0]); pointCount++; break; case 1: tVec = p1s[1]; tVec.SetV(w1); tVec = p2s[1]; tVec.SetV(w2); tVec = points[1]; tVec.x = wX; tVec.y = wY; pointCount = ProcessTwo(x1, x2, p1s, p2s, points); break; case 2: tVec = p1s[2]; tVec.SetV(w1); tVec = p2s[2]; tVec.SetV(w2); tVec = points[2]; tVec.x = wX; tVec.y = wY; pointCount = ProcessThree(x1, x2, p1s, p2s, points); break; }; if (pointCount == 3){ g_GJK_Iterations = iter; return (0); }; maxSqr = -(Number.MAX_VALUE); i = 0; while (i < pointCount) { tVec = points[i]; maxSqr = b2Math.b2Max(maxSqr, ((tVec.x * tVec.x) + (tVec.y * tVec.y))); i++; }; if ((((pointCount == 3)) || ((vSqr <= ((100 * Number.MIN_VALUE) * maxSqr))))){ g_GJK_Iterations = iter; vX = (x2.x - x1.x); vY = (x2.y - x1.y); vSqr = ((vX * vX) + (vY * vY)); return (Math.sqrt(vSqr)); }; iter++; }; g_GJK_Iterations = maxIterations; return (Math.sqrt(vSqr)); } public static function DistanceCC(x1:b2Vec2, x2:b2Vec2, circle1:b2CircleShape, xf1:b2XForm, circle2:b2CircleShape, xf2:b2XForm):Number{ var tMat:b2Mat22; var tVec:b2Vec2; var dLen:Number; var distance:Number; tMat = xf1.R; tVec = circle1.m_localPosition; var p1X:Number = (xf1.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var p1Y:Number = (xf1.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); tMat = xf2.R; tVec = circle2.m_localPosition; var p2X:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); var p2Y:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); var dX:Number = (p2X - p1X); var dY:Number = (p2Y - p1Y); var dSqr:Number = ((dX * dX) + (dY * dY)); var r1:Number = (circle1.m_radius - b2Settings.b2_toiSlop); var r2:Number = (circle2.m_radius - b2Settings.b2_toiSlop); var r:Number = (r1 + r2); if (dSqr > (r * r)){ dLen = Math.sqrt(((dX * dX) + (dY * dY))); dX = (dX / dLen); dY = (dY / dLen); distance = (dLen - r); x1.x = (p1X + (r1 * dX)); x1.y = (p1Y + (r1 * dY)); x2.x = (p2X - (r2 * dX)); x2.y = (p2Y - (r2 * dY)); return (distance); }; if (dSqr > (Number.MIN_VALUE * Number.MIN_VALUE)){ dLen = Math.sqrt(((dX * dX) + (dY * dY))); dX = (dX / dLen); dY = (dY / dLen); x1.x = (p1X + (r1 * dX)); x1.y = (p1Y + (r1 * dY)); x2.x = x1.x; x2.y = x1.y; return (0); }; x1.x = p1X; x1.y = p1Y; x2.x = x1.x; x2.y = x1.y; return (0); } public static function ProcessThree(x1:b2Vec2, x2:b2Vec2, p1s:Array, p2s:Array, points:Array):int{ var points_0:b2Vec2; var points_1:b2Vec2; var points_2:b2Vec2; var p1s_0:b2Vec2; var p1s_1:b2Vec2; var p1s_2:b2Vec2; var p2s_0:b2Vec2; var p2s_1:b2Vec2; var lambda:Number; points_0 = points[0]; points_1 = points[1]; points_2 = points[2]; p1s_0 = p1s[0]; p1s_1 = p1s[1]; p1s_2 = p1s[2]; p2s_0 = p2s[0]; p2s_1 = p2s[1]; var p2s_2:b2Vec2 = p2s[2]; var aX:Number = points_0.x; var aY:Number = points_0.y; var bX:Number = points_1.x; var bY:Number = points_1.y; var cX:Number = points_2.x; var cY:Number = points_2.y; var abX:Number = (bX - aX); var abY:Number = (bY - aY); var acX:Number = (cX - aX); var acY:Number = (cY - aY); var bcX:Number = (cX - bX); var bcY:Number = (cY - bY); var sn:Number = -(((aX * abX) + (aY * abY))); var sd:Number = ((bX * abX) + (bY * abY)); var tn:Number = -(((aX * acX) + (aY * acY))); var td:Number = ((cX * acX) + (cY * acY)); var un:Number = -(((bX * bcX) + (bY * bcY))); var ud:Number = ((cX * bcX) + (cY * bcY)); if ((((td <= 0)) && ((ud <= 0)))){ x1.SetV(p1s_2); x2.SetV(p2s_2); p1s_0.SetV(p1s_2); p2s_0.SetV(p2s_2); points_0.SetV(points_2); return (1); }; var n:Number = ((abX * acY) - (abY * acX)); var vc:Number = (n * ((aX * bY) - (aY * bX))); var va:Number = (n * ((bX * cY) - (bY * cX))); if ((((((((va <= 0)) && ((un >= 0)))) && ((ud >= 0)))) && (((un + ud) > 0)))){ lambda = (un / (un + ud)); x1.x = (p1s_1.x + (lambda * (p1s_2.x - p1s_1.x))); x1.y = (p1s_1.y + (lambda * (p1s_2.y - p1s_1.y))); x2.x = (p2s_1.x + (lambda * (p2s_2.x - p2s_1.x))); x2.y = (p2s_1.y + (lambda * (p2s_2.y - p2s_1.y))); p1s_0.SetV(p1s_2); p2s_0.SetV(p2s_2); points_0.SetV(points_2); return (2); }; var vb:Number = (n * ((cX * aY) - (cY * aX))); if ((((((((vb <= 0)) && ((tn >= 0)))) && ((td >= 0)))) && (((tn + td) > 0)))){ lambda = (tn / (tn + td)); x1.x = (p1s_0.x + (lambda * (p1s_2.x - p1s_0.x))); x1.y = (p1s_0.y + (lambda * (p1s_2.y - p1s_0.y))); x2.x = (p2s_0.x + (lambda * (p2s_2.x - p2s_0.x))); x2.y = (p2s_0.y + (lambda * (p2s_2.y - p2s_0.y))); p1s_1.SetV(p1s_2); p2s_1.SetV(p2s_2); points_1.SetV(points_2); return (2); }; var denom:Number = ((va + vb) + vc); denom = (1 / denom); var u:Number = (va * denom); var v:Number = (vb * denom); var w:Number = ((1 - u) - v); x1.x = (((u * p1s_0.x) + (v * p1s_1.x)) + (w * p1s_2.x)); x1.y = (((u * p1s_0.y) + (v * p1s_1.y)) + (w * p1s_2.y)); x2.x = (((u * p2s_0.x) + (v * p2s_1.x)) + (w * p2s_2.x)); x2.y = (((u * p2s_0.y) + (v * p2s_1.y)) + (w * p2s_2.y)); return (3); } public static function DistancePC(x1:b2Vec2, x2:b2Vec2, polygon:b2PolygonShape, xf1:b2XForm, circle:b2CircleShape, xf2:b2XForm):Number{ var tMat:b2Mat22; var tVec:b2Vec2; var dX:Number; var dY:Number; var dLen:Number; var point:b2Point = gPoint; tVec = circle.m_localPosition; tMat = xf2.R; point.p.x = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); point.p.y = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); var distance:Number = DistanceGeneric(x1, x2, polygon, xf1, point, b2Math.b2XForm_identity); var r:Number = (circle.m_radius - b2Settings.b2_toiSlop); if (distance > r){ distance = (distance - r); dX = (x2.x - x1.x); dY = (x2.y - x1.y); dLen = Math.sqrt(((dX * dX) + (dY * dY))); dX = (dX / dLen); dY = (dY / dLen); x2.x = (x2.x - (r * dX)); x2.y = (x2.y - (r * dY)); } else { distance = 0; x2.x = x1.x; x2.y = x1.y; }; return (distance); } public static function Distance(x1:b2Vec2, x2:b2Vec2, shape1:b2Shape, xf1:b2XForm, shape2:b2Shape, xf2:b2XForm):Number{ var type1:int = shape1.m_type; var type2:int = shape2.m_type; if ((((type1 == b2Shape.e_circleShape)) && ((type2 == b2Shape.e_circleShape)))){ return (DistanceCC(x1, x2, (shape1 as b2CircleShape), xf1, (shape2 as b2CircleShape), xf2)); }; if ((((type1 == b2Shape.e_polygonShape)) && ((type2 == b2Shape.e_circleShape)))){ return (DistancePC(x1, x2, (shape1 as b2PolygonShape), xf1, (shape2 as b2CircleShape), xf2)); }; if ((((type1 == b2Shape.e_circleShape)) && ((type2 == b2Shape.e_polygonShape)))){ return (DistancePC(x2, x1, (shape2 as b2PolygonShape), xf2, (shape1 as b2CircleShape), xf1)); }; if ((((type1 == b2Shape.e_polygonShape)) && ((type2 == b2Shape.e_polygonShape)))){ return (DistanceGeneric(x1, x2, (shape1 as b2PolygonShape), xf1, (shape2 as b2PolygonShape), xf2)); }; return (0); } public static function ProcessTwo(x1:b2Vec2, x2:b2Vec2, p1s:Array, p2s:Array, points:Array):int{ var p1s_1:b2Vec2; var p2s_0:b2Vec2; var p2s_1:b2Vec2; var lambda:Number; var points_0:b2Vec2 = points[0]; var points_1:b2Vec2 = points[1]; var p1s_0:b2Vec2 = p1s[0]; p1s_1 = p1s[1]; p2s_0 = p2s[0]; p2s_1 = p2s[1]; var rX:Number = -(points_1.x); var rY:Number = -(points_1.y); var dX:Number = (points_0.x - points_1.x); var dY:Number = (points_0.y - points_1.y); var length:Number = Math.sqrt(((dX * dX) + (dY * dY))); dX = (dX / length); dY = (dY / length); lambda = ((rX * dX) + (rY * dY)); if ((((lambda <= 0)) || ((length < Number.MIN_VALUE)))){ x1.SetV(p1s_1); x2.SetV(p2s_1); p1s_0.SetV(p1s_1); p2s_0.SetV(p2s_1); points_0.SetV(points_1); return (1); }; lambda = (lambda / length); x1.x = (p1s_1.x + (lambda * (p1s_0.x - p1s_1.x))); x1.y = (p1s_1.y + (lambda * (p1s_0.y - p1s_1.y))); x2.x = (p2s_1.x + (lambda * (p2s_0.x - p2s_1.x))); x2.y = (p2s_1.y + (lambda * (p2s_0.y - p2s_1.y))); return (2); } } }//package Box2D.Collision
Section 18
//b2Manifold (Box2D.Collision.b2Manifold) package Box2D.Collision { import Box2D.Common.Math.*; import Box2D.Common.*; public class b2Manifold { public var pointCount:int;// = 0 public var normal:b2Vec2; public var points:Array; public function b2Manifold(){ super(); points = new Array(b2Settings.b2_maxManifoldPoints); var i:int; while (i < b2Settings.b2_maxManifoldPoints) { points[i] = new b2ManifoldPoint(); i++; }; normal = new b2Vec2(); } public function Set(m:b2Manifold):void{ pointCount = m.pointCount; var i:int; while (i < b2Settings.b2_maxManifoldPoints) { (points[i] as b2ManifoldPoint).Set(m.points[i]); i++; }; normal.SetV(m.normal); } public function Reset():void{ var i:int; while (i < b2Settings.b2_maxManifoldPoints) { (points[i] as b2ManifoldPoint).Reset(); i++; }; normal.SetZero(); pointCount = 0; } } }//package Box2D.Collision
Section 19
//b2ManifoldPoint (Box2D.Collision.b2ManifoldPoint) package Box2D.Collision { import Box2D.Common.Math.*; public class b2ManifoldPoint { public var separation:Number; public var localPoint2:b2Vec2; public var normalImpulse:Number; public var tangentImpulse:Number; public var localPoint1:b2Vec2; public var id:b2ContactID; public function b2ManifoldPoint(){ localPoint1 = new b2Vec2(); localPoint2 = new b2Vec2(); id = new b2ContactID(); super(); } public function Set(m:b2ManifoldPoint):void{ localPoint1.SetV(m.localPoint1); localPoint2.SetV(m.localPoint2); separation = m.separation; normalImpulse = m.normalImpulse; tangentImpulse = m.tangentImpulse; id.key = m.id.key; } public function Reset():void{ localPoint1.SetZero(); localPoint2.SetZero(); separation = 0; normalImpulse = 0; tangentImpulse = 0; id.key = 0; } } }//package Box2D.Collision
Section 20
//b2OBB (Box2D.Collision.b2OBB) package Box2D.Collision { import Box2D.Common.Math.*; public class b2OBB { public var R:b2Mat22; public var center:b2Vec2; public var extents:b2Vec2; public function b2OBB(){ R = new b2Mat22(); center = new b2Vec2(); extents = new b2Vec2(); super(); } } }//package Box2D.Collision
Section 21
//b2Pair (Box2D.Collision.b2Pair) package Box2D.Collision { public class b2Pair { public var proxyId1:uint; public var userData;// = null public var proxyId2:uint; public var status:uint; public var next:uint; public static var e_pairFinal:uint = 4; public static var b2_tableMask:int = (b2_tableCapacity - 1); public static var e_pairRemoved:uint = 2; public static var b2_nullPair:uint = 0xFFFF; public static var e_pairBuffered:uint = 1; public static var b2_nullProxy:uint = 0xFFFF; public static var b2_tableCapacity:int = 4096; public function b2Pair(){ super(); } public function SetBuffered():void{ status = (status | e_pairBuffered); } public function IsBuffered():Boolean{ return (((status & e_pairBuffered) == e_pairBuffered)); } public function IsFinal():Boolean{ return (((status & e_pairFinal) == e_pairFinal)); } public function ClearRemoved():void{ status = (status & ~(e_pairRemoved)); } public function SetFinal():void{ status = (status | e_pairFinal); } public function IsRemoved():Boolean{ return (((status & e_pairRemoved) == e_pairRemoved)); } public function ClearBuffered():void{ status = (status & ~(e_pairBuffered)); } public function SetRemoved():void{ status = (status | e_pairRemoved); } } }//package Box2D.Collision
Section 22
//b2PairCallback (Box2D.Collision.b2PairCallback) package Box2D.Collision { public class b2PairCallback { public function b2PairCallback(){ super(); } public function PairRemoved(proxyUserData1, proxyUserData2, pairUserData):void{ } public function PairAdded(proxyUserData1, proxyUserData2){ return (null); } } }//package Box2D.Collision
Section 23
//b2PairManager (Box2D.Collision.b2PairManager) package Box2D.Collision { import Box2D.Common.Math.*; import Box2D.Common.*; public class b2PairManager { public var m_pairCount:int; public var m_pairBuffer:Array; public var m_hashTable:Array; public var m_callback:b2PairCallback; public var m_pairs:Array; public var m_pairBufferCount:int; public var m_broadPhase:b2BroadPhase; public var m_freePair:uint; public function b2PairManager(){ var i:uint; super(); m_hashTable = new Array(b2Pair.b2_tableCapacity); i = 0; while (i < b2Pair.b2_tableCapacity) { m_hashTable[i] = b2Pair.b2_nullPair; i++; }; m_pairs = new Array(b2Settings.b2_maxPairs); i = 0; while (i < b2Settings.b2_maxPairs) { m_pairs[i] = new b2Pair(); i++; }; m_pairBuffer = new Array(b2Settings.b2_maxPairs); i = 0; while (i < b2Settings.b2_maxPairs) { m_pairBuffer[i] = new b2BufferedPair(); i++; }; i = 0; while (i < b2Settings.b2_maxPairs) { m_pairs[i].proxyId1 = b2Pair.b2_nullProxy; m_pairs[i].proxyId2 = b2Pair.b2_nullProxy; m_pairs[i].userData = null; m_pairs[i].status = 0; m_pairs[i].next = (i + 1); i++; }; m_pairs[int((b2Settings.b2_maxPairs - 1))].next = b2Pair.b2_nullPair; m_pairCount = 0; m_pairBufferCount = 0; } private function FindHash(proxyId1:uint, proxyId2:uint, hash:uint):b2Pair{ var pair:b2Pair; var index:uint = m_hashTable[hash]; pair = m_pairs[index]; while (((!((index == b2Pair.b2_nullPair))) && ((Equals(pair, proxyId1, proxyId2) == false)))) { index = pair.next; pair = m_pairs[index]; }; if (index == b2Pair.b2_nullPair){ return (null); }; return (pair); } private function Find(proxyId1:uint, proxyId2:uint):b2Pair{ var temp:uint; if (proxyId1 > proxyId2){ temp = proxyId1; proxyId1 = proxyId2; proxyId2 = temp; }; var hash:uint = (Hash(proxyId1, proxyId2) & b2Pair.b2_tableMask); return (FindHash(proxyId1, proxyId2, hash)); } private function ValidateBuffer():void{ } public function Commit():void{ var bufferedPair:b2BufferedPair; var i:int; var pair:b2Pair; var proxy1:b2Proxy; var proxy2:b2Proxy; var removeCount:int; var proxies:Array = m_broadPhase.m_proxyPool; i = 0; while (i < m_pairBufferCount) { bufferedPair = m_pairBuffer[i]; pair = Find(bufferedPair.proxyId1, bufferedPair.proxyId2); pair.ClearBuffered(); proxy1 = proxies[pair.proxyId1]; proxy2 = proxies[pair.proxyId2]; if (pair.IsRemoved()){ if (pair.IsFinal() == true){ m_callback.PairRemoved(proxy1.userData, proxy2.userData, pair.userData); }; bufferedPair = m_pairBuffer[removeCount]; bufferedPair.proxyId1 = pair.proxyId1; bufferedPair.proxyId2 = pair.proxyId2; removeCount++; } else { if (pair.IsFinal() == false){ pair.userData = m_callback.PairAdded(proxy1.userData, proxy2.userData); pair.SetFinal(); }; }; i++; }; i = 0; while (i < removeCount) { bufferedPair = m_pairBuffer[i]; RemovePair(bufferedPair.proxyId1, bufferedPair.proxyId2); i++; }; m_pairBufferCount = 0; if (b2BroadPhase.s_validate){ ValidateTable(); }; } public function RemoveBufferedPair(proxyId1:int, proxyId2:int):void{ var bufferedPair:b2BufferedPair; var pair:b2Pair = Find(proxyId1, proxyId2); if (pair == null){ return; }; if (pair.IsBuffered() == false){ pair.SetBuffered(); bufferedPair = m_pairBuffer[m_pairBufferCount]; bufferedPair.proxyId1 = pair.proxyId1; bufferedPair.proxyId2 = pair.proxyId2; m_pairBufferCount++; }; pair.SetRemoved(); if (b2BroadPhase.s_validate){ ValidateBuffer(); }; } private function RemovePair(proxyId1:uint, proxyId2:uint){ var pair:b2Pair; var temp:uint; var index:uint; var userData:*; if (proxyId1 > proxyId2){ temp = proxyId1; proxyId1 = proxyId2; proxyId2 = temp; }; var hash:uint = (Hash(proxyId1, proxyId2) & b2Pair.b2_tableMask); var node:uint = m_hashTable[hash]; var pNode:b2Pair; while (node != b2Pair.b2_nullPair) { if (Equals(m_pairs[node], proxyId1, proxyId2)){ index = node; pair = m_pairs[node]; if (pNode){ pNode.next = pair.next; } else { m_hashTable[hash] = pair.next; }; pair = m_pairs[index]; userData = pair.userData; pair.next = m_freePair; pair.proxyId1 = b2Pair.b2_nullProxy; pair.proxyId2 = b2Pair.b2_nullProxy; pair.userData = null; pair.status = 0; m_freePair = index; m_pairCount--; return (userData); } else { pNode = m_pairs[node]; node = pNode.next; }; }; return (null); } public function Initialize(broadPhase:b2BroadPhase, callback:b2PairCallback):void{ m_broadPhase = broadPhase; m_callback = callback; } public function AddBufferedPair(proxyId1:int, proxyId2:int):void{ var bufferedPair:b2BufferedPair; var pair:b2Pair = AddPair(proxyId1, proxyId2); if (pair.IsBuffered() == false){ pair.SetBuffered(); bufferedPair = m_pairBuffer[m_pairBufferCount]; bufferedPair.proxyId1 = pair.proxyId1; bufferedPair.proxyId2 = pair.proxyId2; m_pairBufferCount++; }; pair.ClearRemoved(); if (b2BroadPhase.s_validate){ ValidateBuffer(); }; } private function AddPair(proxyId1:uint, proxyId2:uint):b2Pair{ var temp:uint; if (proxyId1 > proxyId2){ temp = proxyId1; proxyId1 = proxyId2; proxyId2 = temp; }; var hash:uint = (Hash(proxyId1, proxyId2) & b2Pair.b2_tableMask); var pair = FindHash(proxyId1, proxyId2, hash); if (pair != null){ return (pair); }; var pIndex:uint = m_freePair; pair = m_pairs[pIndex]; m_freePair = pair.next; pair.proxyId1 = proxyId1; pair.proxyId2 = proxyId2; pair.status = 0; pair.userData = null; pair.next = m_hashTable[hash]; m_hashTable[hash] = pIndex; m_pairCount++; return (pair); } private function ValidateTable():void{ } public static function EqualsPair(pair1:b2BufferedPair, pair2:b2BufferedPair):Boolean{ return ((((pair1.proxyId1 == pair2.proxyId1)) && ((pair1.proxyId2 == pair2.proxyId2)))); } public static function Hash(proxyId1:uint, proxyId2:uint):uint{ var key:uint = (((proxyId2 << 16) & 4294901760) | proxyId1); key = (~(key) + ((key << 15) & 4294934528)); key = (key ^ ((key >> 12) & 1048575)); key = (key + ((key << 2) & 4294967292)); key = (key ^ ((key >> 4) & 268435455)); key = (key * 2057); key = (key ^ ((key >> 16) & 0xFFFF)); return (key); } public static function Equals(pair:b2Pair, proxyId1:uint, proxyId2:uint):Boolean{ return ((((pair.proxyId1 == proxyId1)) && ((pair.proxyId2 == proxyId2)))); } } }//package Box2D.Collision
Section 24
//b2Point (Box2D.Collision.b2Point) package Box2D.Collision { import Box2D.Common.Math.*; public class b2Point { public var p:b2Vec2; public function b2Point(){ p = new b2Vec2(); super(); } public function GetFirstVertex(xf:b2XForm):b2Vec2{ return (p); } public function Support(xf:b2XForm, vX:Number, vY:Number):b2Vec2{ return (p); } } }//package Box2D.Collision
Section 25
//b2Proxy (Box2D.Collision.b2Proxy) package Box2D.Collision { public class b2Proxy { public var overlapCount:uint; public var userData;// = null public var lowerBounds:Array; public var upperBounds:Array; public var timeStamp:uint; public function b2Proxy(){ lowerBounds = [uint(0), uint(0)]; upperBounds = [uint(0), uint(0)]; super(); } public function GetNext():uint{ return (lowerBounds[0]); } public function IsValid():Boolean{ return (!((overlapCount == b2BroadPhase.b2_invalid))); } public function SetNext(next:uint):void{ lowerBounds[0] = (next & 0xFFFF); } } }//package Box2D.Collision
Section 26
//b2Segment (Box2D.Collision.b2Segment) package Box2D.Collision { import Box2D.Common.Math.*; public class b2Segment { public var p1:b2Vec2; public var p2:b2Vec2; public function b2Segment(){ p1 = new b2Vec2(); p2 = new b2Vec2(); super(); } public function TestSegment(lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):Boolean{ var bX:Number; var bY:Number; var a:Number; var mu2:Number; var nLen:Number; var s:b2Vec2 = segment.p1; var rX:Number = (segment.p2.x - s.x); var rY:Number = (segment.p2.y - s.y); var dX:Number = (p2.x - p1.x); var dY:Number = (p2.y - p1.y); var nX:Number = dY; var nY:Number = -(dX); var k_slop:Number = (100 * Number.MIN_VALUE); var denom:Number = -(((rX * nX) + (rY * nY))); if (denom > k_slop){ bX = (s.x - p1.x); bY = (s.y - p1.y); a = ((bX * nX) + (bY * nY)); if ((((0 <= a)) && ((a <= (maxLambda * denom))))){ mu2 = ((-(rY) * bY) + (rY * bX)); if (((((-(k_slop) * denom) <= mu2)) && ((mu2 <= (denom * (1 + k_slop)))))){ a = (a / denom); nLen = Math.sqrt(((nX * nX) + (nY * nY))); nX = (nX / nLen); nY = (nY / nLen); lambda[0] = a; normal.Set(nX, nY); return (true); }; }; }; return (false); } public function Extend(aabb:b2AABB):void{ ExtendForward(aabb); ExtendBackward(aabb); } public function ExtendForward(aabb:b2AABB):void{ var aabb = aabb; var dX:Number = (p2.x - p1.x); var dY:Number = (p2.y - p1.y); var greaterthan0:* = function (t){ return ((t > 0)); }; var lambda:Number = Math.min(((dX > 0)) ? ((aabb.upperBound.x - p1.x) / dX) : ((dX < 0)) ? ((aabb.lowerBound.x - p1.x) / dX) : Number.POSITIVE_INFINITY, ((dY > 0)) ? ((aabb.upperBound.y - p1.y) / dY) : ((dY < 0)) ? ((aabb.lowerBound.y - p1.y) / dY) : Number.POSITIVE_INFINITY); p2.x = (p1.x + (dX * lambda)); p2.y = (p1.y + (dY * lambda)); } public function ExtendBackward(aabb:b2AABB):void{ var dY:Number; var lambda:Number; var aabb = aabb; var dX:Number = (-(p2.x) + p1.x); dY = (-(p2.y) + p1.y); var greaterthan0:* = function (t){ return ((t > 0)); }; lambda = Math.min(((dX > 0)) ? ((aabb.upperBound.x - p2.x) / dX) : ((dX < 0)) ? ((aabb.lowerBound.x - p2.x) / dX) : Number.POSITIVE_INFINITY, ((dY > 0)) ? ((aabb.upperBound.y - p2.y) / dY) : ((dY < 0)) ? ((aabb.lowerBound.y - p2.y) / dY) : Number.POSITIVE_INFINITY); p1.x = (p2.x + (dX * lambda)); p1.y = (p2.y + (dY * lambda)); } } }//package Box2D.Collision
Section 27
//b2TimeOfImpact (Box2D.Collision.b2TimeOfImpact) package Box2D.Collision { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2TimeOfImpact { public static var s_xf1:b2XForm = new b2XForm(); public static var s_xf2:b2XForm = new b2XForm(); public static var s_p1:b2Vec2 = new b2Vec2(); public static var s_p2:b2Vec2 = new b2Vec2(); public function b2TimeOfImpact(){ super(); } public static function TimeOfImpact(shape1:b2Shape, sweep1:b2Sweep, shape2:b2Shape, sweep2:b2Sweep):Number{ var math1:Number; var math2:Number; var t:Number; var xf1:b2XForm; var xf2:b2XForm; var nLen:Number; var approachVelocityBound:Number; var dAlpha:Number; var newAlpha:Number; var r1:Number = shape1.m_sweepRadius; var r2:Number = shape2.m_sweepRadius; var t0:Number = sweep1.t0; var v1X:Number = (sweep1.c.x - sweep1.c0.x); var v1Y:Number = (sweep1.c.y - sweep1.c0.y); var v2X:Number = (sweep2.c.x - sweep2.c0.x); var v2Y:Number = (sweep2.c.y - sweep2.c0.y); var omega1:Number = (sweep1.a - sweep1.a0); var omega2:Number = (sweep2.a - sweep2.a0); var alpha:Number = 0; var p1:b2Vec2 = s_p1; var p2:b2Vec2 = s_p2; var k_maxIterations = 20; var iter:int; var normalX:Number = 0; var normalY:Number = 0; var distance:Number = 0; var targetDistance:Number = 0; while (true) { t = (((1 - alpha) * t0) + alpha); xf1 = s_xf1; xf2 = s_xf2; sweep1.GetXForm(xf1, t); sweep2.GetXForm(xf2, t); distance = b2Distance.Distance(p1, p2, shape1, xf1, shape2, xf2); if (iter == 0){ if (distance > (2 * b2Settings.b2_toiSlop)){ targetDistance = (1.5 * b2Settings.b2_toiSlop); } else { math1 = (0.05 * b2Settings.b2_toiSlop); math2 = (distance - (0.5 * b2Settings.b2_toiSlop)); targetDistance = ((math1 > math2)) ? math1 : math2; }; }; if (((((distance - targetDistance) < (0.05 * b2Settings.b2_toiSlop))) || ((iter == k_maxIterations)))){ break; }; normalX = (p2.x - p1.x); normalY = (p2.y - p1.y); nLen = Math.sqrt(((normalX * normalX) + (normalY * normalY))); normalX = (normalX / nLen); normalY = (normalY / nLen); approachVelocityBound = ((((normalX * (v1X - v2X)) + (normalY * (v1Y - v2Y))) + (((omega1 < 0)) ? -(omega1) : omega1 * r1)) + (((omega2 < 0)) ? -(omega2) : omega2 * r2)); if (approachVelocityBound == 0){ alpha = 1; break; }; dAlpha = ((distance - targetDistance) / approachVelocityBound); newAlpha = (alpha + dAlpha); if ((((newAlpha < 0)) || ((1 < newAlpha)))){ alpha = 1; break; }; if (newAlpha < ((1 + (100 * Number.MIN_VALUE)) * alpha)){ break; }; alpha = newAlpha; iter++; }; return (alpha); } } }//package Box2D.Collision
Section 28
//ClipVertex (Box2D.Collision.ClipVertex) package Box2D.Collision { import Box2D.Common.Math.*; public class ClipVertex { public var id:b2ContactID; public var v:b2Vec2; public function ClipVertex(){ v = new b2Vec2(); id = new b2ContactID(); super(); } } }//package Box2D.Collision
Section 29
//Features (Box2D.Collision.Features) package Box2D.Collision { public class Features { public var _referenceEdge:int; public var _incidentEdge:int; public var _flip:int; public var _incidentVertex:int; public var _m_id:b2ContactID; public function Features(){ super(); } public function get referenceEdge():int{ return (_referenceEdge); } public function set incidentVertex(value:int):void{ _incidentVertex = value; _m_id._key = ((_m_id._key & 4278255615) | ((_incidentVertex << 16) & 0xFF0000)); } public function get flip():int{ return (_flip); } public function get incidentEdge():int{ return (_incidentEdge); } public function set referenceEdge(value:int):void{ _referenceEdge = value; _m_id._key = ((_m_id._key & 4294967040) | (_referenceEdge & 0xFF)); } public function get incidentVertex():int{ return (_incidentVertex); } public function set flip(value:int):void{ _flip = value; _m_id._key = ((_m_id._key & 0xFFFFFF) | ((_flip << 24) & 4278190080)); } public function set incidentEdge(value:int):void{ _incidentEdge = value; _m_id._key = ((_m_id._key & 4294902015) | ((_incidentEdge << 8) & 0xFF00)); } } }//package Box2D.Collision
Section 30
//b2Mat22 (Box2D.Common.Math.b2Mat22) package Box2D.Common.Math { public class b2Mat22 { public var col1:b2Vec2; public var col2:b2Vec2; public function b2Mat22(angle:Number=0, c1:b2Vec2=null, c2:b2Vec2=null){ var c:Number; var s:Number; col1 = new b2Vec2(); col2 = new b2Vec2(); super(); if (((!((c1 == null))) && (!((c2 == null))))){ col1.SetV(c1); col2.SetV(c2); } else { c = Math.cos(angle); s = Math.sin(angle); col1.x = c; col2.x = -(s); col1.y = s; col2.y = c; }; } public function SetIdentity():void{ col1.x = 1; col2.x = 0; col1.y = 0; col2.y = 1; } public function SetVV(c1:b2Vec2, c2:b2Vec2):void{ col1.SetV(c1); col2.SetV(c2); } public function Set(angle:Number):void{ var c:Number; c = Math.cos(angle); var s:Number = Math.sin(angle); col1.x = c; col2.x = -(s); col1.y = s; col2.y = c; } public function SetZero():void{ col1.x = 0; col2.x = 0; col1.y = 0; col2.y = 0; } public function SetM(m:b2Mat22):void{ col1.SetV(m.col1); col2.SetV(m.col2); } public function AddM(m:b2Mat22):void{ col1.x = (col1.x + m.col1.x); col1.y = (col1.y + m.col1.y); col2.x = (col2.x + m.col2.x); col2.y = (col2.y + m.col2.y); } public function Abs():void{ col1.Abs(); col2.Abs(); } public function Copy():b2Mat22{ return (new b2Mat22(0, col1, col2)); } public function Invert(out:b2Mat22):b2Mat22{ var a:Number; var c:Number; var det:Number; a = col1.x; var b:Number = col2.x; c = col1.y; var d:Number = col2.y; det = ((a * d) - (b * c)); det = (1 / det); out.col1.x = (det * d); out.col2.x = (-(det) * b); out.col1.y = (-(det) * c); out.col2.y = (det * a); return (out); } public function GetAngle():Number{ return (Math.atan2(col1.y, col1.x)); } public function Solve(out:b2Vec2, bX:Number, bY:Number):b2Vec2{ var a11:Number = col1.x; var a12:Number = col2.x; var a21:Number = col1.y; var a22:Number = col2.y; var det:Number = ((a11 * a22) - (a12 * a21)); det = (1 / det); out.x = (det * ((a22 * bX) - (a12 * bY))); out.y = (det * ((a11 * bY) - (a21 * bX))); return (out); } } }//package Box2D.Common.Math
Section 31
//b2Math (Box2D.Common.Math.b2Math) package Box2D.Common.Math { public class b2Math { public static const b2Mat22_identity:b2Mat22 = new b2Mat22(0, new b2Vec2(1, 0), new b2Vec2(0, 1)); public static const b2XForm_identity:b2XForm = new b2XForm(b2Vec2_zero, b2Mat22_identity); public static const b2Vec2_zero:b2Vec2 = new b2Vec2(0, 0); public function b2Math(){ super(); } public static function b2CrossVF(a:b2Vec2, s:Number):b2Vec2{ var v:b2Vec2 = new b2Vec2((s * a.y), (-(s) * a.x)); return (v); } public static function AddVV(a:b2Vec2, b:b2Vec2):b2Vec2{ var v:b2Vec2 = new b2Vec2((a.x + b.x), (a.y + b.y)); return (v); } public static function b2IsValid(x:Number):Boolean{ return (isFinite(x)); } public static function b2MinV(a:b2Vec2, b:b2Vec2):b2Vec2{ var c:b2Vec2 = new b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y)); return (c); } public static function b2MulX(T:b2XForm, v:b2Vec2):b2Vec2{ var a:b2Vec2; a = b2MulMV(T.R, v); a.x = (a.x + T.position.x); a.y = (a.y + T.position.y); return (a); } public static function b2DistanceSquared(a:b2Vec2, b:b2Vec2):Number{ var cX:Number = (a.x - b.x); var cY:Number = (a.y - b.y); return (((cX * cX) + (cY * cY))); } public static function b2Swap(a:Array, b:Array):void{ var tmp:* = a[0]; a[0] = b[0]; b[0] = tmp; } public static function b2AbsM(A:b2Mat22):b2Mat22{ var B:b2Mat22 = new b2Mat22(0, b2AbsV(A.col1), b2AbsV(A.col2)); return (B); } public static function SubtractVV(a:b2Vec2, b:b2Vec2):b2Vec2{ var v:b2Vec2 = new b2Vec2((a.x - b.x), (a.y - b.y)); return (v); } public static function b2MulXT(T:b2XForm, v:b2Vec2):b2Vec2{ var a:b2Vec2; var tX:Number; a = SubtractVV(v, T.position); tX = ((a.x * T.R.col1.x) + (a.y * T.R.col1.y)); a.y = ((a.x * T.R.col2.x) + (a.y * T.R.col2.y)); a.x = tX; return (a); } public static function b2Abs(a:Number):Number{ return (((a > 0)) ? a : -(a)); } public static function b2Clamp(a:Number, low:Number, high:Number):Number{ return (b2Max(low, b2Min(a, high))); } public static function b2AbsV(a:b2Vec2):b2Vec2{ var b:b2Vec2 = new b2Vec2(b2Abs(a.x), b2Abs(a.y)); return (b); } public static function MulFV(s:Number, a:b2Vec2):b2Vec2{ var v:b2Vec2 = new b2Vec2((s * a.x), (s * a.y)); return (v); } public static function b2CrossVV(a:b2Vec2, b:b2Vec2):Number{ return (((a.x * b.y) - (a.y * b.x))); } public static function b2Dot(a:b2Vec2, b:b2Vec2):Number{ return (((a.x * b.x) + (a.y * b.y))); } public static function b2CrossFV(s:Number, a:b2Vec2):b2Vec2{ var v:b2Vec2 = new b2Vec2((-(s) * a.y), (s * a.x)); return (v); } public static function AddMM(A:b2Mat22, B:b2Mat22):b2Mat22{ var C:b2Mat22 = new b2Mat22(0, AddVV(A.col1, B.col1), AddVV(A.col2, B.col2)); return (C); } public static function b2Distance(a:b2Vec2, b:b2Vec2):Number{ var cX:Number = (a.x - b.x); var cY:Number = (a.y - b.y); return (Math.sqrt(((cX * cX) + (cY * cY)))); } public static function b2MulTMM(A:b2Mat22, B:b2Mat22):b2Mat22{ var c1:b2Vec2 = new b2Vec2(b2Dot(A.col1, B.col1), b2Dot(A.col2, B.col1)); var c2:b2Vec2 = new b2Vec2(b2Dot(A.col1, B.col2), b2Dot(A.col2, B.col2)); var C:b2Mat22 = new b2Mat22(0, c1, c2); return (C); } public static function b2MaxV(a:b2Vec2, b:b2Vec2):b2Vec2{ var c:b2Vec2 = new b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y)); return (c); } public static function b2IsPowerOfTwo(x:uint):Boolean{ var result:Boolean = (((x > 0)) && (((x & (x - 1)) == 0))); return (result); } public static function b2ClampV(a:b2Vec2, low:b2Vec2, high:b2Vec2):b2Vec2{ return (b2MaxV(low, b2MinV(a, high))); } public static function b2RandomRange(lo:Number, hi:Number):Number{ var r:Number = Math.random(); r = (((hi - lo) * r) + lo); return (r); } public static function b2MulTMV(A:b2Mat22, v:b2Vec2):b2Vec2{ var u:b2Vec2 = new b2Vec2(b2Dot(v, A.col1), b2Dot(v, A.col2)); return (u); } public static function b2Min(a:Number, b:Number):Number{ return (((a < b)) ? a : b); } public static function b2Random():Number{ return (((Math.random() * 2) - 1)); } public static function b2MulMM(A:b2Mat22, B:b2Mat22):b2Mat22{ var C:b2Mat22 = new b2Mat22(0, b2MulMV(A, B.col1), b2MulMV(A, B.col2)); return (C); } public static function b2NextPowerOfTwo(x:uint):uint{ x = (x | ((x >> 1) & 2147483647)); x = (x | ((x >> 2) & 1073741823)); x = (x | ((x >> 4) & 268435455)); x = (x | ((x >> 8) & 0xFFFFFF)); x = (x | ((x >> 16) & 0xFFFF)); return ((x + 1)); } public static function b2Max(a:Number, b:Number):Number{ return (((a > b)) ? a : b); } public static function b2MulMV(A:b2Mat22, v:b2Vec2):b2Vec2{ var u:b2Vec2 = new b2Vec2(((A.col1.x * v.x) + (A.col2.x * v.y)), ((A.col1.y * v.x) + (A.col2.y * v.y))); return (u); } } }//package Box2D.Common.Math
Section 32
//b2Sweep (Box2D.Common.Math.b2Sweep) package Box2D.Common.Math { public class b2Sweep { public var localCenter:b2Vec2; public var a:Number; public var c:b2Vec2; public var a0:Number; public var c0:b2Vec2; public var t0:Number; public function b2Sweep(){ localCenter = new b2Vec2(); c0 = new b2Vec2(); c = new b2Vec2(); super(); } public function Advance(t:Number):void{ var alpha:Number; if ((((t0 < t)) && (((1 - t0) > Number.MIN_VALUE)))){ alpha = ((t - t0) / (1 - t0)); c0.x = (((1 - alpha) * c0.x) + (alpha * c.x)); c0.y = (((1 - alpha) * c0.y) + (alpha * c.y)); a0 = (((1 - alpha) * a0) + (alpha * a)); t0 = t; }; } public function GetXForm(xf:b2XForm, t:Number):void{ var alpha:Number; var angle:Number; if ((1 - t0) > Number.MIN_VALUE){ alpha = ((t - t0) / (1 - t0)); xf.position.x = (((1 - alpha) * c0.x) + (alpha * c.x)); xf.position.y = (((1 - alpha) * c0.y) + (alpha * c.y)); angle = (((1 - alpha) * a0) + (alpha * a)); xf.R.Set(angle); } else { xf.position.SetV(c); xf.R.Set(a); }; var tMat:b2Mat22 = xf.R; xf.position.x = (xf.position.x - ((tMat.col1.x * localCenter.x) + (tMat.col2.x * localCenter.y))); xf.position.y = (xf.position.y - ((tMat.col1.y * localCenter.x) + (tMat.col2.y * localCenter.y))); } } }//package Box2D.Common.Math
Section 33
//b2Vec2 (Box2D.Common.Math.b2Vec2) package Box2D.Common.Math { public class b2Vec2 { public var y:Number; public var x:Number; public function b2Vec2(x_:Number=0, y_:Number=0):void{ super(); x = x_; y = y_; } public function Add(v:b2Vec2):void{ x = (x + v.x); y = (y + v.y); } public function Set(x_:Number=0, y_:Number=0):void{ x = x_; y = y_; } public function Multiply(a:Number):void{ x = (x * a); y = (y * a); } public function Length():Number{ return (Math.sqrt(((x * x) + (y * y)))); } public function LengthSquared():Number{ return (((x * x) + (y * y))); } public function MulM(A:b2Mat22):void{ var tX:Number = x; x = ((A.col1.x * tX) + (A.col2.x * y)); y = ((A.col1.y * tX) + (A.col2.y * y)); } public function SetZero():void{ x = 0; y = 0; } public function MinV(b:b2Vec2):void{ x = ((x < b.x)) ? x : b.x; y = ((y < b.y)) ? y : b.y; } public function Normalize():Number{ var length:Number = Math.sqrt(((x * x) + (y * y))); if (length < Number.MIN_VALUE){ return (0); }; var invLength:Number = (1 / length); x = (x * invLength); y = (y * invLength); return (length); } public function CrossVF(s:Number):void{ var tX:Number = x; x = (s * y); y = (-(s) * tX); } public function MaxV(b:b2Vec2):void{ x = ((x > b.x)) ? x : b.x; y = ((y > b.y)) ? y : b.y; } public function SetV(v:b2Vec2):void{ x = v.x; y = v.y; } public function Negative():b2Vec2{ return (new b2Vec2(-(x), -(y))); } public function CrossFV(s:Number):void{ var tX:Number = x; x = (-(s) * y); y = (s * tX); } public function Abs():void{ if (x < 0){ x = -(x); }; if (y < 0){ y = -(y); }; } public function Subtract(v:b2Vec2):void{ x = (x - v.x); y = (y - v.y); } public function Copy():b2Vec2{ return (new b2Vec2(x, y)); } public function MulTM(A:b2Mat22):void{ var tX:Number = b2Math.b2Dot(this, A.col1); y = b2Math.b2Dot(this, A.col2); x = tX; } public function IsValid():Boolean{ return (((b2Math.b2IsValid(x)) && (b2Math.b2IsValid(y)))); } public static function Make(x_:Number, y_:Number):b2Vec2{ return (new b2Vec2(x_, y_)); } } }//package Box2D.Common.Math
Section 34
//b2XForm (Box2D.Common.Math.b2XForm) package Box2D.Common.Math { public class b2XForm { public var position:b2Vec2; public var R:b2Mat22; public function b2XForm(pos:b2Vec2=null, r:b2Mat22=null):void{ position = new b2Vec2(); R = new b2Mat22(); super(); if (pos){ position.SetV(pos); R.SetM(r); }; } public function Initialize(pos:b2Vec2, r:b2Mat22):void{ position.SetV(pos); R.SetM(r); } public function Set(x:b2XForm):void{ position.SetV(x.position); R.SetM(x.R); } public function SetIdentity():void{ position.SetZero(); R.SetIdentity(); } } }//package Box2D.Common.Math
Section 35
//b2Color (Box2D.Common.b2Color) package Box2D.Common { import Box2D.Common.Math.*; public class b2Color { private var _r:uint;// = 0 private var _g:uint;// = 0 private var _b:uint;// = 0 public function b2Color(rr:Number, gg:Number, bb:Number){ super(); _r = uint((0xFF * b2Math.b2Clamp(rr, 0, 1))); _g = uint((0xFF * b2Math.b2Clamp(gg, 0, 1))); _b = uint((0xFF * b2Math.b2Clamp(bb, 0, 1))); } public function Set(rr:Number, gg:Number, bb:Number):void{ _r = uint((0xFF * b2Math.b2Clamp(rr, 0, 1))); _g = uint((0xFF * b2Math.b2Clamp(gg, 0, 1))); _b = uint((0xFF * b2Math.b2Clamp(bb, 0, 1))); } public function set b(bb:Number):void{ _b = uint((0xFF * b2Math.b2Clamp(bb, 0, 1))); } public function get color():uint{ return (((_r | (_g << 8)) | (_b << 16))); } public function set r(rr:Number):void{ _r = uint((0xFF * b2Math.b2Clamp(rr, 0, 1))); } public function set g(gg:Number):void{ _g = uint((0xFF * b2Math.b2Clamp(gg, 0, 1))); } } }//package Box2D.Common
Section 36
//b2Settings (Box2D.Common.b2Settings) package Box2D.Common { import Box2D.Common.Math.*; public class b2Settings { public static const b2_angularSleepTolerance:Number = 0.0111111111111111; public static const b2_linearSleepTolerance:Number = 0.01; public static const b2_angularSlop:Number = 0.0349065850398866; public static const b2_linearSlop:Number = 0.005; public static const b2_pi:Number = 3.14159265358979; public static const b2_maxProxies:int = 0x0200; public static const b2_maxAngularVelocitySquared:Number = 62500; public static const b2_maxPolygonVertices:int = 8; public static const b2_velocityThreshold:Number = 1; public static const b2_contactBaumgarte:Number = 0.2; public static const b2_maxPairs:int = 4096; public static const b2_maxTOIContactsPerIsland:int = 32; public static const b2_timeToSleep:Number = 0.5; public static const b2_maxManifoldPoints:int = 2; public static const b2_maxAngularVelocity:Number = 250; public static const b2_maxAngularCorrection:Number = 0.139626340159546; public static const USHRT_MAX:int = 0xFFFF; public static const b2_maxLinearVelocity:Number = 200; public static const b2_maxLinearCorrection:Number = 0.2; public static const b2_toiSlop:Number = 0.04; public static const b2_maxLinearVelocitySquared:Number = 40000; public function b2Settings(){ super(); } public static function b2Assert(a:Boolean):void{ var nullVec:b2Vec2; if (!a){ nullVec.x++; }; } } }//package Box2D.Common
Section 37
//b2CircleContact (Box2D.Dynamics.Contacts.b2CircleContact) package Box2D.Dynamics.Contacts { import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class b2CircleContact extends b2Contact { private var m_manifolds:Array; public var m_manifold:b2Manifold; private var m0:b2Manifold; private static const s_evalCP:b2ContactPoint = new b2ContactPoint(); public function b2CircleContact(shape1:b2Shape, shape2:b2Shape){ m_manifolds = [new b2Manifold()]; m0 = new b2Manifold(); super(shape1, shape2); m_manifold = m_manifolds[0]; m_manifold.pointCount = 0; var point:b2ManifoldPoint = m_manifold.points[0]; point.normalImpulse = 0; point.tangentImpulse = 0; } override public function Evaluate(listener:b2ContactListener):void{ var v1:b2Vec2; var v2:b2Vec2; var mp0:b2ManifoldPoint; var mp:b2ManifoldPoint; var b1:b2Body = m_shape1.m_body; var b2:b2Body = m_shape2.m_body; m0.Set(m_manifold); b2Collision.b2CollideCircles(m_manifold, (m_shape1 as b2CircleShape), b1.m_xf, (m_shape2 as b2CircleShape), b2.m_xf); var cp:b2ContactPoint = s_evalCP; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.friction = m_friction; cp.restitution = m_restitution; if (m_manifold.pointCount > 0){ m_manifoldCount = 1; mp = m_manifold.points[0]; if (m0.pointCount == 0){ mp.normalImpulse = 0; mp.tangentImpulse = 0; if (listener){ cp.position = b1.GetWorldPoint(mp.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m_manifold.normal); cp.separation = mp.separation; cp.id.key = mp.id._key; listener.Add(cp); }; } else { mp0 = m0.points[0]; mp.normalImpulse = mp0.normalImpulse; mp.tangentImpulse = mp0.tangentImpulse; if (listener){ cp.position = b1.GetWorldPoint(mp.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m_manifold.normal); cp.separation = mp.separation; cp.id.key = mp.id._key; listener.Persist(cp); }; }; } else { m_manifoldCount = 0; if ((((m0.pointCount > 0)) && (listener))){ mp0 = m0.points[0]; cp.position = b1.GetWorldPoint(mp0.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp0.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp0.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m0.normal); cp.separation = mp0.separation; cp.id.key = mp0.id._key; listener.Remove(cp); }; }; } override public function GetManifolds():Array{ return (m_manifolds); } public static function Destroy(contact:b2Contact, allocator):void{ } public static function Create(shape1:b2Shape, shape2:b2Shape, allocator):b2Contact{ return (new b2CircleContact(shape1, shape2)); } } }//package Box2D.Dynamics.Contacts
Section 38
//b2Contact (Box2D.Dynamics.Contacts.b2Contact) package Box2D.Dynamics.Contacts { import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Common.*; public class b2Contact { public var m_shape1:b2Shape; public var m_shape2:b2Shape; public var m_prev:b2Contact; public var m_toi:Number; public var m_next:b2Contact; public var m_friction:Number; public var m_manifoldCount:int; public var m_node1:b2ContactEdge; public var m_node2:b2ContactEdge; public var m_restitution:Number; public var m_flags:uint; public static var e_toiFlag:uint = 8; public static var e_nonSolidFlag:uint = 1; public static var e_slowFlag:uint = 2; public static var e_islandFlag:uint = 4; public static var s_registers:Array; public static var s_initialized:Boolean = false; public function b2Contact(s1:b2Shape=null, s2:b2Shape=null){ m_node1 = new b2ContactEdge(); m_node2 = new b2ContactEdge(); super(); m_flags = 0; if (((!(s1)) || (!(s2)))){ m_shape1 = null; m_shape2 = null; return; }; if (((s1.IsSensor()) || (s2.IsSensor()))){ m_flags = (m_flags | e_nonSolidFlag); }; m_shape1 = s1; m_shape2 = s2; m_manifoldCount = 0; m_friction = Math.sqrt((m_shape1.m_friction * m_shape2.m_friction)); m_restitution = b2Math.b2Max(m_shape1.m_restitution, m_shape2.m_restitution); m_prev = null; m_next = null; m_node1.contact = null; m_node1.prev = null; m_node1.next = null; m_node1.other = null; m_node2.contact = null; m_node2.prev = null; m_node2.next = null; m_node2.other = null; } public function IsSolid():Boolean{ return (((m_flags & e_nonSolidFlag) == 0)); } public function GetShape1():b2Shape{ return (m_shape1); } public function GetShape2():b2Shape{ return (m_shape2); } public function GetNext():b2Contact{ return (m_next); } public function GetManifoldCount():int{ return (m_manifoldCount); } public function GetManifolds():Array{ return (null); } public function Update(listener:b2ContactListener):void{ var oldCount:int = m_manifoldCount; Evaluate(listener); var newCount:int = m_manifoldCount; var body1:b2Body = m_shape1.m_body; var body2:b2Body = m_shape2.m_body; if ((((newCount == 0)) && ((oldCount > 0)))){ body1.WakeUp(); body2.WakeUp(); }; if (((((((body1.IsStatic()) || (body1.IsBullet()))) || (body2.IsStatic()))) || (body2.IsBullet()))){ m_flags = (m_flags & ~(e_slowFlag)); } else { m_flags = (m_flags | e_slowFlag); }; } public function Evaluate(listener:b2ContactListener):void{ } public static function InitializeRegisters():void{ var j:int; s_registers = new Array(b2Shape.e_shapeTypeCount); var i:int; while (i < b2Shape.e_shapeTypeCount) { s_registers[i] = new Array(b2Shape.e_shapeTypeCount); j = 0; while (j < b2Shape.e_shapeTypeCount) { s_registers[i][j] = new b2ContactRegister(); j++; }; i++; }; AddType(b2CircleContact.Create, b2CircleContact.Destroy, b2Shape.e_circleShape, b2Shape.e_circleShape); AddType(b2PolyAndCircleContact.Create, b2PolyAndCircleContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_circleShape); AddType(b2PolygonContact.Create, b2PolygonContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_polygonShape); } public static function Destroy(contact:b2Contact, allocator):void{ if (contact.m_manifoldCount > 0){ contact.m_shape1.m_body.WakeUp(); contact.m_shape2.m_body.WakeUp(); }; var type1:int = contact.m_shape1.m_type; var type2:int = contact.m_shape2.m_type; var reg:b2ContactRegister = s_registers[type1][type2]; var destroyFcn:Function = reg.destroyFcn; destroyFcn(contact, allocator); } public static function AddType(createFcn:Function, destroyFcn:Function, type1:int, type2:int):void{ s_registers[type1][type2].createFcn = createFcn; s_registers[type1][type2].destroyFcn = destroyFcn; s_registers[type1][type2].primary = true; if (type1 != type2){ s_registers[type2][type1].createFcn = createFcn; s_registers[type2][type1].destroyFcn = destroyFcn; s_registers[type2][type1].primary = false; }; } public static function Create(shape1:b2Shape, shape2:b2Shape, allocator):b2Contact{ var c:b2Contact; var i:int; var m:b2Manifold; if (s_initialized == false){ InitializeRegisters(); s_initialized = true; }; var type1:int = shape1.m_type; var type2:int = shape2.m_type; var reg:b2ContactRegister = s_registers[type1][type2]; var createFcn:Function = reg.createFcn; if (createFcn != null){ if (reg.primary){ return (createFcn(shape1, shape2, allocator)); }; c = createFcn(shape2, shape1, allocator); i = 0; while (i < c.m_manifoldCount) { m = c.GetManifolds()[i]; m.normal = m.normal.Negative(); i++; }; return (c); //unresolved jump }; return (null); } } }//package Box2D.Dynamics.Contacts
Section 39
//b2ContactConstraint (Box2D.Dynamics.Contacts.b2ContactConstraint) package Box2D.Dynamics.Contacts { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Common.*; public class b2ContactConstraint { public var points:Array; public var normal:b2Vec2; public var restitution:Number; public var body1:b2Body; public var manifold:b2Manifold; public var body2:b2Body; public var friction:Number; public var pointCount:int; public function b2ContactConstraint(){ normal = new b2Vec2(); super(); points = new Array(b2Settings.b2_maxManifoldPoints); var i:int; while (i < b2Settings.b2_maxManifoldPoints) { points[i] = new b2ContactConstraintPoint(); i++; }; } } }//package Box2D.Dynamics.Contacts
Section 40
//b2ContactConstraintPoint (Box2D.Dynamics.Contacts.b2ContactConstraintPoint) package Box2D.Dynamics.Contacts { import Box2D.Common.Math.*; public class b2ContactConstraintPoint { public var r2:b2Vec2; public var separation:Number; public var positionImpulse:Number; public var normalImpulse:Number; public var tangentMass:Number; public var equalizedMass:Number; public var tangentImpulse:Number; public var localAnchor1:b2Vec2; public var localAnchor2:b2Vec2; public var normalMass:Number; public var velocityBias:Number; public var r1:b2Vec2; public function b2ContactConstraintPoint(){ localAnchor1 = new b2Vec2(); localAnchor2 = new b2Vec2(); r1 = new b2Vec2(); r2 = new b2Vec2(); super(); } } }//package Box2D.Dynamics.Contacts
Section 41
//b2ContactEdge (Box2D.Dynamics.Contacts.b2ContactEdge) package Box2D.Dynamics.Contacts { import Box2D.Dynamics.*; public class b2ContactEdge { public var other:b2Body; public var prev:b2ContactEdge; public var contact:b2Contact; public var next:b2ContactEdge; public function b2ContactEdge(){ super(); } } }//package Box2D.Dynamics.Contacts
Section 42
//b2ContactRegister (Box2D.Dynamics.Contacts.b2ContactRegister) package Box2D.Dynamics.Contacts { public class b2ContactRegister { public var primary:Boolean; public var createFcn:Function; public var destroyFcn:Function; public function b2ContactRegister(){ super(); } } }//package Box2D.Dynamics.Contacts
Section 43
//b2ContactResult (Box2D.Dynamics.Contacts.b2ContactResult) package Box2D.Dynamics.Contacts { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class b2ContactResult { public var position:b2Vec2; public var shape1:b2Shape; public var shape2:b2Shape; public var normalImpulse:Number; public var normal:b2Vec2; public var tangentImpulse:Number; public var id:b2ContactID; public function b2ContactResult(){ position = new b2Vec2(); normal = new b2Vec2(); id = new b2ContactID(); super(); } } }//package Box2D.Dynamics.Contacts
Section 44
//b2ContactSolver (Box2D.Dynamics.Contacts.b2ContactSolver) package Box2D.Dynamics.Contacts { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Common.*; public class b2ContactSolver { public var m_constraintCount:int; public var m_constraints:Array; public var m_allocator; public var m_step:b2TimeStep; public function b2ContactSolver(step:b2TimeStep, contacts:Array, contactCount:int, allocator){ var contact:b2Contact; var i:int; var tVec:b2Vec2; var tMat:b2Mat22; var b1:b2Body; var b2:b2Body; var manifoldCount:int; var manifolds:Array; var friction:Number; var restitution:Number; var v1X:Number; var v1Y:Number; var v2X:Number; var v2Y:Number; var w1:Number; var w2:Number; var j:int; var manifold:b2Manifold; var normalX:Number; var normalY:Number; var c:b2ContactConstraint; var k:uint; var cp:b2ManifoldPoint; var ccp:b2ContactConstraintPoint; var tX:Number; var tY:Number; var r1X:Number; var r1Y:Number; var r2X:Number; var r2Y:Number; var r1Sqr:Number; var r2Sqr:Number; var rn1:Number; var rn2:Number; var kNormal:Number; var kEqualized:Number; var tangentX:Number; var tangentY:Number; var rt1:Number; var rt2:Number; var kTangent:Number; var vRel:Number; m_step = new b2TimeStep(); m_constraints = new Array(); super(); m_step.dt = step.dt; m_step.inv_dt = step.inv_dt; m_step.maxIterations = step.maxIterations; m_allocator = allocator; m_constraintCount = 0; i = 0; while (i < contactCount) { contact = contacts[i]; m_constraintCount = (m_constraintCount + contact.m_manifoldCount); i++; }; i = 0; while (i < m_constraintCount) { m_constraints[i] = new b2ContactConstraint(); i++; }; var count:int; i = 0; while (i < contactCount) { contact = contacts[i]; b1 = contact.m_shape1.m_body; b2 = contact.m_shape2.m_body; manifoldCount = contact.m_manifoldCount; manifolds = contact.GetManifolds(); friction = contact.m_friction; restitution = contact.m_restitution; v1X = b1.m_linearVelocity.x; v1Y = b1.m_linearVelocity.y; v2X = b2.m_linearVelocity.x; v2Y = b2.m_linearVelocity.y; w1 = b1.m_angularVelocity; w2 = b2.m_angularVelocity; j = 0; while (j < manifoldCount) { manifold = manifolds[j]; normalX = manifold.normal.x; normalY = manifold.normal.y; c = m_constraints[count]; c.body1 = b1; c.body2 = b2; c.manifold = manifold; c.normal.x = normalX; c.normal.y = normalY; c.pointCount = manifold.pointCount; c.friction = friction; c.restitution = restitution; k = 0; while (k < c.pointCount) { cp = manifold.points[k]; ccp = c.points[k]; ccp.normalImpulse = cp.normalImpulse; ccp.tangentImpulse = cp.tangentImpulse; ccp.separation = cp.separation; ccp.positionImpulse = 0; ccp.localAnchor1.SetV(cp.localPoint1); ccp.localAnchor2.SetV(cp.localPoint2); tMat = b1.m_xf.R; r1X = (cp.localPoint1.x - b1.m_sweep.localCenter.x); r1Y = (cp.localPoint1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; ccp.r1.Set(r1X, r1Y); tMat = b2.m_xf.R; r2X = (cp.localPoint2.x - b2.m_sweep.localCenter.x); r2Y = (cp.localPoint2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; ccp.r2.Set(r2X, r2Y); r1Sqr = ((r1X * r1X) + (r1Y * r1Y)); r2Sqr = ((r2X * r2X) + (r2Y * r2Y)); rn1 = ((r1X * normalX) + (r1Y * normalY)); rn2 = ((r2X * normalX) + (r2Y * normalY)); kNormal = (b1.m_invMass + b2.m_invMass); kNormal = (kNormal + ((b1.m_invI * (r1Sqr - (rn1 * rn1))) + (b2.m_invI * (r2Sqr - (rn2 * rn2))))); ccp.normalMass = (1 / kNormal); kEqualized = ((b1.m_mass * b1.m_invMass) + (b2.m_mass * b2.m_invMass)); kEqualized = (kEqualized + (((b1.m_mass * b1.m_invI) * (r1Sqr - (rn1 * rn1))) + ((b2.m_mass * b2.m_invI) * (r2Sqr - (rn2 * rn2))))); ccp.equalizedMass = (1 / kEqualized); tangentX = normalY; tangentY = -(normalX); rt1 = ((r1X * tangentX) + (r1Y * tangentY)); rt2 = ((r2X * tangentX) + (r2Y * tangentY)); kTangent = (b1.m_invMass + b2.m_invMass); kTangent = (kTangent + ((b1.m_invI * (r1Sqr - (rt1 * rt1))) + (b2.m_invI * (r2Sqr - (rt2 * rt2))))); ccp.tangentMass = (1 / kTangent); ccp.velocityBias = 0; if (ccp.separation > 0){ ccp.velocityBias = (-60 * ccp.separation); }; tX = (((v2X + (-(w2) * r2Y)) - v1X) - (-(w1) * r1Y)); tY = (((v2Y + (w2 * r2X)) - v1Y) - (w1 * r1X)); vRel = ((c.normal.x * tX) + (c.normal.y * tY)); if (vRel < -(b2Settings.b2_velocityThreshold)){ ccp.velocityBias = (ccp.velocityBias + (-(c.restitution) * vRel)); }; k++; }; count++; j++; }; i++; }; } public function InitVelocityConstraints(step:b2TimeStep):void{ var tVec:b2Vec2; var tVec2:b2Vec2; var tMat:b2Mat22; var c:b2ContactConstraint; var b1:b2Body; var b2:b2Body; var invMass1:Number; var invI1:Number; var invMass2:Number; var invI2:Number; var normalX:Number; var normalY:Number; var tangentX:Number; var tangentY:Number; var tX:Number; var j:int; var tCount:int; var ccp:b2ContactConstraintPoint; var PX:Number; var PY:Number; var ccp2:b2ContactConstraintPoint; var i:int; while (i < m_constraintCount) { c = m_constraints[i]; b1 = c.body1; b2 = c.body2; invMass1 = b1.m_invMass; invI1 = b1.m_invI; invMass2 = b2.m_invMass; invI2 = b2.m_invI; normalX = c.normal.x; normalY = c.normal.y; tangentX = normalY; tangentY = -(normalX); if (step.warmStarting){ tCount = c.pointCount; j = 0; while (j < tCount) { ccp = c.points[j]; ccp.normalImpulse = (ccp.normalImpulse * step.dtRatio); ccp.tangentImpulse = (ccp.tangentImpulse * step.dtRatio); PX = ((ccp.normalImpulse * normalX) + (ccp.tangentImpulse * tangentX)); PY = ((ccp.normalImpulse * normalY) + (ccp.tangentImpulse * tangentY)); b1.m_angularVelocity = (b1.m_angularVelocity - (invI1 * ((ccp.r1.x * PY) - (ccp.r1.y * PX)))); b1.m_linearVelocity.x = (b1.m_linearVelocity.x - (invMass1 * PX)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y - (invMass1 * PY)); b2.m_angularVelocity = (b2.m_angularVelocity + (invI2 * ((ccp.r2.x * PY) - (ccp.r2.y * PX)))); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (invMass2 * PX)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (invMass2 * PY)); j++; }; } else { tCount = c.pointCount; j = 0; while (j < tCount) { ccp2 = c.points[j]; ccp2.normalImpulse = 0; ccp2.tangentImpulse = 0; j++; }; }; i++; }; } public function SolvePositionConstraints(baumgarte:Number):Boolean{ var tMat:b2Mat22; var tVec:b2Vec2; var c:b2ContactConstraint; var b1:b2Body; var b2:b2Body; var b1_sweep_c:b2Vec2; var b1_sweep_a:Number; var b2_sweep_c:b2Vec2; var b2_sweep_a:Number; var invMass1:Number; var invI1:Number; var invMass2:Number; var invI2:Number; var normalX:Number; var normalY:Number; var tCount:int; var j:int; var ccp:b2ContactConstraintPoint; var r1X:Number; var r1Y:Number; var r2X:Number; var r2Y:Number; var tX:Number; var p1X:Number; var p1Y:Number; var p2X:Number; var p2Y:Number; var dpX:Number; var dpY:Number; var separation:Number; var C:Number; var dImpulse:Number; var impulse0:Number; var impulseX:Number; var impulseY:Number; var minSeparation:Number = 0; var i:int; while (i < m_constraintCount) { c = m_constraints[i]; b1 = c.body1; b2 = c.body2; b1_sweep_c = b1.m_sweep.c; b1_sweep_a = b1.m_sweep.a; b2_sweep_c = b2.m_sweep.c; b2_sweep_a = b2.m_sweep.a; invMass1 = (b1.m_mass * b1.m_invMass); invI1 = (b1.m_mass * b1.m_invI); invMass2 = (b2.m_mass * b2.m_invMass); invI2 = (b2.m_mass * b2.m_invI); normalX = c.normal.x; normalY = c.normal.y; tCount = c.pointCount; j = 0; while (j < tCount) { ccp = c.points[j]; tMat = b1.m_xf.R; tVec = b1.m_sweep.localCenter; r1X = (ccp.localAnchor1.x - tVec.x); r1Y = (ccp.localAnchor1.y - tVec.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; tVec = b2.m_sweep.localCenter; r2X = (ccp.localAnchor2.x - tVec.x); r2Y = (ccp.localAnchor2.y - tVec.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; p1X = (b1_sweep_c.x + r1X); p1Y = (b1_sweep_c.y + r1Y); p2X = (b2_sweep_c.x + r2X); p2Y = (b2_sweep_c.y + r2Y); dpX = (p2X - p1X); dpY = (p2Y - p1Y); separation = (((dpX * normalX) + (dpY * normalY)) + ccp.separation); minSeparation = b2Math.b2Min(minSeparation, separation); C = (baumgarte * b2Math.b2Clamp((separation + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0)); dImpulse = (-(ccp.equalizedMass) * C); impulse0 = ccp.positionImpulse; ccp.positionImpulse = b2Math.b2Max((impulse0 + dImpulse), 0); dImpulse = (ccp.positionImpulse - impulse0); impulseX = (dImpulse * normalX); impulseY = (dImpulse * normalY); b1_sweep_c.x = (b1_sweep_c.x - (invMass1 * impulseX)); b1_sweep_c.y = (b1_sweep_c.y - (invMass1 * impulseY)); b1_sweep_a = (b1_sweep_a - (invI1 * ((r1X * impulseY) - (r1Y * impulseX)))); b1.m_sweep.a = b1_sweep_a; b1.SynchronizeTransform(); b2_sweep_c.x = (b2_sweep_c.x + (invMass2 * impulseX)); b2_sweep_c.y = (b2_sweep_c.y + (invMass2 * impulseY)); b2_sweep_a = (b2_sweep_a + (invI2 * ((r2X * impulseY) - (r2Y * impulseX)))); b2.m_sweep.a = b2_sweep_a; b2.SynchronizeTransform(); j++; }; i++; }; return ((minSeparation >= (-1.5 * b2Settings.b2_linearSlop))); } public function SolveVelocityConstraints():void{ var j:int; var ccp:b2ContactConstraintPoint; var r1X:Number; var r1Y:Number; var r2X:Number; var r2Y:Number; var dvX:Number; var dvY:Number; var vn:Number; var vt:Number; var lambda_n:Number; var lambda_t:Number; var newImpulse_n:Number; var newImpulse_t:Number; var PX:Number; var PY:Number; var tMat:b2Mat22; var tVec:b2Vec2; var c:b2ContactConstraint; var b1:b2Body; var b2:b2Body; var w1:Number; var w2:Number; var v1:b2Vec2; var v2:b2Vec2; var invMass1:Number; var invI1:Number; var invMass2:Number; var invI2:Number; var normalX:Number; var normalY:Number; var tangentX:Number; var tangentY:Number; var friction:Number; var tX:Number; var tCount:int; var maxFriction:Number; var i:int; while (i < m_constraintCount) { c = m_constraints[i]; b1 = c.body1; b2 = c.body2; w1 = b1.m_angularVelocity; w2 = b2.m_angularVelocity; v1 = b1.m_linearVelocity; v2 = b2.m_linearVelocity; invMass1 = b1.m_invMass; invI1 = b1.m_invI; invMass2 = b2.m_invMass; invI2 = b2.m_invI; normalX = c.normal.x; normalY = c.normal.y; tangentX = normalY; tangentY = -(normalX); friction = c.friction; tCount = c.pointCount; j = 0; while (j < tCount) { ccp = c.points[j]; dvX = (((v2.x + (-(w2) * ccp.r2.y)) - v1.x) - (-(w1) * ccp.r1.y)); dvY = (((v2.y + (w2 * ccp.r2.x)) - v1.y) - (w1 * ccp.r1.x)); vn = ((dvX * normalX) + (dvY * normalY)); lambda_n = (-(ccp.normalMass) * (vn - ccp.velocityBias)); vt = ((dvX * tangentX) + (dvY * tangentY)); lambda_t = (ccp.tangentMass * -(vt)); newImpulse_n = b2Math.b2Max((ccp.normalImpulse + lambda_n), 0); lambda_n = (newImpulse_n - ccp.normalImpulse); maxFriction = (friction * ccp.normalImpulse); newImpulse_t = b2Math.b2Clamp((ccp.tangentImpulse + lambda_t), -(maxFriction), maxFriction); lambda_t = (newImpulse_t - ccp.tangentImpulse); PX = ((lambda_n * normalX) + (lambda_t * tangentX)); PY = ((lambda_n * normalY) + (lambda_t * tangentY)); v1.x = (v1.x - (invMass1 * PX)); v1.y = (v1.y - (invMass1 * PY)); w1 = (w1 - (invI1 * ((ccp.r1.x * PY) - (ccp.r1.y * PX)))); v2.x = (v2.x + (invMass2 * PX)); v2.y = (v2.y + (invMass2 * PY)); w2 = (w2 + (invI2 * ((ccp.r2.x * PY) - (ccp.r2.y * PX)))); ccp.normalImpulse = newImpulse_n; ccp.tangentImpulse = newImpulse_t; j++; }; b1.m_angularVelocity = w1; b2.m_angularVelocity = w2; i++; }; } public function FinalizeVelocityConstraints():void{ var c:b2ContactConstraint; var m:b2Manifold; var j:int; var point1:b2ManifoldPoint; var point2:b2ContactConstraintPoint; var i:int; while (i < m_constraintCount) { c = m_constraints[i]; m = c.manifold; j = 0; while (j < c.pointCount) { point1 = m.points[j]; point2 = c.points[j]; point1.normalImpulse = point2.normalImpulse; point1.tangentImpulse = point2.tangentImpulse; j++; }; i++; }; } } }//package Box2D.Dynamics.Contacts
Section 45
//b2NullContact (Box2D.Dynamics.Contacts.b2NullContact) package Box2D.Dynamics.Contacts { import Box2D.Dynamics.*; public class b2NullContact extends b2Contact { public function b2NullContact(){ super(); } override public function Evaluate(l:b2ContactListener):void{ } override public function GetManifolds():Array{ return (null); } } }//package Box2D.Dynamics.Contacts
Section 46
//b2PolyAndCircleContact (Box2D.Dynamics.Contacts.b2PolyAndCircleContact) package Box2D.Dynamics.Contacts { import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Common.*; public class b2PolyAndCircleContact extends b2Contact { private var m_manifolds:Array; public var m_manifold:b2Manifold; private var m0:b2Manifold; private static const s_evalCP:b2ContactPoint = new b2ContactPoint(); public function b2PolyAndCircleContact(shape1:b2Shape, shape2:b2Shape){ m_manifolds = [new b2Manifold()]; m0 = new b2Manifold(); super(shape1, shape2); m_manifold = m_manifolds[0]; b2Settings.b2Assert((m_shape1.m_type == b2Shape.e_polygonShape)); b2Settings.b2Assert((m_shape2.m_type == b2Shape.e_circleShape)); m_manifold.pointCount = 0; var point:b2ManifoldPoint = m_manifold.points[0]; point.normalImpulse = 0; point.tangentImpulse = 0; } override public function Evaluate(listener:b2ContactListener):void{ var i:int; var v1:b2Vec2; var v2:b2Vec2; var mp0:b2ManifoldPoint; var mp:b2ManifoldPoint; var found:Boolean; var idKey:uint; var j:int; var b1:b2Body = m_shape1.m_body; var b2:b2Body = m_shape2.m_body; m0.Set(m_manifold); b2Collision.b2CollidePolygonAndCircle(m_manifold, (m_shape1 as b2PolygonShape), b1.m_xf, (m_shape2 as b2CircleShape), b2.m_xf); var persisted:Array = [false, false]; var cp:b2ContactPoint = s_evalCP; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.friction = m_friction; cp.restitution = m_restitution; if (m_manifold.pointCount > 0){ i = 0; while (i < m_manifold.pointCount) { mp = m_manifold.points[i]; mp.normalImpulse = 0; mp.tangentImpulse = 0; found = false; idKey = mp.id._key; j = 0; while (j < m0.pointCount) { if (persisted[j] == true){ } else { mp0 = m0.points[j]; if (mp0.id._key == idKey){ persisted[j] = true; mp.normalImpulse = mp0.normalImpulse; mp.tangentImpulse = mp0.tangentImpulse; found = true; if (listener != null){ cp.position = b1.GetWorldPoint(mp.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m_manifold.normal); cp.separation = mp.separation; cp.id.key = idKey; listener.Persist(cp); }; break; }; }; j++; }; if ((((found == false)) && (!((listener == null))))){ cp.position = b1.GetWorldPoint(mp.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m_manifold.normal); cp.separation = mp.separation; cp.id.key = idKey; listener.Add(cp); }; i++; }; m_manifoldCount = 1; } else { m_manifoldCount = 0; }; if (listener == null){ return; }; i = 0; while (i < m0.pointCount) { if (persisted[i]){ } else { mp0 = m0.points[i]; cp.position = b1.GetWorldPoint(mp0.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp0.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp0.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m0.normal); cp.separation = mp0.separation; cp.id.key = mp0.id._key; listener.Remove(cp); }; i++; }; } override public function GetManifolds():Array{ return (m_manifolds); } public static function Destroy(contact:b2Contact, allocator):void{ } public static function Create(shape1:b2Shape, shape2:b2Shape, allocator):b2Contact{ return (new b2PolyAndCircleContact(shape1, shape2)); } } }//package Box2D.Dynamics.Contacts
Section 47
//b2PolygonContact (Box2D.Dynamics.Contacts.b2PolygonContact) package Box2D.Dynamics.Contacts { import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class b2PolygonContact extends b2Contact { private var m_manifolds:Array; private var m0:b2Manifold; public var m_manifold:b2Manifold; private static const s_evalCP:b2ContactPoint = new b2ContactPoint(); public function b2PolygonContact(shape1:b2Shape, shape2:b2Shape):void{ m0 = new b2Manifold(); m_manifolds = [new b2Manifold()]; super(shape1, shape2); m_manifold = m_manifolds[0]; m_manifold.pointCount = 0; } override public function Evaluate(listener:b2ContactListener):void{ var v1:b2Vec2; var v2:b2Vec2; var mp0:b2ManifoldPoint; var cp:b2ContactPoint; var i:int; var mp:b2ManifoldPoint; var found:Boolean; var idKey:uint; var j:int; var b1:b2Body = m_shape1.m_body; var b2:b2Body = m_shape2.m_body; m0.Set(m_manifold); b2Collision.b2CollidePolygons(m_manifold, (m_shape1 as b2PolygonShape), b1.m_xf, (m_shape2 as b2PolygonShape), b2.m_xf); var persisted:Array = [false, false]; cp = s_evalCP; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.friction = m_friction; cp.restitution = m_restitution; if (m_manifold.pointCount > 0){ i = 0; while (i < m_manifold.pointCount) { mp = m_manifold.points[i]; mp.normalImpulse = 0; mp.tangentImpulse = 0; found = false; idKey = mp.id._key; j = 0; while (j < m0.pointCount) { if (persisted[j] == true){ } else { mp0 = m0.points[j]; if (mp0.id._key == idKey){ persisted[j] = true; mp.normalImpulse = mp0.normalImpulse; mp.tangentImpulse = mp0.tangentImpulse; found = true; if (listener != null){ cp.position = b1.GetWorldPoint(mp.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m_manifold.normal); cp.separation = mp.separation; cp.id.key = idKey; listener.Persist(cp); }; break; }; }; j++; }; if ((((found == false)) && (!((listener == null))))){ cp.position = b1.GetWorldPoint(mp.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m_manifold.normal); cp.separation = mp.separation; cp.id.key = idKey; listener.Add(cp); }; i++; }; m_manifoldCount = 1; } else { m_manifoldCount = 0; }; if (listener == null){ return; }; i = 0; while (i < m0.pointCount) { if (persisted[i]){ } else { mp0 = m0.points[i]; cp.position = b1.GetWorldPoint(mp0.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp0.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp0.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.normal.SetV(m0.normal); cp.separation = mp0.separation; cp.id.key = mp0.id._key; listener.Remove(cp); }; i++; }; } override public function GetManifolds():Array{ return (m_manifolds); } public static function Destroy(contact:b2Contact, allocator):void{ } public static function Create(shape1:b2Shape, shape2:b2Shape, allocator):b2Contact{ return (new b2PolygonContact(shape1, shape2)); } } }//package Box2D.Dynamics.Contacts
Section 48
//b2DistanceJoint (Box2D.Dynamics.Joints.b2DistanceJoint) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2DistanceJoint extends b2Joint { public var m_localAnchor1:b2Vec2; public var m_localAnchor2:b2Vec2; public var m_bias:Number; public var m_gamma:Number; public var m_u:b2Vec2; public var m_mass:Number; public var m_impulse:Number; public var m_dampingRatio:Number; public var m_frequencyHz:Number; public var m_length:Number; public function b2DistanceJoint(def:b2DistanceJointDef){ var tMat:b2Mat22; var tX:Number; var tY:Number; m_localAnchor1 = new b2Vec2(); m_localAnchor2 = new b2Vec2(); m_u = new b2Vec2(); super(def); m_localAnchor1.SetV(def.localAnchor1); m_localAnchor2.SetV(def.localAnchor2); m_length = def.length; m_frequencyHz = def.frequencyHz; m_dampingRatio = def.dampingRatio; m_impulse = 0; m_gamma = 0; m_bias = 0; m_inv_dt = 0; } override public function GetAnchor1():b2Vec2{ return (m_body1.GetWorldPoint(m_localAnchor1)); } override public function GetAnchor2():b2Vec2{ return (m_body2.GetWorldPoint(m_localAnchor2)); } override public function InitVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var tX:Number; var b1:b2Body; var b2:b2Body; var r1X:Number; var r2X:Number; var C:Number; var omega:Number; var d:Number; var k:Number; var PX:Number; var PY:Number; m_inv_dt = step.inv_dt; b1 = m_body1; b2 = m_body2; tMat = b1.m_xf.R; r1X = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; m_u.x = (((b2.m_sweep.c.x + r2X) - b1.m_sweep.c.x) - r1X); m_u.y = (((b2.m_sweep.c.y + r2Y) - b1.m_sweep.c.y) - r1Y); var length:Number = Math.sqrt(((m_u.x * m_u.x) + (m_u.y * m_u.y))); if (length > b2Settings.b2_linearSlop){ m_u.Multiply((1 / length)); } else { m_u.SetZero(); }; var cr1u:Number = ((r1X * m_u.y) - (r1Y * m_u.x)); var cr2u:Number = ((r2X * m_u.y) - (r2Y * m_u.x)); var invMass:Number = (((b1.m_invMass + ((b1.m_invI * cr1u) * cr1u)) + b2.m_invMass) + ((b2.m_invI * cr2u) * cr2u)); m_mass = (1 / invMass); if (m_frequencyHz > 0){ C = (length - m_length); omega = ((2 * Math.PI) * m_frequencyHz); d = (((2 * m_mass) * m_dampingRatio) * omega); k = ((m_mass * omega) * omega); m_gamma = (1 / (step.dt * (d + (step.dt * k)))); m_bias = (((C * step.dt) * k) * m_gamma); m_mass = (1 / (invMass + m_gamma)); }; if (step.warmStarting){ m_impulse = (m_impulse * step.dtRatio); PX = (m_impulse * m_u.x); PY = (m_impulse * m_u.y); b1.m_linearVelocity.x = (b1.m_linearVelocity.x - (b1.m_invMass * PX)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y - (b1.m_invMass * PY)); b1.m_angularVelocity = (b1.m_angularVelocity - (b1.m_invI * ((r1X * PY) - (r1Y * PX)))); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * PX)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * PY)); b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * PY) - (r2Y * PX)))); } else { m_impulse = 0; }; } override public function GetReactionTorque():Number{ return (0); } override public function GetReactionForce():b2Vec2{ var F:b2Vec2 = new b2Vec2(); F.SetV(m_u); F.Multiply((m_inv_dt * m_impulse)); return (F); } override public function SolvePositionConstraints():Boolean{ var tMat:b2Mat22; if (m_frequencyHz > 0){ return (true); }; var b1:b2Body = m_body1; var b2:b2Body = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var dX:Number = (((b2.m_sweep.c.x + r2X) - b1.m_sweep.c.x) - r1X); var dY:Number = (((b2.m_sweep.c.y + r2Y) - b1.m_sweep.c.y) - r1Y); var length:Number = Math.sqrt(((dX * dX) + (dY * dY))); dX = (dX / length); dY = (dY / length); var C:Number = (length - m_length); C = b2Math.b2Clamp(C, -(b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection); var impulse:Number = (-(m_mass) * C); m_u.Set(dX, dY); var PX:Number = (impulse * m_u.x); var PY:Number = (impulse * m_u.y); b1.m_sweep.c.x = (b1.m_sweep.c.x - (b1.m_invMass * PX)); b1.m_sweep.c.y = (b1.m_sweep.c.y - (b1.m_invMass * PY)); b1.m_sweep.a = (b1.m_sweep.a - (b1.m_invI * ((r1X * PY) - (r1Y * PX)))); b2.m_sweep.c.x = (b2.m_sweep.c.x + (b2.m_invMass * PX)); b2.m_sweep.c.y = (b2.m_sweep.c.y + (b2.m_invMass * PY)); b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * ((r2X * PY) - (r2Y * PX)))); b1.SynchronizeTransform(); b2.SynchronizeTransform(); return ((b2Math.b2Abs(C) < b2Settings.b2_linearSlop)); } override public function SolveVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var b1:b2Body = m_body1; var b2:b2Body = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var v1X:Number = (b1.m_linearVelocity.x + (-(b1.m_angularVelocity) * r1Y)); var v1Y:Number = (b1.m_linearVelocity.y + (b1.m_angularVelocity * r1X)); var v2X:Number = (b2.m_linearVelocity.x + (-(b2.m_angularVelocity) * r2Y)); var v2Y:Number = (b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X)); var Cdot:Number = ((m_u.x * (v2X - v1X)) + (m_u.y * (v2Y - v1Y))); var impulse:Number = (-(m_mass) * ((Cdot + m_bias) + (m_gamma * m_impulse))); m_impulse = (m_impulse + impulse); var PX:Number = (impulse * m_u.x); var PY:Number = (impulse * m_u.y); b1.m_linearVelocity.x = (b1.m_linearVelocity.x - (b1.m_invMass * PX)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y - (b1.m_invMass * PY)); b1.m_angularVelocity = (b1.m_angularVelocity - (b1.m_invI * ((r1X * PY) - (r1Y * PX)))); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * PX)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * PY)); b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * PY) - (r2Y * PX)))); } } }//package Box2D.Dynamics.Joints
Section 49
//b2DistanceJointDef (Box2D.Dynamics.Joints.b2DistanceJointDef) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; public class b2DistanceJointDef extends b2JointDef { public var localAnchor1:b2Vec2; public var length:Number; public var dampingRatio:Number; public var localAnchor2:b2Vec2; public var frequencyHz:Number; public function b2DistanceJointDef(){ localAnchor1 = new b2Vec2(); localAnchor2 = new b2Vec2(); super(); type = b2Joint.e_distanceJoint; length = 1; frequencyHz = 0; dampingRatio = 0; } public function Initialize(b1:b2Body, b2:b2Body, anchor1:b2Vec2, anchor2:b2Vec2):void{ body1 = b1; body2 = b2; localAnchor1.SetV(body1.GetLocalPoint(anchor1)); localAnchor2.SetV(body2.GetLocalPoint(anchor2)); var dX:Number = (anchor2.x - anchor1.x); var dY:Number = (anchor2.y - anchor1.y); length = Math.sqrt(((dX * dX) + (dY * dY))); frequencyHz = 0; dampingRatio = 0; } } }//package Box2D.Dynamics.Joints
Section 50
//b2GearJoint (Box2D.Dynamics.Joints.b2GearJoint) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2GearJoint extends b2Joint { public var m_ground2:b2Body; public var m_groundAnchor1:b2Vec2; public var m_groundAnchor2:b2Vec2; public var m_localAnchor1:b2Vec2; public var m_localAnchor2:b2Vec2; public var m_ratio:Number; public var m_revolute2:b2RevoluteJoint; public var m_force:Number; public var m_mass:Number; public var m_prismatic2:b2PrismaticJoint; public var m_ground1:b2Body; public var m_revolute1:b2RevoluteJoint; public var m_prismatic1:b2PrismaticJoint; public var m_constant:Number; public var m_J:b2Jacobian; public function b2GearJoint(def:b2GearJointDef){ var coordinate1:Number; var coordinate2:Number; m_groundAnchor1 = new b2Vec2(); m_groundAnchor2 = new b2Vec2(); m_localAnchor1 = new b2Vec2(); m_localAnchor2 = new b2Vec2(); m_J = new b2Jacobian(); super(def); var type1:int = def.joint1.m_type; var type2:int = def.joint2.m_type; m_revolute1 = null; m_prismatic1 = null; m_revolute2 = null; m_prismatic2 = null; m_ground1 = def.joint1.m_body1; m_body1 = def.joint1.m_body2; if (type1 == b2Joint.e_revoluteJoint){ m_revolute1 = (def.joint1 as b2RevoluteJoint); m_groundAnchor1.SetV(m_revolute1.m_localAnchor1); m_localAnchor1.SetV(m_revolute1.m_localAnchor2); coordinate1 = m_revolute1.GetJointAngle(); } else { m_prismatic1 = (def.joint1 as b2PrismaticJoint); m_groundAnchor1.SetV(m_prismatic1.m_localAnchor1); m_localAnchor1.SetV(m_prismatic1.m_localAnchor2); coordinate1 = m_prismatic1.GetJointTranslation(); }; m_ground2 = def.joint2.m_body1; m_body2 = def.joint2.m_body2; if (type2 == b2Joint.e_revoluteJoint){ m_revolute2 = (def.joint2 as b2RevoluteJoint); m_groundAnchor2.SetV(m_revolute2.m_localAnchor1); m_localAnchor2.SetV(m_revolute2.m_localAnchor2); coordinate2 = m_revolute2.GetJointAngle(); } else { m_prismatic2 = (def.joint2 as b2PrismaticJoint); m_groundAnchor2.SetV(m_prismatic2.m_localAnchor1); m_localAnchor2.SetV(m_prismatic2.m_localAnchor2); coordinate2 = m_prismatic2.GetJointTranslation(); }; m_ratio = def.ratio; m_constant = (coordinate1 + (m_ratio * coordinate2)); m_force = 0; } override public function GetAnchor1():b2Vec2{ return (m_body1.GetWorldPoint(m_localAnchor1)); } override public function GetAnchor2():b2Vec2{ return (m_body2.GetWorldPoint(m_localAnchor2)); } override public function InitVelocityConstraints(step:b2TimeStep):void{ var ugX:Number; var ugY:Number; var rX:Number; var rY:Number; var tMat:b2Mat22; var tVec:b2Vec2; var crug:Number; var tX:Number; var P:Number; var g1:b2Body = m_ground1; var g2:b2Body = m_ground2; var b1:b2Body = m_body1; var b2:b2Body = m_body2; var K:Number = 0; m_J.SetZero(); if (m_revolute1){ m_J.angular1 = -1; K = (K + b1.m_invI); } else { tMat = g1.m_xf.R; tVec = m_prismatic1.m_localXAxis1; ugX = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); ugY = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); tMat = b1.m_xf.R; rX = (m_localAnchor1.x - b1.m_sweep.localCenter.x); rY = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * rX) + (tMat.col2.x * rY)); rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY)); rX = tX; crug = ((rX * ugY) - (rY * ugX)); m_J.linear1.Set(-(ugX), -(ugY)); m_J.angular1 = -(crug); K = (K + (b1.m_invMass + ((b1.m_invI * crug) * crug))); }; if (m_revolute2){ m_J.angular2 = -(m_ratio); K = (K + ((m_ratio * m_ratio) * b2.m_invI)); } else { tMat = g2.m_xf.R; tVec = m_prismatic2.m_localXAxis1; ugX = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); ugY = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); tMat = b2.m_xf.R; rX = (m_localAnchor2.x - b2.m_sweep.localCenter.x); rY = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * rX) + (tMat.col2.x * rY)); rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY)); rX = tX; crug = ((rX * ugY) - (rY * ugX)); m_J.linear2.Set((-(m_ratio) * ugX), (-(m_ratio) * ugY)); m_J.angular2 = (-(m_ratio) * crug); K = (K + ((m_ratio * m_ratio) * (b2.m_invMass + ((b2.m_invI * crug) * crug)))); }; m_mass = (1 / K); if (step.warmStarting){ P = (step.dt * m_force); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((b1.m_invMass * P) * m_J.linear1.x)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((b1.m_invMass * P) * m_J.linear1.y)); b1.m_angularVelocity = (b1.m_angularVelocity + ((b1.m_invI * P) * m_J.angular1)); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((b2.m_invMass * P) * m_J.linear2.x)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((b2.m_invMass * P) * m_J.linear2.y)); b2.m_angularVelocity = (b2.m_angularVelocity + ((b2.m_invI * P) * m_J.angular2)); } else { m_force = 0; }; } override public function GetReactionTorque():Number{ var tMat:b2Mat22 = m_body2.m_xf.R; var rX:Number = (m_localAnchor1.x - m_body2.m_sweep.localCenter.x); var rY:Number = (m_localAnchor1.y - m_body2.m_sweep.localCenter.y); var tX:Number = ((tMat.col1.x * rX) + (tMat.col2.x * rY)); rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY)); rX = tX; tX = ((m_force * m_J.angular2) - ((rX * (m_force * m_J.linear2.y)) - (rY * (m_force * m_J.linear2.x)))); return (tX); } override public function GetReactionForce():b2Vec2{ var F:b2Vec2 = new b2Vec2((m_force * m_J.linear2.x), (m_force * m_J.linear2.y)); return (F); } override public function SolvePositionConstraints():Boolean{ var coordinate1:Number; var coordinate2:Number; var linearError:Number = 0; var b1:b2Body = m_body1; var b2:b2Body = m_body2; if (m_revolute1){ coordinate1 = m_revolute1.GetJointAngle(); } else { coordinate1 = m_prismatic1.GetJointTranslation(); }; if (m_revolute2){ coordinate2 = m_revolute2.GetJointAngle(); } else { coordinate2 = m_prismatic2.GetJointTranslation(); }; var C:Number = (m_constant - (coordinate1 + (m_ratio * coordinate2))); var impulse:Number = (-(m_mass) * C); b1.m_sweep.c.x = (b1.m_sweep.c.x + ((b1.m_invMass * impulse) * m_J.linear1.x)); b1.m_sweep.c.y = (b1.m_sweep.c.y + ((b1.m_invMass * impulse) * m_J.linear1.y)); b1.m_sweep.a = (b1.m_sweep.a + ((b1.m_invI * impulse) * m_J.angular1)); b2.m_sweep.c.x = (b2.m_sweep.c.x + ((b2.m_invMass * impulse) * m_J.linear2.x)); b2.m_sweep.c.y = (b2.m_sweep.c.y + ((b2.m_invMass * impulse) * m_J.linear2.y)); b2.m_sweep.a = (b2.m_sweep.a + ((b2.m_invI * impulse) * m_J.angular2)); b1.SynchronizeTransform(); b2.SynchronizeTransform(); return ((linearError < b2Settings.b2_linearSlop)); } public function GetRatio():Number{ return (m_ratio); } override public function SolveVelocityConstraints(step:b2TimeStep):void{ var b1:b2Body = m_body1; var b2:b2Body = m_body2; var Cdot:Number = m_J.Compute(b1.m_linearVelocity, b1.m_angularVelocity, b2.m_linearVelocity, b2.m_angularVelocity); var force:Number = ((-(step.inv_dt) * m_mass) * Cdot); m_force = (m_force + force); var P:Number = (step.dt * force); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((b1.m_invMass * P) * m_J.linear1.x)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((b1.m_invMass * P) * m_J.linear1.y)); b1.m_angularVelocity = (b1.m_angularVelocity + ((b1.m_invI * P) * m_J.angular1)); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((b2.m_invMass * P) * m_J.linear2.x)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((b2.m_invMass * P) * m_J.linear2.y)); b2.m_angularVelocity = (b2.m_angularVelocity + ((b2.m_invI * P) * m_J.angular2)); } } }//package Box2D.Dynamics.Joints
Section 51
//b2GearJointDef (Box2D.Dynamics.Joints.b2GearJointDef) package Box2D.Dynamics.Joints { public class b2GearJointDef extends b2JointDef { public var joint1:b2Joint; public var joint2:b2Joint; public var ratio:Number; public function b2GearJointDef(){ super(); type = b2Joint.e_gearJoint; joint1 = null; joint2 = null; ratio = 1; } } }//package Box2D.Dynamics.Joints
Section 52
//b2Jacobian (Box2D.Dynamics.Joints.b2Jacobian) package Box2D.Dynamics.Joints { import Box2D.Common.Math.*; public class b2Jacobian { public var linear1:b2Vec2; public var linear2:b2Vec2; public var angular1:Number; public var angular2:Number; public function b2Jacobian(){ linear1 = new b2Vec2(); linear2 = new b2Vec2(); super(); } public function Set(x1:b2Vec2, a1:Number, x2:b2Vec2, a2:Number):void{ linear1.SetV(x1); angular1 = a1; linear2.SetV(x2); angular2 = a2; } public function SetZero():void{ linear1.SetZero(); angular1 = 0; linear2.SetZero(); angular2 = 0; } public function Compute(x1:b2Vec2, a1:Number, x2:b2Vec2, a2:Number):Number{ return ((((((linear1.x * x1.x) + (linear1.y * x1.y)) + (angular1 * a1)) + ((linear2.x * x2.x) + (linear2.y * x2.y))) + (angular2 * a2))); } } }//package Box2D.Dynamics.Joints
Section 53
//b2Joint (Box2D.Dynamics.Joints.b2Joint) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; public class b2Joint { public var m_islandFlag:Boolean; public var m_body1:b2Body; public var m_prev:b2Joint; public var m_next:b2Joint; public var m_type:int; public var m_collideConnected:Boolean; public var m_node1:b2JointEdge; public var m_node2:b2JointEdge; public var m_inv_dt:Number; public var m_userData; public var m_body2:b2Body; public static const e_unknownJoint:int = 0; public static const e_inactiveLimit:int = 0; public static const e_atUpperLimit:int = 2; public static const e_atLowerLimit:int = 1; public static const e_gearJoint:int = 6; public static const e_revoluteJoint:int = 1; public static const e_equalLimits:int = 3; public static const e_distanceJoint:int = 3; public static const e_pulleyJoint:int = 4; public static const e_prismaticJoint:int = 2; public static const e_mouseJoint:int = 5; public function b2Joint(def:b2JointDef){ m_node1 = new b2JointEdge(); m_node2 = new b2JointEdge(); super(); m_type = def.type; m_prev = null; m_next = null; m_body1 = def.body1; m_body2 = def.body2; m_collideConnected = def.collideConnected; m_islandFlag = false; m_userData = def.userData; } public function GetBody2():b2Body{ return (m_body2); } public function GetAnchor1():b2Vec2{ return (null); } public function GetAnchor2():b2Vec2{ return (null); } public function GetNext():b2Joint{ return (m_next); } public function GetType():int{ return (m_type); } public function InitVelocityConstraints(step:b2TimeStep):void{ } public function GetReactionTorque():Number{ return (0); } public function GetUserData(){ return (m_userData); } public function GetReactionForce():b2Vec2{ return (null); } public function SolvePositionConstraints():Boolean{ return (false); } public function SetUserData(data):void{ m_userData = data; } public function GetBody1():b2Body{ return (m_body1); } public function SolveVelocityConstraints(step:b2TimeStep):void{ } public function InitPositionConstraints():void{ } public static function Destroy(joint:b2Joint, allocator):void{ } public static function Create(def:b2JointDef, allocator):b2Joint{ var joint:b2Joint; switch (def.type){ case e_distanceJoint: joint = new b2DistanceJoint((def as b2DistanceJointDef)); break; case e_mouseJoint: joint = new b2MouseJoint((def as b2MouseJointDef)); break; case e_prismaticJoint: joint = new b2PrismaticJoint((def as b2PrismaticJointDef)); break; case e_revoluteJoint: joint = new b2RevoluteJoint((def as b2RevoluteJointDef)); break; case e_pulleyJoint: joint = new b2PulleyJoint((def as b2PulleyJointDef)); break; case e_gearJoint: joint = new b2GearJoint((def as b2GearJointDef)); break; default: break; }; return (joint); } } }//package Box2D.Dynamics.Joints
Section 54
//b2JointDef (Box2D.Dynamics.Joints.b2JointDef) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; public class b2JointDef { public var body2:b2Body; public var type:int; public var userData; public var collideConnected:Boolean; public var body1:b2Body; public function b2JointDef(){ super(); type = b2Joint.e_unknownJoint; userData = null; body1 = null; body2 = null; collideConnected = false; } } }//package Box2D.Dynamics.Joints
Section 55
//b2JointEdge (Box2D.Dynamics.Joints.b2JointEdge) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; public class b2JointEdge { public var other:b2Body; public var next:b2JointEdge; public var prev:b2JointEdge; public var joint:b2Joint; public function b2JointEdge(){ super(); } } }//package Box2D.Dynamics.Joints
Section 56
//b2MouseJoint (Box2D.Dynamics.Joints.b2MouseJoint) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2MouseJoint extends b2Joint { private var K1:b2Mat22; private var K:b2Mat22; public var m_beta:Number; public var m_mass:b2Mat22; private var K2:b2Mat22; public var m_target:b2Vec2; public var m_gamma:Number; public var m_impulse:b2Vec2; public var m_C:b2Vec2; public var m_localAnchor:b2Vec2; public var m_maxForce:Number; public function b2MouseJoint(def:b2MouseJointDef){ var tY:Number; K = new b2Mat22(); K1 = new b2Mat22(); K2 = new b2Mat22(); m_localAnchor = new b2Vec2(); m_target = new b2Vec2(); m_impulse = new b2Vec2(); m_mass = new b2Mat22(); m_C = new b2Vec2(); super(def); m_target.SetV(def.target); var tX:Number = (m_target.x - m_body2.m_xf.position.x); tY = (m_target.y - m_body2.m_xf.position.y); var tMat:b2Mat22 = m_body2.m_xf.R; m_localAnchor.x = ((tX * tMat.col1.x) + (tY * tMat.col1.y)); m_localAnchor.y = ((tX * tMat.col2.x) + (tY * tMat.col2.y)); m_maxForce = def.maxForce; m_impulse.SetZero(); var mass:Number = m_body2.m_mass; var omega:Number = ((2 * b2Settings.b2_pi) * def.frequencyHz); var d:Number = (((2 * mass) * def.dampingRatio) * omega); var k:Number = ((def.timeStep * mass) * (omega * omega)); m_gamma = (1 / (d + k)); m_beta = (k / (d + k)); } public function SetTarget(target:b2Vec2):void{ if (m_body2.IsSleeping()){ m_body2.WakeUp(); }; m_target = target; } override public function GetAnchor2():b2Vec2{ return (m_body2.GetWorldPoint(m_localAnchor)); } override public function InitVelocityConstraints(step:b2TimeStep):void{ var b:b2Body; var tMat:b2Mat22; var rX:Number; var rY:Number; var invMass:Number; var invI:Number; b = m_body2; tMat = b.m_xf.R; rX = (m_localAnchor.x - b.m_sweep.localCenter.x); rY = (m_localAnchor.y - b.m_sweep.localCenter.y); var tX:Number = ((tMat.col1.x * rX) + (tMat.col2.x * rY)); rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY)); rX = tX; invMass = b.m_invMass; invI = b.m_invI; K1.col1.x = invMass; K1.col2.x = 0; K1.col1.y = 0; K1.col2.y = invMass; K2.col1.x = ((invI * rY) * rY); K2.col2.x = ((-(invI) * rX) * rY); K2.col1.y = ((-(invI) * rX) * rY); K2.col2.y = ((invI * rX) * rX); K.SetM(K1); K.AddM(K2); K.col1.x = (K.col1.x + m_gamma); K.col2.y = (K.col2.y + m_gamma); K.Invert(m_mass); m_C.x = ((b.m_sweep.c.x + rX) - m_target.x); m_C.y = ((b.m_sweep.c.y + rY) - m_target.y); b.m_angularVelocity = (b.m_angularVelocity * 0.98); var PX:Number = (step.dt * m_impulse.x); var PY:Number = (step.dt * m_impulse.y); b.m_linearVelocity.x = (b.m_linearVelocity.x + (invMass * PX)); b.m_linearVelocity.y = (b.m_linearVelocity.y + (invMass * PY)); b.m_angularVelocity = (b.m_angularVelocity + (invI * ((rX * PY) - (rY * PX)))); } override public function GetAnchor1():b2Vec2{ return (m_target); } override public function GetReactionTorque():Number{ return (0); } override public function GetReactionForce():b2Vec2{ return (m_impulse); } override public function SolvePositionConstraints():Boolean{ return (true); } override public function SolveVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var tX:Number; var tY:Number; var b:b2Body = m_body2; tMat = b.m_xf.R; var rX:Number = (m_localAnchor.x - b.m_sweep.localCenter.x); var rY:Number = (m_localAnchor.y - b.m_sweep.localCenter.y); tX = ((tMat.col1.x * rX) + (tMat.col2.x * rY)); rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY)); rX = tX; var CdotX:Number = (b.m_linearVelocity.x + (-(b.m_angularVelocity) * rY)); var CdotY:Number = (b.m_linearVelocity.y + (b.m_angularVelocity * rX)); tMat = m_mass; tX = ((CdotX + ((m_beta * step.inv_dt) * m_C.x)) + ((m_gamma * step.dt) * m_impulse.x)); tY = ((CdotY + ((m_beta * step.inv_dt) * m_C.y)) + ((m_gamma * step.dt) * m_impulse.y)); var forceX:Number = (-(step.inv_dt) * ((tMat.col1.x * tX) + (tMat.col2.x * tY))); var forceY:Number = (-(step.inv_dt) * ((tMat.col1.y * tX) + (tMat.col2.y * tY))); var oldForceX:Number = m_impulse.x; var oldForceY:Number = m_impulse.y; m_impulse.x = (m_impulse.x + forceX); m_impulse.y = (m_impulse.y + forceY); var forceMagnitude:Number = m_impulse.Length(); if (forceMagnitude > m_maxForce){ m_impulse.Multiply((m_maxForce / forceMagnitude)); }; forceX = (m_impulse.x - oldForceX); forceY = (m_impulse.y - oldForceY); var PX:Number = (step.dt * forceX); var PY:Number = (step.dt * forceY); b.m_linearVelocity.x = (b.m_linearVelocity.x + (b.m_invMass * PX)); b.m_linearVelocity.y = (b.m_linearVelocity.y + (b.m_invMass * PY)); b.m_angularVelocity = (b.m_angularVelocity + (b.m_invI * ((rX * PY) - (rY * PX)))); } } }//package Box2D.Dynamics.Joints
Section 57
//b2MouseJointDef (Box2D.Dynamics.Joints.b2MouseJointDef) package Box2D.Dynamics.Joints { import Box2D.Common.Math.*; public class b2MouseJointDef extends b2JointDef { public var timeStep:Number; public var target:b2Vec2; public var maxForce:Number; public var dampingRatio:Number; public var frequencyHz:Number; public function b2MouseJointDef(){ target = new b2Vec2(); super(); type = b2Joint.e_mouseJoint; maxForce = 0; frequencyHz = 5; dampingRatio = 0.7; timeStep = (1 / 60); } } }//package Box2D.Dynamics.Joints
Section 58
//b2PrismaticJoint (Box2D.Dynamics.Joints.b2PrismaticJoint) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2PrismaticJoint extends b2Joint { public var m_limitForce:Number; public var m_lowerTranslation:Number; public var m_localXAxis1:b2Vec2; public var m_refAngle:Number; public var m_torque:Number; public var m_motorForce:Number; public var m_enableLimit:Boolean; public var m_angularMass:Number; public var m_maxMotorForce:Number; public var m_localYAxis1:b2Vec2; public var m_force:Number; public var m_motorMass:Number; public var m_upperTranslation:Number; public var m_localAnchor1:b2Vec2; public var m_localAnchor2:b2Vec2; public var m_limitState:int; public var m_linearMass:Number; public var m_motorJacobian:b2Jacobian; public var m_limitPositionImpulse:Number; public var m_motorSpeed:Number; public var m_enableMotor:Boolean; public var m_linearJacobian:b2Jacobian; public function b2PrismaticJoint(def:b2PrismaticJointDef){ var tMat:b2Mat22; var tX:Number; var tY:Number; m_localAnchor1 = new b2Vec2(); m_localAnchor2 = new b2Vec2(); m_localXAxis1 = new b2Vec2(); m_localYAxis1 = new b2Vec2(); m_linearJacobian = new b2Jacobian(); m_motorJacobian = new b2Jacobian(); super(def); m_localAnchor1.SetV(def.localAnchor1); m_localAnchor2.SetV(def.localAnchor2); m_localXAxis1.SetV(def.localAxis1); m_localYAxis1.x = -(m_localXAxis1.y); m_localYAxis1.y = m_localXAxis1.x; m_refAngle = def.referenceAngle; m_linearJacobian.SetZero(); m_linearMass = 0; m_force = 0; m_angularMass = 0; m_torque = 0; m_motorJacobian.SetZero(); m_motorMass = 0; m_motorForce = 0; m_limitForce = 0; m_limitPositionImpulse = 0; m_lowerTranslation = def.lowerTranslation; m_upperTranslation = def.upperTranslation; m_maxMotorForce = def.maxMotorForce; m_motorSpeed = def.motorSpeed; m_enableLimit = def.enableLimit; m_enableMotor = def.enableMotor; } override public function SolveVelocityConstraints(step:b2TimeStep):void{ var invI1:Number; var oldLimitForce:Number; var motorCdot:Number; var motorForce:Number; var oldMotorForce:Number; var limitCdot:Number; var limitForce:Number; var b1:b2Body = m_body1; var b2:b2Body = m_body2; var invMass1:Number = b1.m_invMass; var invMass2:Number = b2.m_invMass; invI1 = b1.m_invI; var invI2:Number = b2.m_invI; var linearCdot:Number = m_linearJacobian.Compute(b1.m_linearVelocity, b1.m_angularVelocity, b2.m_linearVelocity, b2.m_angularVelocity); var force:Number = ((-(step.inv_dt) * m_linearMass) * linearCdot); m_force = (m_force + force); var P:Number = (step.dt * force); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((invMass1 * P) * m_linearJacobian.linear1.x)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((invMass1 * P) * m_linearJacobian.linear1.y)); b1.m_angularVelocity = (b1.m_angularVelocity + ((invI1 * P) * m_linearJacobian.angular1)); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((invMass2 * P) * m_linearJacobian.linear2.x)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((invMass2 * P) * m_linearJacobian.linear2.y)); b2.m_angularVelocity = (b2.m_angularVelocity + ((invI2 * P) * m_linearJacobian.angular2)); var angularCdot:Number = (b2.m_angularVelocity - b1.m_angularVelocity); var torque:Number = ((-(step.inv_dt) * m_angularMass) * angularCdot); m_torque = (m_torque + torque); var L:Number = (step.dt * torque); b1.m_angularVelocity = (b1.m_angularVelocity - (invI1 * L)); b2.m_angularVelocity = (b2.m_angularVelocity + (invI2 * L)); if (((m_enableMotor) && (!((m_limitState == e_equalLimits))))){ motorCdot = (m_motorJacobian.Compute(b1.m_linearVelocity, b1.m_angularVelocity, b2.m_linearVelocity, b2.m_angularVelocity) - m_motorSpeed); motorForce = ((-(step.inv_dt) * m_motorMass) * motorCdot); oldMotorForce = m_motorForce; m_motorForce = b2Math.b2Clamp((m_motorForce + motorForce), -(m_maxMotorForce), m_maxMotorForce); motorForce = (m_motorForce - oldMotorForce); P = (step.dt * motorForce); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((invMass1 * P) * m_motorJacobian.linear1.x)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((invMass1 * P) * m_motorJacobian.linear1.y)); b1.m_angularVelocity = (b1.m_angularVelocity + ((invI1 * P) * m_motorJacobian.angular1)); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((invMass2 * P) * m_motorJacobian.linear2.x)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((invMass2 * P) * m_motorJacobian.linear2.y)); b2.m_angularVelocity = (b2.m_angularVelocity + ((invI2 * P) * m_motorJacobian.angular2)); }; if (((m_enableLimit) && (!((m_limitState == e_inactiveLimit))))){ limitCdot = m_motorJacobian.Compute(b1.m_linearVelocity, b1.m_angularVelocity, b2.m_linearVelocity, b2.m_angularVelocity); limitForce = ((-(step.inv_dt) * m_motorMass) * limitCdot); if (m_limitState == e_equalLimits){ m_limitForce = (m_limitForce + limitForce); } else { if (m_limitState == e_atLowerLimit){ oldLimitForce = m_limitForce; m_limitForce = b2Math.b2Max((m_limitForce + limitForce), 0); limitForce = (m_limitForce - oldLimitForce); } else { if (m_limitState == e_atUpperLimit){ oldLimitForce = m_limitForce; m_limitForce = b2Math.b2Min((m_limitForce + limitForce), 0); limitForce = (m_limitForce - oldLimitForce); }; }; }; P = (step.dt * limitForce); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((invMass1 * P) * m_motorJacobian.linear1.x)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((invMass1 * P) * m_motorJacobian.linear1.y)); b1.m_angularVelocity = (b1.m_angularVelocity + ((invI1 * P) * m_motorJacobian.angular1)); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((invMass2 * P) * m_motorJacobian.linear2.x)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((invMass2 * P) * m_motorJacobian.linear2.y)); b2.m_angularVelocity = (b2.m_angularVelocity + ((invI2 * P) * m_motorJacobian.angular2)); }; } override public function GetAnchor1():b2Vec2{ return (m_body1.GetWorldPoint(m_localAnchor1)); } override public function GetAnchor2():b2Vec2{ return (m_body2.GetWorldPoint(m_localAnchor2)); } public function GetUpperLimit():Number{ return (m_upperTranslation); } public function GetLowerLimit():Number{ return (m_lowerTranslation); } public function EnableMotor(flag:Boolean):void{ m_enableMotor = flag; } public function GetJointTranslation():Number{ var tMat:b2Mat22; var b1:b2Body = m_body1; var b2:b2Body = m_body2; var p1:b2Vec2 = b1.GetWorldPoint(m_localAnchor1); var p2:b2Vec2 = b2.GetWorldPoint(m_localAnchor2); var dX:Number = (p2.x - p1.x); var dY:Number = (p2.y - p1.y); var axis:b2Vec2 = b1.GetWorldVector(m_localXAxis1); var translation:Number = ((axis.x * dX) + (axis.y * dY)); return (translation); } public function GetMotorSpeed():Number{ return (m_motorSpeed); } override public function GetReactionForce():b2Vec2{ var tMat:b2Mat22 = m_body1.m_xf.R; var ax1X:Number = (m_limitForce * ((tMat.col1.x * m_localXAxis1.x) + (tMat.col2.x * m_localXAxis1.y))); var ax1Y:Number = (m_limitForce * ((tMat.col1.y * m_localXAxis1.x) + (tMat.col2.y * m_localXAxis1.y))); var ay1X:Number = (m_force * ((tMat.col1.x * m_localYAxis1.x) + (tMat.col2.x * m_localYAxis1.y))); var ay1Y:Number = (m_force * ((tMat.col1.y * m_localYAxis1.x) + (tMat.col2.y * m_localYAxis1.y))); return (new b2Vec2(((m_limitForce * ax1X) + (m_force * ay1X)), ((m_limitForce * ax1Y) + (m_force * ay1Y)))); } override public function SolvePositionConstraints():Boolean{ var limitC:Number; var oldLimitImpulse:Number; var tMat:b2Mat22; var tX:Number; var ax1X:Number; var ax1Y:Number; var translation:Number; var limitImpulse:Number; var b1:b2Body = m_body1; var b2:b2Body = m_body2; var invMass1:Number = b1.m_invMass; var invMass2:Number = b2.m_invMass; var invI1:Number = b1.m_invI; var invI2:Number = b2.m_invI; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var p1X:Number = (b1.m_sweep.c.x + r1X); var p1Y:Number = (b1.m_sweep.c.y + r1Y); var p2X:Number = (b2.m_sweep.c.x + r2X); var p2Y:Number = (b2.m_sweep.c.y + r2Y); var dX:Number = (p2X - p1X); var dY:Number = (p2Y - p1Y); tMat = b1.m_xf.R; var ay1X:Number = ((tMat.col1.x * m_localYAxis1.x) + (tMat.col2.x * m_localYAxis1.y)); var ay1Y:Number = ((tMat.col1.y * m_localYAxis1.x) + (tMat.col2.y * m_localYAxis1.y)); var linearC:Number = ((ay1X * dX) + (ay1Y * dY)); linearC = b2Math.b2Clamp(linearC, -(b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection); var linearImpulse:Number = (-(m_linearMass) * linearC); b1.m_sweep.c.x = (b1.m_sweep.c.x + ((invMass1 * linearImpulse) * m_linearJacobian.linear1.x)); b1.m_sweep.c.y = (b1.m_sweep.c.y + ((invMass1 * linearImpulse) * m_linearJacobian.linear1.y)); b1.m_sweep.a = (b1.m_sweep.a + ((invI1 * linearImpulse) * m_linearJacobian.angular1)); b2.m_sweep.c.x = (b2.m_sweep.c.x + ((invMass2 * linearImpulse) * m_linearJacobian.linear2.x)); b2.m_sweep.c.y = (b2.m_sweep.c.y + ((invMass2 * linearImpulse) * m_linearJacobian.linear2.y)); b2.m_sweep.a = (b2.m_sweep.a + ((invI2 * linearImpulse) * m_linearJacobian.angular2)); var positionError:Number = b2Math.b2Abs(linearC); var angularC:Number = ((b2.m_sweep.a - b1.m_sweep.a) - m_refAngle); angularC = b2Math.b2Clamp(angularC, -(b2Settings.b2_maxAngularCorrection), b2Settings.b2_maxAngularCorrection); var angularImpulse:Number = (-(m_angularMass) * angularC); b1.m_sweep.a = (b1.m_sweep.a - (b1.m_invI * angularImpulse)); b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * angularImpulse)); b1.SynchronizeTransform(); b2.SynchronizeTransform(); var angularError:Number = b2Math.b2Abs(angularC); if (((m_enableLimit) && (!((m_limitState == e_inactiveLimit))))){ tMat = b1.m_xf.R; r1X = (m_localAnchor1.x - b1.m_sweep.localCenter.x); r1Y = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x); r2Y = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; p1X = (b1.m_sweep.c.x + r1X); p1Y = (b1.m_sweep.c.y + r1Y); p2X = (b2.m_sweep.c.x + r2X); p2Y = (b2.m_sweep.c.y + r2Y); dX = (p2X - p1X); dY = (p2Y - p1Y); tMat = b1.m_xf.R; ax1X = ((tMat.col1.x * m_localXAxis1.x) + (tMat.col2.x * m_localXAxis1.y)); ax1Y = ((tMat.col1.y * m_localXAxis1.x) + (tMat.col2.y * m_localXAxis1.y)); translation = ((ax1X * dX) + (ax1Y * dY)); limitImpulse = 0; if (m_limitState == e_equalLimits){ limitC = b2Math.b2Clamp(translation, -(b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection); limitImpulse = (-(m_motorMass) * limitC); positionError = b2Math.b2Max(positionError, b2Math.b2Abs(angularC)); } else { if (m_limitState == e_atLowerLimit){ limitC = (translation - m_lowerTranslation); positionError = b2Math.b2Max(positionError, -(limitC)); limitC = b2Math.b2Clamp((limitC + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0); limitImpulse = (-(m_motorMass) * limitC); oldLimitImpulse = m_limitPositionImpulse; m_limitPositionImpulse = b2Math.b2Max((m_limitPositionImpulse + limitImpulse), 0); limitImpulse = (m_limitPositionImpulse - oldLimitImpulse); } else { if (m_limitState == e_atUpperLimit){ limitC = (translation - m_upperTranslation); positionError = b2Math.b2Max(positionError, limitC); limitC = b2Math.b2Clamp((limitC - b2Settings.b2_linearSlop), 0, b2Settings.b2_maxLinearCorrection); limitImpulse = (-(m_motorMass) * limitC); oldLimitImpulse = m_limitPositionImpulse; m_limitPositionImpulse = b2Math.b2Min((m_limitPositionImpulse + limitImpulse), 0); limitImpulse = (m_limitPositionImpulse - oldLimitImpulse); }; }; }; b1.m_sweep.c.x = (b1.m_sweep.c.x + ((invMass1 * limitImpulse) * m_motorJacobian.linear1.x)); b1.m_sweep.c.y = (b1.m_sweep.c.y + ((invMass1 * limitImpulse) * m_motorJacobian.linear1.y)); b1.m_sweep.a = (b1.m_sweep.a + ((invI1 * limitImpulse) * m_motorJacobian.angular1)); b2.m_sweep.c.x = (b2.m_sweep.c.x + ((invMass2 * limitImpulse) * m_motorJacobian.linear2.x)); b2.m_sweep.c.y = (b2.m_sweep.c.y + ((invMass2 * limitImpulse) * m_motorJacobian.linear2.y)); b2.m_sweep.a = (b2.m_sweep.a + ((invI2 * limitImpulse) * m_motorJacobian.angular2)); b1.SynchronizeTransform(); b2.SynchronizeTransform(); }; return ((((positionError <= b2Settings.b2_linearSlop)) && ((angularError <= b2Settings.b2_angularSlop)))); } public function SetMotorSpeed(speed:Number):void{ m_motorSpeed = speed; } public function GetJointSpeed():Number{ var tMat:b2Mat22; var b1:b2Body = m_body1; var b2:b2Body = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var p1X:Number = (b1.m_sweep.c.x + r1X); var p1Y:Number = (b1.m_sweep.c.y + r1Y); var p2X:Number = (b2.m_sweep.c.x + r2X); var p2Y:Number = (b2.m_sweep.c.y + r2Y); var dX:Number = (p2X - p1X); var dY:Number = (p2Y - p1Y); var axis:b2Vec2 = b1.GetWorldVector(m_localXAxis1); var v1:b2Vec2 = b1.m_linearVelocity; var v2:b2Vec2 = b2.m_linearVelocity; var w1:Number = b1.m_angularVelocity; var w2:Number = b2.m_angularVelocity; var speed:Number = (((dX * (-(w1) * axis.y)) + (dY * (w1 * axis.x))) + ((axis.x * (((v2.x + (-(w2) * r2Y)) - v1.x) - (-(w1) * r1Y))) + (axis.y * (((v2.y + (w2 * r2X)) - v1.y) - (w1 * r1X))))); return (speed); } override public function InitVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var tX:Number; var ax1X:Number; var ax1Y:Number; var dX:Number; var dY:Number; var jointTranslation:Number; var P1X:Number; var P1Y:Number; var P2X:Number; var P2Y:Number; var L1:Number; var L2:Number; var b1:b2Body = m_body1; var b2:b2Body = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var invMass1:Number = b1.m_invMass; var invMass2:Number = b2.m_invMass; var invI1:Number = b1.m_invI; var invI2:Number = b2.m_invI; tMat = b1.m_xf.R; var ay1X:Number = ((tMat.col1.x * m_localYAxis1.x) + (tMat.col2.x * m_localYAxis1.y)); var ay1Y:Number = ((tMat.col1.y * m_localYAxis1.x) + (tMat.col2.y * m_localYAxis1.y)); var eX:Number = ((b2.m_sweep.c.x + r2X) - b1.m_sweep.c.x); var eY:Number = ((b2.m_sweep.c.y + r2Y) - b1.m_sweep.c.y); m_linearJacobian.linear1.x = -(ay1X); m_linearJacobian.linear1.y = -(ay1Y); m_linearJacobian.linear2.x = ay1X; m_linearJacobian.linear2.y = ay1Y; m_linearJacobian.angular1 = -(((eX * ay1Y) - (eY * ay1X))); m_linearJacobian.angular2 = ((r2X * ay1Y) - (r2Y * ay1X)); m_linearMass = (((invMass1 + ((invI1 * m_linearJacobian.angular1) * m_linearJacobian.angular1)) + invMass2) + ((invI2 * m_linearJacobian.angular2) * m_linearJacobian.angular2)); m_linearMass = (1 / m_linearMass); m_angularMass = (invI1 + invI2); if (m_angularMass > Number.MIN_VALUE){ m_angularMass = (1 / m_angularMass); }; if (((m_enableLimit) || (m_enableMotor))){ tMat = b1.m_xf.R; ax1X = ((tMat.col1.x * m_localXAxis1.x) + (tMat.col2.x * m_localXAxis1.y)); ax1Y = ((tMat.col1.y * m_localXAxis1.x) + (tMat.col2.y * m_localXAxis1.y)); m_motorJacobian.linear1.x = -(ax1X); m_motorJacobian.linear1.y = -(ax1Y); m_motorJacobian.linear2.x = ax1X; m_motorJacobian.linear2.y = ax1Y; m_motorJacobian.angular1 = -(((eX * ax1Y) - (eY * ax1X))); m_motorJacobian.angular2 = ((r2X * ax1Y) - (r2Y * ax1X)); m_motorMass = (((invMass1 + ((invI1 * m_motorJacobian.angular1) * m_motorJacobian.angular1)) + invMass2) + ((invI2 * m_motorJacobian.angular2) * m_motorJacobian.angular2)); m_motorMass = (1 / m_motorMass); if (m_enableLimit){ dX = (eX - r1X); dY = (eY - r1Y); jointTranslation = ((ax1X * dX) + (ax1Y * dY)); if (b2Math.b2Abs((m_upperTranslation - m_lowerTranslation)) < (2 * b2Settings.b2_linearSlop)){ m_limitState = e_equalLimits; } else { if (jointTranslation <= m_lowerTranslation){ if (m_limitState != e_atLowerLimit){ m_limitForce = 0; }; m_limitState = e_atLowerLimit; } else { if (jointTranslation >= m_upperTranslation){ if (m_limitState != e_atUpperLimit){ m_limitForce = 0; }; m_limitState = e_atUpperLimit; } else { m_limitState = e_inactiveLimit; m_limitForce = 0; }; }; }; }; }; if (m_enableMotor == false){ m_motorForce = 0; }; if (m_enableLimit == false){ m_limitForce = 0; }; if (step.warmStarting){ P1X = (step.dt * ((m_force * m_linearJacobian.linear1.x) + ((m_motorForce + m_limitForce) * m_motorJacobian.linear1.x))); P1Y = (step.dt * ((m_force * m_linearJacobian.linear1.y) + ((m_motorForce + m_limitForce) * m_motorJacobian.linear1.y))); P2X = (step.dt * ((m_force * m_linearJacobian.linear2.x) + ((m_motorForce + m_limitForce) * m_motorJacobian.linear2.x))); P2Y = (step.dt * ((m_force * m_linearJacobian.linear2.y) + ((m_motorForce + m_limitForce) * m_motorJacobian.linear2.y))); L1 = (step.dt * (((m_force * m_linearJacobian.angular1) - m_torque) + ((m_motorForce + m_limitForce) * m_motorJacobian.angular1))); L2 = (step.dt * (((m_force * m_linearJacobian.angular2) + m_torque) + ((m_motorForce + m_limitForce) * m_motorJacobian.angular2))); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + (invMass1 * P1X)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + (invMass1 * P1Y)); b1.m_angularVelocity = (b1.m_angularVelocity + (invI1 * L1)); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (invMass2 * P2X)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (invMass2 * P2Y)); b2.m_angularVelocity = (b2.m_angularVelocity + (invI2 * L2)); } else { m_force = 0; m_torque = 0; m_limitForce = 0; m_motorForce = 0; }; m_limitPositionImpulse = 0; } public function GetMotorForce():Number{ return (m_motorForce); } public function EnableLimit(flag:Boolean):void{ m_enableLimit = flag; } public function SetMaxMotorForce(force:Number):void{ m_maxMotorForce = force; } override public function GetReactionTorque():Number{ return (m_torque); } public function IsLimitEnabled():Boolean{ return (m_enableLimit); } public function IsMotorEnabled():Boolean{ return (m_enableMotor); } public function SetLimits(lower:Number, upper:Number):void{ m_lowerTranslation = lower; m_upperTranslation = upper; } } }//package Box2D.Dynamics.Joints
Section 59
//b2PrismaticJointDef (Box2D.Dynamics.Joints.b2PrismaticJointDef) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; public class b2PrismaticJointDef extends b2JointDef { public var motorSpeed:Number; public var localAxis1:b2Vec2; public var referenceAngle:Number; public var upperTranslation:Number; public var localAnchor1:b2Vec2; public var localAnchor2:b2Vec2; public var enableLimit:Boolean; public var enableMotor:Boolean; public var maxMotorForce:Number; public var lowerTranslation:Number; public function b2PrismaticJointDef(){ localAnchor1 = new b2Vec2(); localAnchor2 = new b2Vec2(); localAxis1 = new b2Vec2(); super(); type = b2Joint.e_prismaticJoint; localAxis1.Set(1, 0); referenceAngle = 0; enableLimit = false; lowerTranslation = 0; upperTranslation = 0; enableMotor = false; maxMotorForce = 0; motorSpeed = 0; } public function Initialize(b1:b2Body, b2:b2Body, anchor:b2Vec2, axis:b2Vec2):void{ body1 = b1; body2 = b2; localAnchor1 = body1.GetLocalPoint(anchor); localAnchor2 = body2.GetLocalPoint(anchor); localAxis1 = body1.GetLocalVector(axis); referenceAngle = (body2.GetAngle() - body1.GetAngle()); } } }//package Box2D.Dynamics.Joints
Section 60
//b2PulleyJoint (Box2D.Dynamics.Joints.b2PulleyJoint) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2PulleyJoint extends b2Joint { public var m_limitState1:int; public var m_limitState2:int; public var m_ground:b2Body; public var m_maxLength2:Number; public var m_maxLength1:Number; public var m_limitPositionImpulse1:Number; public var m_limitPositionImpulse2:Number; public var m_force:Number; public var m_constant:Number; public var m_positionImpulse:Number; public var m_state:int; public var m_ratio:Number; public var m_groundAnchor1:b2Vec2; public var m_groundAnchor2:b2Vec2; public var m_localAnchor1:b2Vec2; public var m_localAnchor2:b2Vec2; public var m_limitMass1:Number; public var m_limitMass2:Number; public var m_pulleyMass:Number; public var m_u1:b2Vec2; public var m_limitForce1:Number; public var m_limitForce2:Number; public var m_u2:b2Vec2; public static const b2_minPulleyLength:Number = 2; public function b2PulleyJoint(def:b2PulleyJointDef){ var tMat:b2Mat22; var tX:Number; var tY:Number; m_groundAnchor1 = new b2Vec2(); m_groundAnchor2 = new b2Vec2(); m_localAnchor1 = new b2Vec2(); m_localAnchor2 = new b2Vec2(); m_u1 = new b2Vec2(); m_u2 = new b2Vec2(); super(def); m_ground = m_body1.m_world.m_groundBody; m_groundAnchor1.x = (def.groundAnchor1.x - m_ground.m_xf.position.x); m_groundAnchor1.y = (def.groundAnchor1.y - m_ground.m_xf.position.y); m_groundAnchor2.x = (def.groundAnchor2.x - m_ground.m_xf.position.x); m_groundAnchor2.y = (def.groundAnchor2.y - m_ground.m_xf.position.y); m_localAnchor1.SetV(def.localAnchor1); m_localAnchor2.SetV(def.localAnchor2); m_ratio = def.ratio; m_constant = (def.length1 + (m_ratio * def.length2)); m_maxLength1 = b2Math.b2Min(def.maxLength1, (m_constant - (m_ratio * b2_minPulleyLength))); m_maxLength2 = b2Math.b2Min(def.maxLength2, ((m_constant - b2_minPulleyLength) / m_ratio)); m_force = 0; m_limitForce1 = 0; m_limitForce2 = 0; } public function GetGroundAnchor2():b2Vec2{ var a:b2Vec2 = m_ground.m_xf.position.Copy(); a.Add(m_groundAnchor2); return (a); } override public function GetAnchor1():b2Vec2{ return (m_body1.GetWorldPoint(m_localAnchor1)); } override public function GetAnchor2():b2Vec2{ return (m_body2.GetWorldPoint(m_localAnchor2)); } override public function GetReactionForce():b2Vec2{ var F:b2Vec2 = m_u2.Copy(); F.Multiply(m_force); return (F); } override public function SolvePositionConstraints():Boolean{ var tMat:b2Mat22; var r1X:Number; var r1Y:Number; var r2X:Number; var r2Y:Number; var p1X:Number; var p1Y:Number; var p2X:Number; var p2Y:Number; var length1:Number; var length2:Number; var C:Number; var impulse:Number; var oldImpulse:Number; var oldLimitPositionImpulse:Number; var tX:Number; var b1:b2Body = m_body1; var b2:b2Body = m_body2; var s1X:Number = (m_ground.m_xf.position.x + m_groundAnchor1.x); var s1Y:Number = (m_ground.m_xf.position.y + m_groundAnchor1.y); var s2X:Number = (m_ground.m_xf.position.x + m_groundAnchor2.x); var s2Y:Number = (m_ground.m_xf.position.y + m_groundAnchor2.y); var linearError:Number = 0; if (m_state == e_atUpperLimit){ tMat = b1.m_xf.R; r1X = (m_localAnchor1.x - b1.m_sweep.localCenter.x); r1Y = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x); r2Y = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; p1X = (b1.m_sweep.c.x + r1X); p1Y = (b1.m_sweep.c.y + r1Y); p2X = (b2.m_sweep.c.x + r2X); p2Y = (b2.m_sweep.c.y + r2Y); m_u1.Set((p1X - s1X), (p1Y - s1Y)); m_u2.Set((p2X - s2X), (p2Y - s2Y)); length1 = m_u1.Length(); length2 = m_u2.Length(); if (length1 > b2Settings.b2_linearSlop){ m_u1.Multiply((1 / length1)); } else { m_u1.SetZero(); }; if (length2 > b2Settings.b2_linearSlop){ m_u2.Multiply((1 / length2)); } else { m_u2.SetZero(); }; C = ((m_constant - length1) - (m_ratio * length2)); linearError = b2Math.b2Max(linearError, -(C)); C = b2Math.b2Clamp((C + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0); impulse = (-(m_pulleyMass) * C); oldImpulse = m_positionImpulse; m_positionImpulse = b2Math.b2Max(0, (m_positionImpulse + impulse)); impulse = (m_positionImpulse - oldImpulse); p1X = (-(impulse) * m_u1.x); p1Y = (-(impulse) * m_u1.y); p2X = ((-(m_ratio) * impulse) * m_u2.x); p2Y = ((-(m_ratio) * impulse) * m_u2.y); b1.m_sweep.c.x = (b1.m_sweep.c.x + (b1.m_invMass * p1X)); b1.m_sweep.c.y = (b1.m_sweep.c.y + (b1.m_invMass * p1Y)); b1.m_sweep.a = (b1.m_sweep.a + (b1.m_invI * ((r1X * p1Y) - (r1Y * p1X)))); b2.m_sweep.c.x = (b2.m_sweep.c.x + (b2.m_invMass * p2X)); b2.m_sweep.c.y = (b2.m_sweep.c.y + (b2.m_invMass * p2Y)); b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * ((r2X * p2Y) - (r2Y * p2X)))); b1.SynchronizeTransform(); b2.SynchronizeTransform(); }; if (m_limitState1 == e_atUpperLimit){ tMat = b1.m_xf.R; r1X = (m_localAnchor1.x - b1.m_sweep.localCenter.x); r1Y = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; p1X = (b1.m_sweep.c.x + r1X); p1Y = (b1.m_sweep.c.y + r1Y); m_u1.Set((p1X - s1X), (p1Y - s1Y)); length1 = m_u1.Length(); if (length1 > b2Settings.b2_linearSlop){ m_u1.x = (m_u1.x * (1 / length1)); m_u1.y = (m_u1.y * (1 / length1)); } else { m_u1.SetZero(); }; C = (m_maxLength1 - length1); linearError = b2Math.b2Max(linearError, -(C)); C = b2Math.b2Clamp((C + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0); impulse = (-(m_limitMass1) * C); oldLimitPositionImpulse = m_limitPositionImpulse1; m_limitPositionImpulse1 = b2Math.b2Max(0, (m_limitPositionImpulse1 + impulse)); impulse = (m_limitPositionImpulse1 - oldLimitPositionImpulse); p1X = (-(impulse) * m_u1.x); p1Y = (-(impulse) * m_u1.y); b1.m_sweep.c.x = (b1.m_sweep.c.x + (b1.m_invMass * p1X)); b1.m_sweep.c.y = (b1.m_sweep.c.y + (b1.m_invMass * p1Y)); b1.m_sweep.a = (b1.m_sweep.a + (b1.m_invI * ((r1X * p1Y) - (r1Y * p1X)))); b1.SynchronizeTransform(); }; if (m_limitState2 == e_atUpperLimit){ tMat = b2.m_xf.R; r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x); r2Y = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; p2X = (b2.m_sweep.c.x + r2X); p2Y = (b2.m_sweep.c.y + r2Y); m_u2.Set((p2X - s2X), (p2Y - s2Y)); length2 = m_u2.Length(); if (length2 > b2Settings.b2_linearSlop){ m_u2.x = (m_u2.x * (1 / length2)); m_u2.y = (m_u2.y * (1 / length2)); } else { m_u2.SetZero(); }; C = (m_maxLength2 - length2); linearError = b2Math.b2Max(linearError, -(C)); C = b2Math.b2Clamp((C + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0); impulse = (-(m_limitMass2) * C); oldLimitPositionImpulse = m_limitPositionImpulse2; m_limitPositionImpulse2 = b2Math.b2Max(0, (m_limitPositionImpulse2 + impulse)); impulse = (m_limitPositionImpulse2 - oldLimitPositionImpulse); p2X = (-(impulse) * m_u2.x); p2Y = (-(impulse) * m_u2.y); b2.m_sweep.c.x = (b2.m_sweep.c.x + (b2.m_invMass * p2X)); b2.m_sweep.c.y = (b2.m_sweep.c.y + (b2.m_invMass * p2Y)); b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * ((r2X * p2Y) - (r2Y * p2X)))); b2.SynchronizeTransform(); }; return ((linearError < b2Settings.b2_linearSlop)); } override public function InitVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var P1X:Number; var P1Y:Number; var P2X:Number; var P2Y:Number; var b1:b2Body = m_body1; var b2:b2Body = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var p1X:Number = (b1.m_sweep.c.x + r1X); var p1Y:Number = (b1.m_sweep.c.y + r1Y); var p2X:Number = (b2.m_sweep.c.x + r2X); var p2Y:Number = (b2.m_sweep.c.y + r2Y); var s1X:Number = (m_ground.m_xf.position.x + m_groundAnchor1.x); var s1Y:Number = (m_ground.m_xf.position.y + m_groundAnchor1.y); var s2X:Number = (m_ground.m_xf.position.x + m_groundAnchor2.x); var s2Y:Number = (m_ground.m_xf.position.y + m_groundAnchor2.y); m_u1.Set((p1X - s1X), (p1Y - s1Y)); m_u2.Set((p2X - s2X), (p2Y - s2Y)); var length1:Number = m_u1.Length(); var length2:Number = m_u2.Length(); if (length1 > b2Settings.b2_linearSlop){ m_u1.Multiply((1 / length1)); } else { m_u1.SetZero(); }; if (length2 > b2Settings.b2_linearSlop){ m_u2.Multiply((1 / length2)); } else { m_u2.SetZero(); }; var C:Number = ((m_constant - length1) - (m_ratio * length2)); if (C > 0){ m_state = e_inactiveLimit; m_force = 0; } else { m_state = e_atUpperLimit; m_positionImpulse = 0; }; if (length1 < m_maxLength1){ m_limitState1 = e_inactiveLimit; m_limitForce1 = 0; } else { m_limitState1 = e_atUpperLimit; m_limitPositionImpulse1 = 0; }; if (length2 < m_maxLength2){ m_limitState2 = e_inactiveLimit; m_limitForce2 = 0; } else { m_limitState2 = e_atUpperLimit; m_limitPositionImpulse2 = 0; }; var cr1u1:Number = ((r1X * m_u1.y) - (r1Y * m_u1.x)); var cr2u2:Number = ((r2X * m_u2.y) - (r2Y * m_u2.x)); m_limitMass1 = (b1.m_invMass + ((b1.m_invI * cr1u1) * cr1u1)); m_limitMass2 = (b2.m_invMass + ((b2.m_invI * cr2u2) * cr2u2)); m_pulleyMass = (m_limitMass1 + ((m_ratio * m_ratio) * m_limitMass2)); m_limitMass1 = (1 / m_limitMass1); m_limitMass2 = (1 / m_limitMass2); m_pulleyMass = (1 / m_pulleyMass); if (step.warmStarting){ P1X = ((step.dt * (-(m_force) - m_limitForce1)) * m_u1.x); P1Y = ((step.dt * (-(m_force) - m_limitForce1)) * m_u1.y); P2X = ((step.dt * ((-(m_ratio) * m_force) - m_limitForce2)) * m_u2.x); P2Y = ((step.dt * ((-(m_ratio) * m_force) - m_limitForce2)) * m_u2.y); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + (b1.m_invMass * P1X)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + (b1.m_invMass * P1Y)); b1.m_angularVelocity = (b1.m_angularVelocity + (b1.m_invI * ((r1X * P1Y) - (r1Y * P1X)))); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * P2X)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * P2Y)); b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * P2Y) - (r2Y * P2X)))); } else { m_force = 0; m_limitForce1 = 0; m_limitForce2 = 0; }; } override public function GetReactionTorque():Number{ return (0); } public function GetRatio():Number{ return (m_ratio); } override public function SolveVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var r2X:Number; var v1X:Number; var v1Y:Number; var v2X:Number; var v2Y:Number; var P1X:Number; var P1Y:Number; var P2X:Number; var P2Y:Number; var Cdot:Number; var force:Number; var oldForce:Number; var b1:b2Body = m_body1; var b2:b2Body = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; if (m_state == e_atUpperLimit){ v1X = (b1.m_linearVelocity.x + (-(b1.m_angularVelocity) * r1Y)); v1Y = (b1.m_linearVelocity.y + (b1.m_angularVelocity * r1X)); v2X = (b2.m_linearVelocity.x + (-(b2.m_angularVelocity) * r2Y)); v2Y = (b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X)); Cdot = (-(((m_u1.x * v1X) + (m_u1.y * v1Y))) - (m_ratio * ((m_u2.x * v2X) + (m_u2.y * v2Y)))); force = ((-(step.inv_dt) * m_pulleyMass) * Cdot); oldForce = m_force; m_force = b2Math.b2Max(0, (m_force + force)); force = (m_force - oldForce); P1X = ((-(step.dt) * force) * m_u1.x); P1Y = ((-(step.dt) * force) * m_u1.y); P2X = (((-(step.dt) * m_ratio) * force) * m_u2.x); P2Y = (((-(step.dt) * m_ratio) * force) * m_u2.y); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + (b1.m_invMass * P1X)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + (b1.m_invMass * P1Y)); b1.m_angularVelocity = (b1.m_angularVelocity + (b1.m_invI * ((r1X * P1Y) - (r1Y * P1X)))); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * P2X)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * P2Y)); b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * P2Y) - (r2Y * P2X)))); }; if (m_limitState1 == e_atUpperLimit){ v1X = (b1.m_linearVelocity.x + (-(b1.m_angularVelocity) * r1Y)); v1Y = (b1.m_linearVelocity.y + (b1.m_angularVelocity * r1X)); Cdot = -(((m_u1.x * v1X) + (m_u1.y * v1Y))); force = ((-(step.inv_dt) * m_limitMass1) * Cdot); oldForce = m_limitForce1; m_limitForce1 = b2Math.b2Max(0, (m_limitForce1 + force)); force = (m_limitForce1 - oldForce); P1X = ((-(step.dt) * force) * m_u1.x); P1Y = ((-(step.dt) * force) * m_u1.y); b1.m_linearVelocity.x = (b1.m_linearVelocity.x + (b1.m_invMass * P1X)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y + (b1.m_invMass * P1Y)); b1.m_angularVelocity = (b1.m_angularVelocity + (b1.m_invI * ((r1X * P1Y) - (r1Y * P1X)))); }; if (m_limitState2 == e_atUpperLimit){ v2X = (b2.m_linearVelocity.x + (-(b2.m_angularVelocity) * r2Y)); v2Y = (b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X)); Cdot = -(((m_u2.x * v2X) + (m_u2.y * v2Y))); force = ((-(step.inv_dt) * m_limitMass2) * Cdot); oldForce = m_limitForce2; m_limitForce2 = b2Math.b2Max(0, (m_limitForce2 + force)); force = (m_limitForce2 - oldForce); P2X = ((-(step.dt) * force) * m_u2.x); P2Y = ((-(step.dt) * force) * m_u2.y); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * P2X)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * P2Y)); b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * P2Y) - (r2Y * P2X)))); }; } public function GetLength1():Number{ var p:b2Vec2 = m_body1.GetWorldPoint(m_localAnchor1); var sX:Number = (m_ground.m_xf.position.x + m_groundAnchor1.x); var sY:Number = (m_ground.m_xf.position.y + m_groundAnchor1.y); var dX:Number = (p.x - sX); var dY:Number = (p.y - sY); return (Math.sqrt(((dX * dX) + (dY * dY)))); } public function GetLength2():Number{ var p:b2Vec2 = m_body2.GetWorldPoint(m_localAnchor2); var sX:Number = (m_ground.m_xf.position.x + m_groundAnchor2.x); var sY:Number = (m_ground.m_xf.position.y + m_groundAnchor2.y); var dX:Number = (p.x - sX); var dY:Number = (p.y - sY); return (Math.sqrt(((dX * dX) + (dY * dY)))); } public function GetGroundAnchor1():b2Vec2{ var a:b2Vec2 = m_ground.m_xf.position.Copy(); a.Add(m_groundAnchor1); return (a); } } }//package Box2D.Dynamics.Joints
Section 61
//b2PulleyJointDef (Box2D.Dynamics.Joints.b2PulleyJointDef) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; public class b2PulleyJointDef extends b2JointDef { public var maxLength1:Number; public var maxLength2:Number; public var length1:Number; public var localAnchor1:b2Vec2; public var localAnchor2:b2Vec2; public var groundAnchor1:b2Vec2; public var groundAnchor2:b2Vec2; public var ratio:Number; public var length2:Number; public function b2PulleyJointDef(){ groundAnchor1 = new b2Vec2(); groundAnchor2 = new b2Vec2(); localAnchor1 = new b2Vec2(); localAnchor2 = new b2Vec2(); super(); type = b2Joint.e_pulleyJoint; groundAnchor1.Set(-1, 1); groundAnchor2.Set(1, 1); localAnchor1.Set(-1, 0); localAnchor2.Set(1, 0); length1 = 0; maxLength1 = 0; length2 = 0; maxLength2 = 0; ratio = 1; collideConnected = true; } public function Initialize(b1:b2Body, b2:b2Body, ga1:b2Vec2, ga2:b2Vec2, anchor1:b2Vec2, anchor2:b2Vec2, r:Number):void{ body1 = b1; body2 = b2; groundAnchor1.SetV(ga1); groundAnchor2.SetV(ga2); localAnchor1 = body1.GetLocalPoint(anchor1); localAnchor2 = body2.GetLocalPoint(anchor2); var d1X:Number = (anchor1.x - ga1.x); var d1Y:Number = (anchor1.y - ga1.y); length1 = Math.sqrt(((d1X * d1X) + (d1Y * d1Y))); var d2X:Number = (anchor2.x - ga2.x); var d2Y:Number = (anchor2.y - ga2.y); length2 = Math.sqrt(((d2X * d2X) + (d2Y * d2Y))); ratio = r; var C:Number = (length1 + (ratio * length2)); maxLength1 = (C - (ratio * b2PulleyJoint.b2_minPulleyLength)); maxLength2 = ((C - b2PulleyJoint.b2_minPulleyLength) / ratio); } } }//package Box2D.Dynamics.Joints
Section 62
//b2RevoluteJoint (Box2D.Dynamics.Joints.b2RevoluteJoint) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Common.*; public class b2RevoluteJoint extends b2Joint { public var m_limitForce:Number; public var m_pivotMass:b2Mat22; public var m_motorForce:Number; public var m_enableLimit:Boolean; public var m_limitState:int; public var m_motorMass:Number; public var m_localAnchor1:b2Vec2; public var m_localAnchor2:b2Vec2; private var K1:b2Mat22; private var K2:b2Mat22; private var K3:b2Mat22; private var K:b2Mat22; public var m_pivotForce:b2Vec2; public var m_enableMotor:Boolean; public var m_referenceAngle:Number; public var m_limitPositionImpulse:Number; public var m_motorSpeed:Number; public var m_upperAngle:Number; public var m_lowerAngle:Number; public var m_maxMotorTorque:Number; public static var tImpulse:b2Vec2 = new b2Vec2(); public function b2RevoluteJoint(def:b2RevoluteJointDef){ K = new b2Mat22(); K1 = new b2Mat22(); K2 = new b2Mat22(); K3 = new b2Mat22(); m_localAnchor1 = new b2Vec2(); m_localAnchor2 = new b2Vec2(); m_pivotForce = new b2Vec2(); m_pivotMass = new b2Mat22(); super(def); m_localAnchor1.SetV(def.localAnchor1); m_localAnchor2.SetV(def.localAnchor2); m_referenceAngle = def.referenceAngle; m_pivotForce.Set(0, 0); m_motorForce = 0; m_limitForce = 0; m_limitPositionImpulse = 0; m_lowerAngle = def.lowerAngle; m_upperAngle = def.upperAngle; m_maxMotorTorque = def.maxMotorTorque; m_motorSpeed = def.motorSpeed; m_enableLimit = def.enableLimit; m_enableMotor = def.enableMotor; } override public function SolveVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var tX:Number; var oldLimitForce:Number; var PY:Number; var motorCdot:Number; var motorForce:Number; var oldMotorForce:Number; var limitCdot:Number; var limitForce:Number; var b1:b2Body = m_body1; var b2:b2Body = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var pivotCdotX:Number = (((b2.m_linearVelocity.x + (-(b2.m_angularVelocity) * r2Y)) - b1.m_linearVelocity.x) - (-(b1.m_angularVelocity) * r1Y)); var pivotCdotY:Number = (((b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X)) - b1.m_linearVelocity.y) - (b1.m_angularVelocity * r1X)); var pivotForceX:Number = (-(step.inv_dt) * ((m_pivotMass.col1.x * pivotCdotX) + (m_pivotMass.col2.x * pivotCdotY))); var pivotForceY:Number = (-(step.inv_dt) * ((m_pivotMass.col1.y * pivotCdotX) + (m_pivotMass.col2.y * pivotCdotY))); m_pivotForce.x = (m_pivotForce.x + pivotForceX); m_pivotForce.y = (m_pivotForce.y + pivotForceY); var PX:Number = (step.dt * pivotForceX); PY = (step.dt * pivotForceY); b1.m_linearVelocity.x = (b1.m_linearVelocity.x - (b1.m_invMass * PX)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y - (b1.m_invMass * PY)); b1.m_angularVelocity = (b1.m_angularVelocity - (b1.m_invI * ((r1X * PY) - (r1Y * PX)))); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * PX)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * PY)); b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * PY) - (r2Y * PX)))); if (((m_enableMotor) && (!((m_limitState == e_equalLimits))))){ motorCdot = ((b2.m_angularVelocity - b1.m_angularVelocity) - m_motorSpeed); motorForce = ((-(step.inv_dt) * m_motorMass) * motorCdot); oldMotorForce = m_motorForce; m_motorForce = b2Math.b2Clamp((m_motorForce + motorForce), -(m_maxMotorTorque), m_maxMotorTorque); motorForce = (m_motorForce - oldMotorForce); b1.m_angularVelocity = (b1.m_angularVelocity - ((b1.m_invI * step.dt) * motorForce)); b2.m_angularVelocity = (b2.m_angularVelocity + ((b2.m_invI * step.dt) * motorForce)); }; if (((m_enableLimit) && (!((m_limitState == e_inactiveLimit))))){ limitCdot = (b2.m_angularVelocity - b1.m_angularVelocity); limitForce = ((-(step.inv_dt) * m_motorMass) * limitCdot); if (m_limitState == e_equalLimits){ m_limitForce = (m_limitForce + limitForce); } else { if (m_limitState == e_atLowerLimit){ oldLimitForce = m_limitForce; m_limitForce = b2Math.b2Max((m_limitForce + limitForce), 0); limitForce = (m_limitForce - oldLimitForce); } else { if (m_limitState == e_atUpperLimit){ oldLimitForce = m_limitForce; m_limitForce = b2Math.b2Min((m_limitForce + limitForce), 0); limitForce = (m_limitForce - oldLimitForce); }; }; }; b1.m_angularVelocity = (b1.m_angularVelocity - ((b1.m_invI * step.dt) * limitForce)); b2.m_angularVelocity = (b2.m_angularVelocity + ((b2.m_invI * step.dt) * limitForce)); }; } override public function GetAnchor1():b2Vec2{ return (m_body1.GetWorldPoint(m_localAnchor1)); } override public function GetAnchor2():b2Vec2{ return (m_body2.GetWorldPoint(m_localAnchor2)); } public function GetUpperLimit():Number{ return (m_upperAngle); } public function GetLowerLimit():Number{ return (m_lowerAngle); } public function EnableMotor(flag:Boolean):void{ m_enableMotor = flag; } public function GetMotorSpeed():Number{ return (m_motorSpeed); } override public function GetReactionForce():b2Vec2{ return (m_pivotForce); } override public function SolvePositionConstraints():Boolean{ var oldLimitImpulse:Number; var limitC:Number; var tMat:b2Mat22; var angle:Number; var limitImpulse:Number; var b1:b2Body = m_body1; var b2:b2Body = m_body2; var positionError:Number = 0; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y); var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var p1X:Number = (b1.m_sweep.c.x + r1X); var p1Y:Number = (b1.m_sweep.c.y + r1Y); var p2X:Number = (b2.m_sweep.c.x + r2X); var p2Y:Number = (b2.m_sweep.c.y + r2Y); var ptpCX:Number = (p2X - p1X); var ptpCY:Number = (p2Y - p1Y); positionError = Math.sqrt(((ptpCX * ptpCX) + (ptpCY * ptpCY))); var invMass1:Number = b1.m_invMass; var invMass2:Number = b2.m_invMass; var invI1:Number = b1.m_invI; var invI2:Number = b2.m_invI; K1.col1.x = (invMass1 + invMass2); K1.col2.x = 0; K1.col1.y = 0; K1.col2.y = (invMass1 + invMass2); K2.col1.x = ((invI1 * r1Y) * r1Y); K2.col2.x = ((-(invI1) * r1X) * r1Y); K2.col1.y = ((-(invI1) * r1X) * r1Y); K2.col2.y = ((invI1 * r1X) * r1X); K3.col1.x = ((invI2 * r2Y) * r2Y); K3.col2.x = ((-(invI2) * r2X) * r2Y); K3.col1.y = ((-(invI2) * r2X) * r2Y); K3.col2.y = ((invI2 * r2X) * r2X); K.SetM(K1); K.AddM(K2); K.AddM(K3); K.Solve(tImpulse, -(ptpCX), -(ptpCY)); var impulseX:Number = tImpulse.x; var impulseY:Number = tImpulse.y; b1.m_sweep.c.x = (b1.m_sweep.c.x - (b1.m_invMass * impulseX)); b1.m_sweep.c.y = (b1.m_sweep.c.y - (b1.m_invMass * impulseY)); b1.m_sweep.a = (b1.m_sweep.a - (b1.m_invI * ((r1X * impulseY) - (r1Y * impulseX)))); b2.m_sweep.c.x = (b2.m_sweep.c.x + (b2.m_invMass * impulseX)); b2.m_sweep.c.y = (b2.m_sweep.c.y + (b2.m_invMass * impulseY)); b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * ((r2X * impulseY) - (r2Y * impulseX)))); b1.SynchronizeTransform(); b2.SynchronizeTransform(); var angularError:Number = 0; if (((m_enableLimit) && (!((m_limitState == e_inactiveLimit))))){ angle = ((b2.m_sweep.a - b1.m_sweep.a) - m_referenceAngle); limitImpulse = 0; if (m_limitState == e_equalLimits){ limitC = b2Math.b2Clamp(angle, -(b2Settings.b2_maxAngularCorrection), b2Settings.b2_maxAngularCorrection); limitImpulse = (-(m_motorMass) * limitC); angularError = b2Math.b2Abs(limitC); } else { if (m_limitState == e_atLowerLimit){ limitC = (angle - m_lowerAngle); angularError = b2Math.b2Max(0, -(limitC)); limitC = b2Math.b2Clamp((limitC + b2Settings.b2_angularSlop), -(b2Settings.b2_maxAngularCorrection), 0); limitImpulse = (-(m_motorMass) * limitC); oldLimitImpulse = m_limitPositionImpulse; m_limitPositionImpulse = b2Math.b2Max((m_limitPositionImpulse + limitImpulse), 0); limitImpulse = (m_limitPositionImpulse - oldLimitImpulse); } else { if (m_limitState == e_atUpperLimit){ limitC = (angle - m_upperAngle); angularError = b2Math.b2Max(0, limitC); limitC = b2Math.b2Clamp((limitC - b2Settings.b2_angularSlop), 0, b2Settings.b2_maxAngularCorrection); limitImpulse = (-(m_motorMass) * limitC); oldLimitImpulse = m_limitPositionImpulse; m_limitPositionImpulse = b2Math.b2Min((m_limitPositionImpulse + limitImpulse), 0); limitImpulse = (m_limitPositionImpulse - oldLimitImpulse); }; }; }; b1.m_sweep.a = (b1.m_sweep.a - (b1.m_invI * limitImpulse)); b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * limitImpulse)); b1.SynchronizeTransform(); b2.SynchronizeTransform(); }; return ((((positionError <= b2Settings.b2_linearSlop)) && ((angularError <= b2Settings.b2_angularSlop)))); } public function SetMotorSpeed(speed:Number):void{ m_motorSpeed = speed; } public function GetJointSpeed():Number{ return ((m_body2.m_angularVelocity - m_body1.m_angularVelocity)); } public function SetMaxMotorTorque(torque:Number):void{ m_maxMotorTorque = torque; } public function GetJointAngle():Number{ return (((m_body2.m_sweep.a - m_body1.m_sweep.a) - m_referenceAngle)); } public function GetMotorTorque():Number{ return (m_motorForce); } override public function InitVelocityConstraints(step:b2TimeStep):void{ var b1:b2Body; var b2:b2Body; var tMat:b2Mat22; var tX:Number; var r1Y:Number; var jointAngle:Number; b1 = m_body1; b2 = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x); r1Y = (m_localAnchor1.y - b1.m_sweep.localCenter.y); tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y)); r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y)); r1X = tX; tMat = b2.m_xf.R; var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x); var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; var invMass1:Number = b1.m_invMass; var invMass2:Number = b2.m_invMass; var invI1:Number = b1.m_invI; var invI2:Number = b2.m_invI; K1.col1.x = (invMass1 + invMass2); K1.col2.x = 0; K1.col1.y = 0; K1.col2.y = (invMass1 + invMass2); K2.col1.x = ((invI1 * r1Y) * r1Y); K2.col2.x = ((-(invI1) * r1X) * r1Y); K2.col1.y = ((-(invI1) * r1X) * r1Y); K2.col2.y = ((invI1 * r1X) * r1X); K3.col1.x = ((invI2 * r2Y) * r2Y); K3.col2.x = ((-(invI2) * r2X) * r2Y); K3.col1.y = ((-(invI2) * r2X) * r2Y); K3.col2.y = ((invI2 * r2X) * r2X); K.SetM(K1); K.AddM(K2); K.AddM(K3); K.Invert(m_pivotMass); m_motorMass = (1 / (invI1 + invI2)); if (m_enableMotor == false){ m_motorForce = 0; }; if (m_enableLimit){ jointAngle = ((b2.m_sweep.a - b1.m_sweep.a) - m_referenceAngle); if (b2Math.b2Abs((m_upperAngle - m_lowerAngle)) < (2 * b2Settings.b2_angularSlop)){ m_limitState = e_equalLimits; } else { if (jointAngle <= m_lowerAngle){ if (m_limitState != e_atLowerLimit){ m_limitForce = 0; }; m_limitState = e_atLowerLimit; } else { if (jointAngle >= m_upperAngle){ if (m_limitState != e_atUpperLimit){ m_limitForce = 0; }; m_limitState = e_atUpperLimit; } else { m_limitState = e_inactiveLimit; m_limitForce = 0; }; }; }; } else { m_limitForce = 0; }; if (step.warmStarting){ b1.m_linearVelocity.x = (b1.m_linearVelocity.x - ((step.dt * invMass1) * m_pivotForce.x)); b1.m_linearVelocity.y = (b1.m_linearVelocity.y - ((step.dt * invMass1) * m_pivotForce.y)); b1.m_angularVelocity = (b1.m_angularVelocity - ((step.dt * invI1) * ((((r1X * m_pivotForce.y) - (r1Y * m_pivotForce.x)) + m_motorForce) + m_limitForce))); b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((step.dt * invMass2) * m_pivotForce.x)); b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((step.dt * invMass2) * m_pivotForce.y)); b2.m_angularVelocity = (b2.m_angularVelocity + ((step.dt * invI2) * ((((r2X * m_pivotForce.y) - (r2Y * m_pivotForce.x)) + m_motorForce) + m_limitForce))); } else { m_pivotForce.SetZero(); m_motorForce = 0; m_limitForce = 0; }; m_limitPositionImpulse = 0; } public function EnableLimit(flag:Boolean):void{ m_enableLimit = flag; } override public function GetReactionTorque():Number{ return (m_limitForce); } public function IsLimitEnabled():Boolean{ return (m_enableLimit); } public function IsMotorEnabled():Boolean{ return (m_enableMotor); } public function SetLimits(lower:Number, upper:Number):void{ m_lowerAngle = lower; m_upperAngle = upper; } } }//package Box2D.Dynamics.Joints
Section 63
//b2RevoluteJointDef (Box2D.Dynamics.Joints.b2RevoluteJointDef) package Box2D.Dynamics.Joints { import Box2D.Dynamics.*; import Box2D.Common.Math.*; public class b2RevoluteJointDef extends b2JointDef { public var upperAngle:Number; public var enableMotor:Boolean; public var referenceAngle:Number; public var motorSpeed:Number; public var localAnchor1:b2Vec2; public var localAnchor2:b2Vec2; public var enableLimit:Boolean; public var lowerAngle:Number; public var maxMotorTorque:Number; public function b2RevoluteJointDef(){ localAnchor1 = new b2Vec2(); localAnchor2 = new b2Vec2(); super(); type = b2Joint.e_revoluteJoint; localAnchor1.Set(0, 0); localAnchor2.Set(0, 0); referenceAngle = 0; lowerAngle = 0; upperAngle = 0; maxMotorTorque = 0; motorSpeed = 0; enableLimit = false; enableMotor = false; } public function Initialize(b1:b2Body, b2:b2Body, anchor:b2Vec2):void{ body1 = b1; body2 = b2; localAnchor1 = body1.GetLocalPoint(anchor); localAnchor2 = body2.GetLocalPoint(anchor); referenceAngle = (body2.GetAngle() - body1.GetAngle()); } } }//package Box2D.Dynamics.Joints
Section 64
//b2Body (Box2D.Dynamics.b2Body) package Box2D.Dynamics { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; import Box2D.Dynamics.Contacts.*; public class b2Body { public var m_next:b2Body; public var m_xf:b2XForm; public var m_contactList:b2ContactEdge; public var m_angularVelocity:Number; public var m_shapeList:b2Shape; public var m_force:b2Vec2; public var m_mass:Number; public var m_sweep:b2Sweep; public var m_torque:Number; public var m_userData; public var m_flags:uint; public var m_world:b2World; public var m_prev:b2Body; public var m_invMass:Number; public var m_type:int; public var m_linearDamping:Number; public var m_shapeCount:int; public var m_angularDamping:Number; public var m_invI:Number; public var m_linearVelocity:b2Vec2; public var m_sleepTime:Number; public var m_jointList:b2JointEdge; public var m_I:Number; public static var e_fixedRotationFlag:uint = 64; public static var e_frozenFlag:uint = 2; public static var e_maxTypes:uint = 3; public static var e_sleepFlag:uint = 8; private static var s_massData:b2MassData = new b2MassData(); public static var e_bulletFlag:uint = 32; public static var e_staticType:uint = 1; public static var e_islandFlag:uint = 4; public static var e_allowSleepFlag:uint = 16; private static var s_xf1:b2XForm = new b2XForm(); public static var e_dynamicType:uint = 2; public function b2Body(bd:b2BodyDef, world:b2World){ m_xf = new b2XForm(); m_sweep = new b2Sweep(); m_linearVelocity = new b2Vec2(); m_force = new b2Vec2(); super(); m_flags = 0; if (bd.isBullet){ m_flags = (m_flags | e_bulletFlag); }; if (bd.fixedRotation){ m_flags = (m_flags | e_fixedRotationFlag); }; if (bd.allowSleep){ m_flags = (m_flags | e_allowSleepFlag); }; if (bd.isSleeping){ m_flags = (m_flags | e_sleepFlag); }; m_world = world; m_xf.position.SetV(bd.position); m_xf.R.Set(bd.angle); m_sweep.localCenter.SetV(bd.massData.center); m_sweep.t0 = 1; m_sweep.a0 = (m_sweep.a = bd.angle); var tMat:b2Mat22 = m_xf.R; var tVec:b2Vec2 = m_sweep.localCenter; m_sweep.c.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); m_sweep.c.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); m_sweep.c.x = (m_sweep.c.x + m_xf.position.x); m_sweep.c.y = (m_sweep.c.y + m_xf.position.y); m_sweep.c0.SetV(m_sweep.c); m_jointList = null; m_contactList = null; m_prev = null; m_next = null; m_linearDamping = bd.linearDamping; m_angularDamping = bd.angularDamping; m_force.Set(0, 0); m_torque = 0; m_linearVelocity.SetZero(); m_angularVelocity = 0; m_sleepTime = 0; m_invMass = 0; m_I = 0; m_invI = 0; m_mass = bd.massData.mass; if (m_mass > 0){ m_invMass = (1 / m_mass); }; if ((m_flags & b2Body.e_fixedRotationFlag) == 0){ m_I = bd.massData.I; }; if (m_I > 0){ m_invI = (1 / m_I); }; if ((((m_invMass == 0)) && ((m_invI == 0)))){ m_type = e_staticType; } else { m_type = e_dynamicType; }; m_userData = bd.userData; m_shapeList = null; m_shapeCount = 0; } public function GetLinearVelocityFromWorldPoint(worldPoint:b2Vec2):b2Vec2{ return (new b2Vec2((m_linearVelocity.x + (m_angularVelocity * (worldPoint.y - m_sweep.c.y))), (m_linearVelocity.x - (m_angularVelocity * (worldPoint.x - m_sweep.c.x))))); } public function SetLinearVelocity(v:b2Vec2):void{ m_linearVelocity.SetV(v); } public function WakeUp():void{ m_flags = (m_flags & ~(e_sleepFlag)); m_sleepTime = 0; } public function GetLocalCenter():b2Vec2{ return (m_sweep.localCenter); } public function ApplyTorque(torque:Number):void{ if (IsSleeping()){ WakeUp(); }; m_torque = (m_torque + torque); } public function IsFrozen():Boolean{ return (((m_flags & e_frozenFlag) == e_frozenFlag)); } public function IsDynamic():Boolean{ return ((m_type == e_dynamicType)); } public function GetLinearVelocity():b2Vec2{ return (m_linearVelocity); } public function SynchronizeTransform():void{ m_xf.R.Set(m_sweep.a); var tMat:b2Mat22 = m_xf.R; var tVec:b2Vec2 = m_sweep.localCenter; m_xf.position.x = (m_sweep.c.x - ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); m_xf.position.y = (m_sweep.c.y - ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); } public function GetInertia():Number{ return (m_I); } public function IsSleeping():Boolean{ return (((m_flags & e_sleepFlag) == e_sleepFlag)); } public function SetMassFromShapes():void{ var s:b2Shape; if (m_world.m_lock == true){ return; }; m_mass = 0; m_invMass = 0; m_I = 0; m_invI = 0; var centerX:Number = 0; var centerY:Number = 0; var massData:b2MassData = s_massData; s = m_shapeList; while (s) { s.ComputeMass(massData); m_mass = (m_mass + massData.mass); centerX = (centerX + (massData.mass * massData.center.x)); centerY = (centerY + (massData.mass * massData.center.y)); m_I = (m_I + massData.I); s = s.m_next; }; if (m_mass > 0){ m_invMass = (1 / m_mass); centerX = (centerX * m_invMass); centerY = (centerY * m_invMass); }; if ((((m_I > 0)) && (((m_flags & e_fixedRotationFlag) == 0)))){ m_I = (m_I - (m_mass * ((centerX * centerX) + (centerY * centerY)))); m_invI = (1 / m_I); } else { m_I = 0; m_invI = 0; }; m_sweep.localCenter.Set(centerX, centerY); var tMat:b2Mat22 = m_xf.R; var tVec:b2Vec2 = m_sweep.localCenter; m_sweep.c.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); m_sweep.c.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); m_sweep.c.x = (m_sweep.c.x + m_xf.position.x); m_sweep.c.y = (m_sweep.c.y + m_xf.position.y); m_sweep.c0.SetV(m_sweep.c); s = m_shapeList; while (s) { s.UpdateSweepRadius(m_sweep.localCenter); s = s.m_next; }; var oldType:int = m_type; if ((((m_invMass == 0)) && ((m_invI == 0)))){ m_type = e_staticType; } else { m_type = e_dynamicType; }; if (oldType != m_type){ s = m_shapeList; while (s) { s.RefilterProxy(m_world.m_broadPhase, m_xf); s = s.m_next; }; }; } public function PutToSleep():void{ m_flags = (m_flags | e_sleepFlag); m_sleepTime = 0; m_linearVelocity.SetZero(); m_angularVelocity = 0; m_force.SetZero(); m_torque = 0; } public function GetJointList():b2JointEdge{ return (m_jointList); } public function SetXForm(position:b2Vec2, angle:Number):Boolean{ var s:b2Shape; var inRange:Boolean; if (m_world.m_lock == true){ return (true); }; if (IsFrozen()){ return (false); }; m_xf.R.Set(angle); m_xf.position.SetV(position); var tMat:b2Mat22 = m_xf.R; var tVec:b2Vec2 = m_sweep.localCenter; m_sweep.c.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); m_sweep.c.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); m_sweep.c.x = (m_sweep.c.x + m_xf.position.x); m_sweep.c.y = (m_sweep.c.y + m_xf.position.y); m_sweep.c0.SetV(m_sweep.c); m_sweep.a0 = (m_sweep.a = angle); var freeze:Boolean; s = m_shapeList; while (s) { inRange = s.Synchronize(m_world.m_broadPhase, m_xf, m_xf); if (inRange == false){ freeze = true; break; }; s = s.m_next; }; if (freeze == true){ m_flags = (m_flags | e_frozenFlag); m_linearVelocity.SetZero(); m_angularVelocity = 0; s = m_shapeList; while (s) { s.DestroyProxy(m_world.m_broadPhase); s = s.m_next; }; return (false); }; m_world.m_broadPhase.Commit(); return (true); } public function GetLocalPoint(worldPoint:b2Vec2):b2Vec2{ return (b2Math.b2MulXT(m_xf, worldPoint)); } public function ApplyForce(force:b2Vec2, point:b2Vec2):void{ if (IsSleeping()){ WakeUp(); }; m_force.x = (m_force.x + force.x); m_force.y = (m_force.y + force.y); m_torque = (m_torque + (((point.x - m_sweep.c.x) * force.y) - ((point.y - m_sweep.c.y) * force.x))); } public function SynchronizeShapes():Boolean{ var s:b2Shape; var xf1:b2XForm = s_xf1; xf1.R.Set(m_sweep.a0); var tMat:b2Mat22 = xf1.R; var tVec:b2Vec2 = m_sweep.localCenter; xf1.position.x = (m_sweep.c0.x - ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); xf1.position.y = (m_sweep.c0.y - ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); var inRange:Boolean; s = m_shapeList; while (s) { inRange = s.Synchronize(m_world.m_broadPhase, xf1, m_xf); if (inRange == false){ break; }; s = s.m_next; }; if (inRange == false){ m_flags = (m_flags | e_frozenFlag); m_linearVelocity.SetZero(); m_angularVelocity = 0; s = m_shapeList; while (s) { s.DestroyProxy(m_world.m_broadPhase); s = s.m_next; }; return (false); }; return (true); } public function GetAngle():Number{ return (m_sweep.a); } public function GetXForm():b2XForm{ return (m_xf); } public function GetLinearVelocityFromLocalPoint(localPoint:b2Vec2):b2Vec2{ var A:b2Mat22 = m_xf.R; var worldPoint:b2Vec2 = new b2Vec2(((A.col1.x * localPoint.x) + (A.col2.x * localPoint.y)), ((A.col1.y * localPoint.x) + (A.col2.y * localPoint.y))); worldPoint.x = (worldPoint.x + m_xf.position.x); worldPoint.y = (worldPoint.y + m_xf.position.y); return (new b2Vec2((m_linearVelocity.x + (m_angularVelocity * (worldPoint.y - m_sweep.c.y))), (m_linearVelocity.x - (m_angularVelocity * (worldPoint.x - m_sweep.c.x))))); } public function GetNext():b2Body{ return (m_next); } public function GetMass():Number{ return (m_mass); } public function ApplyImpulse(impulse:b2Vec2, point:b2Vec2):void{ if (IsSleeping()){ WakeUp(); }; m_linearVelocity.x = (m_linearVelocity.x + (m_invMass * impulse.x)); m_linearVelocity.y = (m_linearVelocity.y + (m_invMass * impulse.y)); m_angularVelocity = (m_angularVelocity + (m_invI * (((point.x - m_sweep.c.x) * impulse.y) - ((point.y - m_sweep.c.y) * impulse.x)))); } public function GetAngularVelocity():Number{ return (m_angularVelocity); } public function SetAngularVelocity(omega:Number):void{ m_angularVelocity = omega; } public function SetMass(massData:b2MassData):void{ var s:b2Shape; var tVec:b2Vec2; if (m_world.m_lock == true){ return; }; m_invMass = 0; m_I = 0; m_invI = 0; m_mass = massData.mass; if (m_mass > 0){ m_invMass = (1 / m_mass); }; if ((m_flags & b2Body.e_fixedRotationFlag) == 0){ m_I = massData.I; }; if (m_I > 0){ m_invI = (1 / m_I); }; m_sweep.localCenter.SetV(massData.center); var tMat:b2Mat22 = m_xf.R; tVec = m_sweep.localCenter; m_sweep.c.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)); m_sweep.c.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)); m_sweep.c.x = (m_sweep.c.x + m_xf.position.x); m_sweep.c.y = (m_sweep.c.y + m_xf.position.y); m_sweep.c0.SetV(m_sweep.c); s = m_shapeList; while (s) { s.UpdateSweepRadius(m_sweep.localCenter); s = s.m_next; }; var oldType:int = m_type; if ((((m_invMass == 0)) && ((m_invI == 0)))){ m_type = e_staticType; } else { m_type = e_dynamicType; }; if (oldType != m_type){ s = m_shapeList; while (s) { s.RefilterProxy(m_world.m_broadPhase, m_xf); s = s.m_next; }; }; } public function IsStatic():Boolean{ return ((m_type == e_staticType)); } public function GetWorldVector(localVector:b2Vec2):b2Vec2{ return (b2Math.b2MulMV(m_xf.R, localVector)); } public function GetShapeList():b2Shape{ return (m_shapeList); } public function Advance(t:Number):void{ m_sweep.Advance(t); m_sweep.c.SetV(m_sweep.c0); m_sweep.a = m_sweep.a0; SynchronizeTransform(); } public function SetBullet(flag:Boolean):void{ if (flag){ m_flags = (m_flags | e_bulletFlag); } else { m_flags = (m_flags & ~(e_bulletFlag)); }; } public function CreateShape(def:b2ShapeDef):b2Shape{ if (m_world.m_lock == true){ return (null); }; var s:b2Shape = b2Shape.Create(def, m_world.m_blockAllocator); s.m_next = m_shapeList; m_shapeList = s; m_shapeCount++; s.m_body = this; s.CreateProxy(m_world.m_broadPhase, m_xf); s.UpdateSweepRadius(m_sweep.localCenter); return (s); } public function IsConnected(other:b2Body):Boolean{ var jn:b2JointEdge = m_jointList; while (jn) { if (jn.other == other){ return ((jn.joint.m_collideConnected == false)); }; jn = jn.next; }; return (false); } public function DestroyShape(s:b2Shape):void{ if (m_world.m_lock == true){ return; }; s.DestroyProxy(m_world.m_broadPhase); var node:b2Shape = m_shapeList; var found:Boolean; while (node != null) { if (node == s){ node = s.m_next; found = true; break; }; node = node.m_next; }; s.m_body = null; s.m_next = null; m_shapeCount--; b2Shape.Destroy(s, m_world.m_blockAllocator); } public function GetUserData(){ return (m_userData); } public function IsBullet():Boolean{ return (((m_flags & e_bulletFlag) == e_bulletFlag)); } public function GetWorldCenter():b2Vec2{ return (m_sweep.c); } public function AllowSleeping(flag:Boolean):void{ if (flag){ m_flags = (m_flags | e_allowSleepFlag); } else { m_flags = (m_flags & ~(e_allowSleepFlag)); WakeUp(); }; } public function SetUserData(data):void{ m_userData = data; } public function GetLocalVector(worldVector:b2Vec2):b2Vec2{ return (b2Math.b2MulTMV(m_xf.R, worldVector)); } public function GetWorldPoint(localPoint:b2Vec2):b2Vec2{ var A:b2Mat22 = m_xf.R; var u:b2Vec2 = new b2Vec2(((A.col1.x * localPoint.x) + (A.col2.x * localPoint.y)), ((A.col1.y * localPoint.x) + (A.col2.y * localPoint.y))); u.x = (u.x + m_xf.position.x); u.y = (u.y + m_xf.position.y); return (u); } public function GetWorld():b2World{ return (m_world); } public function GetPosition():b2Vec2{ return (m_xf.position); } } }//package Box2D.Dynamics
Section 65
//b2BodyDef (Box2D.Dynamics.b2BodyDef) package Box2D.Dynamics { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class b2BodyDef { public var angularDamping:Number; public var angle:Number; public var isSleeping:Boolean; public var position:b2Vec2; public var isBullet:Boolean; public var allowSleep:Boolean; public var userData; public var fixedRotation:Boolean; public var linearDamping:Number; public var massData:b2MassData; public function b2BodyDef(){ massData = new b2MassData(); position = new b2Vec2(); super(); massData.center.SetZero(); massData.mass = 0; massData.I = 0; userData = null; position.Set(0, 0); angle = 0; linearDamping = 0; angularDamping = 0; allowSleep = true; isSleeping = false; fixedRotation = false; isBullet = false; } } }//package Box2D.Dynamics
Section 66
//b2BoundaryListener (Box2D.Dynamics.b2BoundaryListener) package Box2D.Dynamics { public class b2BoundaryListener { public function b2BoundaryListener(){ super(); } public function Violation(body:b2Body):void{ } } }//package Box2D.Dynamics
Section 67
//b2ContactFilter (Box2D.Dynamics.b2ContactFilter) package Box2D.Dynamics { import Box2D.Collision.Shapes.*; public class b2ContactFilter { public static var b2_defaultFilter:b2ContactFilter = new (b2ContactFilter); ; public function b2ContactFilter(){ super(); } public function ShouldCollide(shape1:b2Shape, shape2:b2Shape):Boolean{ var filter1:b2FilterData = shape1.GetFilterData(); var filter2:b2FilterData = shape2.GetFilterData(); if ((((filter1.groupIndex == filter2.groupIndex)) && (!((filter1.groupIndex == 0))))){ return ((filter1.groupIndex > 0)); }; var collide:Boolean = ((!(((filter1.maskBits & filter2.categoryBits) == 0))) && (!(((filter1.categoryBits & filter2.maskBits) == 0)))); return (collide); } public function RayCollide(userData, shape:b2Shape):Boolean{ if (!userData){ return (true); }; return (ShouldCollide((userData as b2Shape), shape)); } } }//package Box2D.Dynamics
Section 68
//b2ContactListener (Box2D.Dynamics.b2ContactListener) package Box2D.Dynamics { import Box2D.Collision.*; import Box2D.Dynamics.Contacts.*; public class b2ContactListener { public function b2ContactListener(){ super(); } public function Add(point:b2ContactPoint):void{ } public function Remove(point:b2ContactPoint):void{ } public function Persist(point:b2ContactPoint):void{ } public function Result(point:b2ContactResult):void{ } } }//package Box2D.Dynamics
Section 69
//b2ContactManager (Box2D.Dynamics.b2ContactManager) package Box2D.Dynamics { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.Contacts.*; public class b2ContactManager extends b2PairCallback { public var m_world:b2World; public var m_destroyImmediate:Boolean; public var m_nullContact:b2NullContact; private static const s_evalCP:b2ContactPoint = new b2ContactPoint(); public function b2ContactManager(){ m_nullContact = new b2NullContact(); super(); m_world = null; m_destroyImmediate = false; } override public function PairRemoved(proxyUserData1, proxyUserData2, pairUserData):void{ if (pairUserData == null){ return; }; var c:b2Contact = (pairUserData as b2Contact); if (c == m_nullContact){ return; }; Destroy(c); } public function Destroy(c:b2Contact):void{ var b1:b2Body; var b2:b2Body; var manifolds:Array; var cp:b2ContactPoint; var i:int; var manifold:b2Manifold; var j:int; var mp:b2ManifoldPoint; var v1:b2Vec2; var v2:b2Vec2; var shape1:b2Shape = c.m_shape1; var shape2:b2Shape = c.m_shape2; var manifoldCount:int = c.m_manifoldCount; if ((((manifoldCount > 0)) && (m_world.m_contactListener))){ b1 = shape1.m_body; b2 = shape2.m_body; manifolds = c.GetManifolds(); cp = s_evalCP; cp.shape1 = c.m_shape1; cp.shape2 = c.m_shape1; cp.friction = c.m_friction; cp.restitution = c.m_restitution; i = 0; while (i < manifoldCount) { manifold = manifolds[i]; cp.normal.SetV(manifold.normal); j = 0; while (j < manifold.pointCount) { mp = manifold.points[j]; cp.position = b1.GetWorldPoint(mp.localPoint1); v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1); v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2); cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y)); cp.separation = mp.separation; cp.id.key = mp.id._key; m_world.m_contactListener.Remove(cp); j++; }; i++; }; }; if (c.m_prev){ c.m_prev.m_next = c.m_next; }; if (c.m_next){ c.m_next.m_prev = c.m_prev; }; if (c == m_world.m_contactList){ m_world.m_contactList = c.m_next; }; var body1:b2Body = shape1.m_body; var body2:b2Body = shape2.m_body; if (c.m_node1.prev){ c.m_node1.prev.next = c.m_node1.next; }; if (c.m_node1.next){ c.m_node1.next.prev = c.m_node1.prev; }; if (c.m_node1 == body1.m_contactList){ body1.m_contactList = c.m_node1.next; }; if (c.m_node2.prev){ c.m_node2.prev.next = c.m_node2.next; }; if (c.m_node2.next){ c.m_node2.next.prev = c.m_node2.prev; }; if (c.m_node2 == body2.m_contactList){ body2.m_contactList = c.m_node2.next; }; b2Contact.Destroy(c, m_world.m_blockAllocator); m_world.m_contactCount--; } override public function PairAdded(proxyUserData1, proxyUserData2){ var body1:b2Body; var shape1:b2Shape = (proxyUserData1 as b2Shape); var shape2:b2Shape = (proxyUserData2 as b2Shape); body1 = shape1.m_body; var body2:b2Body = shape2.m_body; if (((body1.IsStatic()) && (body2.IsStatic()))){ return (m_nullContact); }; if (shape1.m_body == shape2.m_body){ return (m_nullContact); }; if (body2.IsConnected(body1)){ return (m_nullContact); }; if (((!((m_world.m_contactFilter == null))) && ((m_world.m_contactFilter.ShouldCollide(shape1, shape2) == false)))){ return (m_nullContact); }; var c:b2Contact = b2Contact.Create(shape1, shape2, m_world.m_blockAllocator); if (c == null){ return (m_nullContact); }; shape1 = c.m_shape1; shape2 = c.m_shape2; body1 = shape1.m_body; body2 = shape2.m_body; c.m_prev = null; c.m_next = m_world.m_contactList; if (m_world.m_contactList != null){ m_world.m_contactList.m_prev = c; }; m_world.m_contactList = c; c.m_node1.contact = c; c.m_node1.other = body2; c.m_node1.prev = null; c.m_node1.next = body1.m_contactList; if (body1.m_contactList != null){ body1.m_contactList.prev = c.m_node1; }; body1.m_contactList = c.m_node1; c.m_node2.contact = c; c.m_node2.other = body1; c.m_node2.prev = null; c.m_node2.next = body2.m_contactList; if (body2.m_contactList != null){ body2.m_contactList.prev = c.m_node2; }; body2.m_contactList = c.m_node2; m_world.m_contactCount++; return (c); } public function Collide():void{ var body1:b2Body; var body2:b2Body; var c:b2Contact = m_world.m_contactList; while (c) { body1 = c.m_shape1.m_body; body2 = c.m_shape2.m_body; if (((body1.IsSleeping()) && (body2.IsSleeping()))){ } else { c.Update(m_world.m_contactListener); }; c = c.m_next; }; } } }//package Box2D.Dynamics
Section 70
//b2DebugDraw (Box2D.Dynamics.b2DebugDraw) package Box2D.Dynamics { import flash.display.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Common.*; import Box2D.Dynamics.Contacts.*; public class b2DebugDraw { public var m_xformScale:Number;// = 1 public var m_fillAlpha:Number;// = 1 public var m_alpha:Number;// = 1 public var m_drawFlags:uint; public var m_lineThickness:Number;// = 1 public var m_drawScale:Number;// = 1 public var m_sprite:Sprite; public static var e_coreShapeBit:uint = 4; public static var e_shapeBit:uint = 1; public static var e_centerOfMassBit:uint = 64; public static var e_aabbBit:uint = 8; public static var e_obbBit:uint = 16; public static var e_pairBit:uint = 32; public static var e_jointBit:uint = 2; public function b2DebugDraw(){ super(); m_drawFlags = 0; } public function ClearFlags(flags:uint):void{ m_drawFlags = (m_drawFlags & ~(flags)); } public function SetFlags(flags:uint):void{ m_drawFlags = flags; } public function AppendFlags(flags:uint):void{ m_drawFlags = (m_drawFlags | flags); } public function DrawSegment(p1:b2Vec2, p2:b2Vec2, color:b2Color):void{ m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha); m_sprite.graphics.moveTo((p1.x * m_drawScale), (p1.y * m_drawScale)); m_sprite.graphics.lineTo((p2.x * m_drawScale), (p2.y * m_drawScale)); } public function DrawSolidPolygon(vertices:Array, vertexCount:int, color:b2Color):void{ m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha); m_sprite.graphics.moveTo((vertices[0].x * m_drawScale), (vertices[0].y * m_drawScale)); m_sprite.graphics.beginFill(color.color, m_fillAlpha); var i = 1; while (i < vertexCount) { m_sprite.graphics.lineTo((vertices[i].x * m_drawScale), (vertices[i].y * m_drawScale)); i++; }; m_sprite.graphics.lineTo((vertices[0].x * m_drawScale), (vertices[0].y * m_drawScale)); m_sprite.graphics.endFill(); } public function DrawCircle(center:b2Vec2, radius:Number, color:b2Color):void{ m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha); m_sprite.graphics.drawCircle((center.x * m_drawScale), (center.y * m_drawScale), (radius * m_drawScale)); } public function DrawPolygon(vertices:Array, vertexCount:int, color:b2Color):void{ m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha); m_sprite.graphics.moveTo((vertices[0].x * m_drawScale), (vertices[0].y * m_drawScale)); var i = 1; while (i < vertexCount) { m_sprite.graphics.lineTo((vertices[i].x * m_drawScale), (vertices[i].y * m_drawScale)); i++; }; m_sprite.graphics.lineTo((vertices[0].x * m_drawScale), (vertices[0].y * m_drawScale)); } public function DrawSolidCircle(center:b2Vec2, radius:Number, axis:b2Vec2, color:b2Color):void{ m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha); m_sprite.graphics.moveTo(0, 0); m_sprite.graphics.beginFill(color.color, m_fillAlpha); m_sprite.graphics.drawCircle((center.x * m_drawScale), (center.y * m_drawScale), (radius * m_drawScale)); m_sprite.graphics.endFill(); m_sprite.graphics.moveTo((center.x * m_drawScale), (center.y * m_drawScale)); m_sprite.graphics.lineTo(((center.x + (axis.x * radius)) * m_drawScale), ((center.y + (axis.y * radius)) * m_drawScale)); } public function GetFlags():uint{ return (m_drawFlags); } public function DrawXForm(xf:b2XForm):void{ m_sprite.graphics.lineStyle(m_lineThickness, 0xFF0000, m_alpha); m_sprite.graphics.moveTo((xf.position.x * m_drawScale), (xf.position.y * m_drawScale)); m_sprite.graphics.lineTo(((xf.position.x + (m_xformScale * xf.R.col1.x)) * m_drawScale), ((xf.position.y + (m_xformScale * xf.R.col1.y)) * m_drawScale)); m_sprite.graphics.lineStyle(m_lineThickness, 0xFF00, m_alpha); m_sprite.graphics.moveTo((xf.position.x * m_drawScale), (xf.position.y * m_drawScale)); m_sprite.graphics.lineTo(((xf.position.x + (m_xformScale * xf.R.col2.x)) * m_drawScale), ((xf.position.y + (m_xformScale * xf.R.col2.y)) * m_drawScale)); } } }//package Box2D.Dynamics
Section 71
//b2DestructionListener (Box2D.Dynamics.b2DestructionListener) package Box2D.Dynamics { import Box2D.Collision.Shapes.*; import Box2D.Dynamics.Joints.*; public class b2DestructionListener { public function b2DestructionListener(){ super(); } public function SayGoodbyeShape(shape:b2Shape):void{ } public function SayGoodbyeJoint(joint:b2Joint):void{ } } }//package Box2D.Dynamics
Section 72
//b2Island (Box2D.Dynamics.b2Island) package Box2D.Dynamics { import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; import Box2D.Collision.*; import Box2D.Common.*; import Box2D.Dynamics.Contacts.*; public class b2Island { public var m_listener:b2ContactListener; public var m_positionIterationCount:int; public var m_bodyCapacity:int; public var m_bodies:Array; public var m_joints:Array; public var m_jointCapacity:int; public var m_contactCount:int; public var m_contacts:Array; public var m_contactCapacity:int; public var m_jointCount:int; public var m_allocator; public var m_bodyCount:int; private static var s_reportCR:b2ContactResult = new b2ContactResult(); public function b2Island(bodyCapacity:int, contactCapacity:int, jointCapacity:int, allocator, listener:b2ContactListener){ var i:int; super(); m_bodyCapacity = bodyCapacity; m_contactCapacity = contactCapacity; m_jointCapacity = jointCapacity; m_bodyCount = 0; m_contactCount = 0; m_jointCount = 0; m_allocator = allocator; m_listener = listener; m_bodies = new Array(bodyCapacity); i = 0; while (i < bodyCapacity) { m_bodies[i] = null; i++; }; m_contacts = new Array(contactCapacity); i = 0; while (i < contactCapacity) { m_contacts[i] = null; i++; }; m_joints = new Array(jointCapacity); i = 0; while (i < jointCapacity) { m_joints[i] = null; i++; }; m_positionIterationCount = 0; } public function AddBody(body:b2Body):void{ var _local2 = m_bodyCount++; m_bodies[_local2] = body; } public function AddJoint(joint:b2Joint):void{ var _local2 = m_jointCount++; m_joints[_local2] = joint; } public function Report(constraints:Array):void{ var tMat:b2Mat22; var tVec:b2Vec2; var c:b2Contact; var cc:b2ContactConstraint; var cr:b2ContactResult; var b1:b2Body; var manifoldCount:int; var manifolds:Array; var j:int; var manifold:b2Manifold; var k:int; var point:b2ManifoldPoint; var ccp:b2ContactConstraintPoint; if (m_listener == null){ return; }; var i:int; while (i < m_contactCount) { c = m_contacts[i]; cc = constraints[i]; cr = s_reportCR; cr.shape1 = c.m_shape1; cr.shape2 = c.m_shape2; b1 = cr.shape1.m_body; manifoldCount = c.m_manifoldCount; manifolds = c.GetManifolds(); j = 0; while (j < manifoldCount) { manifold = manifolds[j]; cr.normal.SetV(manifold.normal); k = 0; while (k < manifold.pointCount) { point = manifold.points[k]; ccp = cc.points[k]; cr.position = b1.GetWorldPoint(point.localPoint1); cr.normalImpulse = ccp.normalImpulse; cr.tangentImpulse = ccp.tangentImpulse; cr.id.key = point.id.key; m_listener.Result(cr); k++; }; j++; }; i++; }; } public function AddContact(contact:b2Contact):void{ var _local2 = m_contactCount++; m_contacts[_local2] = contact; } public function Solve(step:b2TimeStep, gravity:b2Vec2, correctPositions:Boolean, allowSleep:Boolean):void{ var i:int; var b:b2Body; var joint:b2Joint; var j:int; var contactsOkay:Boolean; var jointsOkay:Boolean; var jointOkay:Boolean; var minSleepTime:Number; var linTolSqr:Number; var angTolSqr:Number; i = 0; while (i < m_bodyCount) { b = m_bodies[i]; if (b.IsStatic()){ } else { b.m_linearVelocity.x = (b.m_linearVelocity.x + (step.dt * (gravity.x + (b.m_invMass * b.m_force.x)))); b.m_linearVelocity.y = (b.m_linearVelocity.y + (step.dt * (gravity.y + (b.m_invMass * b.m_force.y)))); b.m_angularVelocity = (b.m_angularVelocity + ((step.dt * b.m_invI) * b.m_torque)); b.m_force.SetZero(); b.m_torque = 0; b.m_linearVelocity.Multiply(b2Math.b2Clamp((1 - (step.dt * b.m_linearDamping)), 0, 1)); b.m_angularVelocity = (b.m_angularVelocity * b2Math.b2Clamp((1 - (step.dt * b.m_angularDamping)), 0, 1)); if (b.m_linearVelocity.LengthSquared() > b2Settings.b2_maxLinearVelocitySquared){ b.m_linearVelocity.Normalize(); b.m_linearVelocity.x = (b.m_linearVelocity.x * b2Settings.b2_maxLinearVelocity); b.m_linearVelocity.y = (b.m_linearVelocity.y * b2Settings.b2_maxLinearVelocity); }; if ((b.m_angularVelocity * b.m_angularVelocity) > b2Settings.b2_maxAngularVelocitySquared){ if (b.m_angularVelocity < 0){ b.m_angularVelocity = -(b2Settings.b2_maxAngularVelocity); } else { b.m_angularVelocity = b2Settings.b2_maxAngularVelocity; }; }; }; i++; }; var contactSolver:b2ContactSolver = new b2ContactSolver(step, m_contacts, m_contactCount, m_allocator); contactSolver.InitVelocityConstraints(step); i = 0; while (i < m_jointCount) { joint = m_joints[i]; joint.InitVelocityConstraints(step); i++; }; i = 0; while (i < step.maxIterations) { contactSolver.SolveVelocityConstraints(); j = 0; while (j < m_jointCount) { joint = m_joints[j]; joint.SolveVelocityConstraints(step); j++; }; i++; }; contactSolver.FinalizeVelocityConstraints(); i = 0; while (i < m_bodyCount) { b = m_bodies[i]; if (b.IsStatic()){ } else { b.m_sweep.c0.SetV(b.m_sweep.c); b.m_sweep.a0 = b.m_sweep.a; b.m_sweep.c.x = (b.m_sweep.c.x + (step.dt * b.m_linearVelocity.x)); b.m_sweep.c.y = (b.m_sweep.c.y + (step.dt * b.m_linearVelocity.y)); b.m_sweep.a = (b.m_sweep.a + (step.dt * b.m_angularVelocity)); b.SynchronizeTransform(); }; i++; }; if (correctPositions){ i = 0; while (i < m_jointCount) { joint = m_joints[i]; joint.InitPositionConstraints(); i++; }; m_positionIterationCount = 0; while (m_positionIterationCount < step.maxIterations) { contactsOkay = contactSolver.SolvePositionConstraints(b2Settings.b2_contactBaumgarte); jointsOkay = true; i = 0; while (i < m_jointCount) { joint = m_joints[i]; jointOkay = joint.SolvePositionConstraints(); jointsOkay = ((jointsOkay) && (jointOkay)); i++; }; if (((contactsOkay) && (jointsOkay))){ break; }; m_positionIterationCount++; }; }; Report(contactSolver.m_constraints); if (allowSleep){ minSleepTime = Number.MAX_VALUE; linTolSqr = (b2Settings.b2_linearSleepTolerance * b2Settings.b2_linearSleepTolerance); angTolSqr = (b2Settings.b2_angularSleepTolerance * b2Settings.b2_angularSleepTolerance); i = 0; while (i < m_bodyCount) { b = m_bodies[i]; if (b.m_invMass == 0){ } else { if ((b.m_flags & b2Body.e_allowSleepFlag) == 0){ b.m_sleepTime = 0; minSleepTime = 0; }; if (((((((b.m_flags & b2Body.e_allowSleepFlag) == 0)) || (((b.m_angularVelocity * b.m_angularVelocity) > angTolSqr)))) || ((b2Math.b2Dot(b.m_linearVelocity, b.m_linearVelocity) > linTolSqr)))){ b.m_sleepTime = 0; minSleepTime = 0; } else { b.m_sleepTime = (b.m_sleepTime + step.dt); minSleepTime = b2Math.b2Min(minSleepTime, b.m_sleepTime); }; }; i++; }; if (minSleepTime >= b2Settings.b2_timeToSleep){ i = 0; while (i < m_bodyCount) { b = m_bodies[i]; b.m_flags = (b.m_flags | b2Body.e_sleepFlag); b.m_linearVelocity.SetZero(); b.m_angularVelocity = 0; i++; }; }; }; } public function Clear():void{ m_bodyCount = 0; m_contactCount = 0; m_jointCount = 0; } public function SolveTOI(subStep:b2TimeStep):void{ var i:int; var b:b2Body; var contactsOkay:Boolean; var contactSolver:b2ContactSolver = new b2ContactSolver(subStep, m_contacts, m_contactCount, m_allocator); i = 0; while (i < subStep.maxIterations) { contactSolver.SolveVelocityConstraints(); i++; }; i = 0; while (i < m_bodyCount) { b = m_bodies[i]; if (b.IsStatic()){ } else { b.m_sweep.c0.SetV(b.m_sweep.c); b.m_sweep.a0 = b.m_sweep.a; b.m_sweep.c.x = (b.m_sweep.c.x + (subStep.dt * b.m_linearVelocity.x)); b.m_sweep.c.y = (b.m_sweep.c.y + (subStep.dt * b.m_linearVelocity.y)); b.m_sweep.a = (b.m_sweep.a + (subStep.dt * b.m_angularVelocity)); b.SynchronizeTransform(); }; i++; }; var k_toiBaumgarte:Number = 0.75; i = 0; while (i < subStep.maxIterations) { contactsOkay = contactSolver.SolvePositionConstraints(k_toiBaumgarte); if (contactsOkay){ break; }; i++; }; Report(contactSolver.m_constraints); } } }//package Box2D.Dynamics
Section 73
//b2TimeStep (Box2D.Dynamics.b2TimeStep) package Box2D.Dynamics { public class b2TimeStep { public var warmStarting:Boolean; public var positionCorrection:Boolean; public var dt:Number; public var maxIterations:int; public var dtRatio:Number; public var inv_dt:Number; public function b2TimeStep(){ super(); } } }//package Box2D.Dynamics
Section 74
//b2World (Box2D.Dynamics.b2World) package Box2D.Dynamics { import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; import Box2D.Collision.*; import Box2D.Common.*; import Box2D.Dynamics.Contacts.*; public class b2World { public var m_inv_dt0:Number; public var m_boundaryListener:b2BoundaryListener; public var m_contactList:b2Contact; public var m_blockAllocator; public var m_contactListener:b2ContactListener; public var m_raycastSegment:b2Segment; public var m_broadPhase:b2BroadPhase; public var m_destructionListener:b2DestructionListener; public var m_jointCount:int; public var m_lock:Boolean; public var m_bodyCount:int; public var m_raycastUserData; public var m_allowSleep:Boolean; public var m_positionIterationCount:int; public var m_groundBody:b2Body; public var m_contactCount:int; public var m_raycastNormal:b2Vec2; public var m_contactFilter:b2ContactFilter; public var m_bodyList:b2Body; public var m_debugDraw:b2DebugDraw; public var m_stackAllocator; public var m_jointList:b2Joint; public var m_gravity:b2Vec2; public var m_contactManager:b2ContactManager; private static var s_jointColor:b2Color = new b2Color(0.5, 0.8, 0.8); public static var m_continuousPhysics:Boolean; public static var m_warmStarting:Boolean; private static var s_coreColor:b2Color = new b2Color(0.9, 0.6, 0.6); public static var m_positionCorrection:Boolean; private static var s_xf:b2XForm = new b2XForm(); public function b2World(worldAABB:b2AABB, gravity:b2Vec2, doSleep:Boolean){ m_raycastNormal = new b2Vec2(); m_contactManager = new b2ContactManager(); super(); m_destructionListener = null; m_boundaryListener = null; m_contactFilter = b2ContactFilter.b2_defaultFilter; m_contactListener = null; m_debugDraw = null; m_bodyList = null; m_contactList = null; m_jointList = null; m_bodyCount = 0; m_contactCount = 0; m_jointCount = 0; m_positionCorrection = true; m_warmStarting = true; m_continuousPhysics = true; m_allowSleep = doSleep; m_gravity = gravity; m_lock = false; m_inv_dt0 = 0; m_contactManager.m_world = this; m_broadPhase = new b2BroadPhase(worldAABB, m_contactManager); var bd:b2BodyDef = new b2BodyDef(); m_groundBody = CreateBody(bd); } public function DrawJoint(joint:b2Joint):void{ var pulley:b2PulleyJoint; var s1:b2Vec2; var s2:b2Vec2; var b1:b2Body = joint.m_body1; var b2:b2Body = joint.m_body2; var xf1:b2XForm = b1.m_xf; var xf2:b2XForm = b2.m_xf; var x1:b2Vec2 = xf1.position; var x2:b2Vec2 = xf2.position; var p1:b2Vec2 = joint.GetAnchor1(); var p2:b2Vec2 = joint.GetAnchor2(); var color:b2Color = s_jointColor; switch (joint.m_type){ case b2Joint.e_distanceJoint: m_debugDraw.DrawSegment(p1, p2, color); break; case b2Joint.e_pulleyJoint: pulley = (joint as b2PulleyJoint); s1 = pulley.GetGroundAnchor1(); s2 = pulley.GetGroundAnchor2(); m_debugDraw.DrawSegment(s1, p1, color); m_debugDraw.DrawSegment(s2, p2, color); m_debugDraw.DrawSegment(s1, s2, color); break; case b2Joint.e_mouseJoint: m_debugDraw.DrawSegment(p1, p2, color); break; default: if (b1 != m_groundBody){ m_debugDraw.DrawSegment(x1, p1, color); }; m_debugDraw.DrawSegment(p1, p2, color); if (b2 != m_groundBody){ m_debugDraw.DrawSegment(x2, p2, color); }; }; } public function Refilter(shape:b2Shape):void{ shape.RefilterProxy(m_broadPhase, shape.m_body.m_xf); } public function SetDebugDraw(debugDraw:b2DebugDraw):void{ m_debugDraw = debugDraw; } public function SetContinuousPhysics(flag:Boolean):void{ m_continuousPhysics = flag; } public function GetProxyCount():int{ return (m_broadPhase.m_proxyCount); } public function DrawDebugData():void{ var i:int; var b:b2Body; var s:b2Shape; var j:b2Joint; var bp:b2BroadPhase; var xf:b2XForm; var core:Boolean; var index:uint; var pair:b2Pair; var p1:b2Proxy; var p2:b2Proxy; var worldLower:b2Vec2; var worldUpper:b2Vec2; var p:b2Proxy; var poly:b2PolygonShape; var obb:b2OBB; var h:b2Vec2; var tMat:b2Mat22; var tVec:b2Vec2; var tX:Number; if (m_debugDraw == null){ return; }; m_debugDraw.m_sprite.graphics.clear(); var flags:uint = m_debugDraw.GetFlags(); var invQ:b2Vec2 = new b2Vec2(); var x1:b2Vec2 = new b2Vec2(); var x2:b2Vec2 = new b2Vec2(); var color:b2Color = new b2Color(0, 0, 0); var b1:b2AABB = new b2AABB(); var b2:b2AABB = new b2AABB(); var vs:Array = [new b2Vec2(), new b2Vec2(), new b2Vec2(), new b2Vec2()]; if ((flags & b2DebugDraw.e_shapeBit)){ core = ((flags & b2DebugDraw.e_coreShapeBit) == b2DebugDraw.e_coreShapeBit); b = m_bodyList; while (b) { xf = b.m_xf; s = b.GetShapeList(); while (s) { if (b.IsStatic()){ DrawShape(s, xf, new b2Color(0.5, 0.9, 0.5), core); } else { if (b.IsSleeping()){ DrawShape(s, xf, new b2Color(0.5, 0.5, 0.9), core); } else { DrawShape(s, xf, new b2Color(0.9, 0.9, 0.9), core); }; }; s = s.m_next; }; b = b.m_next; }; }; if ((flags & b2DebugDraw.e_jointBit)){ j = m_jointList; while (j) { DrawJoint(j); j = j.m_next; }; }; if ((flags & b2DebugDraw.e_pairBit)){ bp = m_broadPhase; invQ.Set((1 / bp.m_quantizationFactor.x), (1 / bp.m_quantizationFactor.y)); color.Set(0.9, 0.9, 0.3); i = 0; while (i < b2Pair.b2_tableCapacity) { index = bp.m_pairManager.m_hashTable[i]; while (index != b2Pair.b2_nullPair) { pair = bp.m_pairManager.m_pairs[index]; p1 = bp.m_proxyPool[pair.proxyId1]; p2 = bp.m_proxyPool[pair.proxyId2]; b1.lowerBound.x = (bp.m_worldAABB.lowerBound.x + (invQ.x * bp.m_bounds[0][p1.lowerBounds[0]].value)); b1.lowerBound.y = (bp.m_worldAABB.lowerBound.y + (invQ.y * bp.m_bounds[1][p1.lowerBounds[1]].value)); b1.upperBound.x = (bp.m_worldAABB.lowerBound.x + (invQ.x * bp.m_bounds[0][p1.upperBounds[0]].value)); b1.upperBound.y = (bp.m_worldAABB.lowerBound.y + (invQ.y * bp.m_bounds[1][p1.upperBounds[1]].value)); b2.lowerBound.x = (bp.m_worldAABB.lowerBound.x + (invQ.x * bp.m_bounds[0][p2.lowerBounds[0]].value)); b2.lowerBound.y = (bp.m_worldAABB.lowerBound.y + (invQ.y * bp.m_bounds[1][p2.lowerBounds[1]].value)); b2.upperBound.x = (bp.m_worldAABB.lowerBound.x + (invQ.x * bp.m_bounds[0][p2.upperBounds[0]].value)); b2.upperBound.y = (bp.m_worldAABB.lowerBound.y + (invQ.y * bp.m_bounds[1][p2.upperBounds[1]].value)); x1.x = (0.5 * (b1.lowerBound.x + b1.upperBound.x)); x1.y = (0.5 * (b1.lowerBound.y + b1.upperBound.y)); x2.x = (0.5 * (b2.lowerBound.x + b2.upperBound.x)); x2.y = (0.5 * (b2.lowerBound.y + b2.upperBound.y)); m_debugDraw.DrawSegment(x1, x2, color); index = pair.next; }; i++; }; }; if ((flags & b2DebugDraw.e_aabbBit)){ bp = m_broadPhase; worldLower = bp.m_worldAABB.lowerBound; worldUpper = bp.m_worldAABB.upperBound; invQ.Set((1 / bp.m_quantizationFactor.x), (1 / bp.m_quantizationFactor.y)); color.Set(0.9, 0.3, 0.9); i = 0; while (i < b2Settings.b2_maxProxies) { p = bp.m_proxyPool[i]; if (p.IsValid() == false){ } else { b1.lowerBound.x = (worldLower.x + (invQ.x * bp.m_bounds[0][p.lowerBounds[0]].value)); b1.lowerBound.y = (worldLower.y + (invQ.y * bp.m_bounds[1][p.lowerBounds[1]].value)); b1.upperBound.x = (worldLower.x + (invQ.x * bp.m_bounds[0][p.upperBounds[0]].value)); b1.upperBound.y = (worldLower.y + (invQ.y * bp.m_bounds[1][p.upperBounds[1]].value)); vs[0].Set(b1.lowerBound.x, b1.lowerBound.y); vs[1].Set(b1.upperBound.x, b1.lowerBound.y); vs[2].Set(b1.upperBound.x, b1.upperBound.y); vs[3].Set(b1.lowerBound.x, b1.upperBound.y); m_debugDraw.DrawPolygon(vs, 4, color); }; i++; }; vs[0].Set(worldLower.x, worldLower.y); vs[1].Set(worldUpper.x, worldLower.y); vs[2].Set(worldUpper.x, worldUpper.y); vs[3].Set(worldLower.x, worldUpper.y); m_debugDraw.DrawPolygon(vs, 4, new b2Color(0.3, 0.9, 0.9)); }; if ((flags & b2DebugDraw.e_obbBit)){ color.Set(0.5, 0.3, 0.5); b = m_bodyList; while (b) { xf = b.m_xf; s = b.GetShapeList(); while (s) { if (s.m_type != b2Shape.e_polygonShape){ } else { poly = (s as b2PolygonShape); obb = poly.GetOBB(); h = obb.extents; vs[0].Set(-(h.x), -(h.y)); vs[1].Set(h.x, -(h.y)); vs[2].Set(h.x, h.y); vs[3].Set(-(h.x), h.y); i = 0; while (i < 4) { tMat = obb.R; tVec = vs[i]; tX = (obb.center.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); vs[i].y = (obb.center.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); vs[i].x = tX; tMat = xf.R; tX = (xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); vs[i].y = (xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); vs[i].x = tX; i++; }; m_debugDraw.DrawPolygon(vs, 4, color); }; s = s.m_next; }; b = b.m_next; }; }; if ((flags & b2DebugDraw.e_centerOfMassBit)){ b = m_bodyList; while (b) { xf = s_xf; xf.R = b.m_xf.R; xf.position = b.GetWorldCenter(); m_debugDraw.DrawXForm(xf); b = b.m_next; }; }; } public function DestroyBody(b:b2Body):void{ var jn0:b2JointEdge; var s0:b2Shape; if (m_lock == true){ return; }; var jn:b2JointEdge = b.m_jointList; while (jn) { jn0 = jn; jn = jn.next; if (m_destructionListener){ m_destructionListener.SayGoodbyeJoint(jn0.joint); }; DestroyJoint(jn0.joint); }; var s:b2Shape = b.m_shapeList; while (s) { s0 = s; s = s.m_next; if (m_destructionListener){ m_destructionListener.SayGoodbyeShape(s0); }; s0.DestroyProxy(m_broadPhase); b2Shape.Destroy(s0, m_blockAllocator); }; if (b.m_prev){ b.m_prev.m_next = b.m_next; }; if (b.m_next){ b.m_next.m_prev = b.m_prev; }; if (b == m_bodyList){ m_bodyList = b.m_next; }; m_bodyCount--; } public function DrawShape(shape:b2Shape, xf:b2XForm, color:b2Color, core:Boolean):void{ var circle:b2CircleShape; var center:b2Vec2; var radius:Number; var axis:b2Vec2; var i:int; var poly:b2PolygonShape; var vertexCount:int; var localVertices:Array; var vertices:Array; var localCoreVertices:Array; var coreColor:b2Color = s_coreColor; switch (shape.m_type){ case b2Shape.e_circleShape: circle = (shape as b2CircleShape); center = b2Math.b2MulX(xf, circle.m_localPosition); radius = circle.m_radius; axis = xf.R.col1; m_debugDraw.DrawSolidCircle(center, radius, axis, color); if (core){ m_debugDraw.DrawCircle(center, (radius - b2Settings.b2_toiSlop), coreColor); }; break; case b2Shape.e_polygonShape: poly = (shape as b2PolygonShape); vertexCount = poly.GetVertexCount(); localVertices = poly.GetVertices(); vertices = new Array(b2Settings.b2_maxPolygonVertices); i = 0; while (i < vertexCount) { vertices[i] = b2Math.b2MulX(xf, localVertices[i]); i++; }; m_debugDraw.DrawSolidPolygon(vertices, vertexCount, color); if (core){ localCoreVertices = poly.GetCoreVertices(); i = 0; while (i < vertexCount) { vertices[i] = b2Math.b2MulX(xf, localCoreVertices[i]); i++; }; m_debugDraw.DrawPolygon(vertices, vertexCount, coreColor); }; break; }; } public function GetGroundBody():b2Body{ return (m_groundBody); } public function SetContactFilter(filter:b2ContactFilter):void{ m_contactFilter = filter; } public function Solve(step:b2TimeStep):void{ var b:b2Body; var stackCount:int; var i:int; var other:b2Body; var cn:b2ContactEdge; var jn:b2JointEdge; var inRange:Boolean; m_positionIterationCount = 0; var island:b2Island = new b2Island(m_bodyCount, m_contactCount, m_jointCount, m_stackAllocator, m_contactListener); b = m_bodyList; while (b) { b.m_flags = (b.m_flags & ~(b2Body.e_islandFlag)); b = b.m_next; }; var c:b2Contact = m_contactList; while (c) { c.m_flags = (c.m_flags & ~(b2Contact.e_islandFlag)); c = c.m_next; }; var j:b2Joint = m_jointList; while (j) { j.m_islandFlag = false; j = j.m_next; }; var stackSize:int = m_bodyCount; var stack:Array = new Array(stackSize); var seed:b2Body = m_bodyList; while (seed) { if ((seed.m_flags & ((b2Body.e_islandFlag | b2Body.e_sleepFlag) | b2Body.e_frozenFlag))){ } else { if (seed.IsStatic()){ } else { island.Clear(); stackCount = 0; var _temp1 = stackCount; stackCount = (stackCount + 1); var _local15 = _temp1; stack[_local15] = seed; seed.m_flags = (seed.m_flags | b2Body.e_islandFlag); while (stackCount > 0) { --stackCount; b = stack[stackCount]; island.AddBody(b); b.m_flags = (b.m_flags & ~(b2Body.e_sleepFlag)); if (b.IsStatic()){ } else { cn = b.m_contactList; while (cn) { if ((cn.contact.m_flags & (b2Contact.e_islandFlag | b2Contact.e_nonSolidFlag))){ } else { if (cn.contact.m_manifoldCount == 0){ } else { island.AddContact(cn.contact); cn.contact.m_flags = (cn.contact.m_flags | b2Contact.e_islandFlag); other = cn.other; if ((other.m_flags & b2Body.e_islandFlag)){ } else { var _temp2 = stackCount; stackCount = (stackCount + 1); var _local16 = _temp2; stack[_local16] = other; other.m_flags = (other.m_flags | b2Body.e_islandFlag); }; }; }; cn = cn.next; }; jn = b.m_jointList; while (jn) { if (jn.joint.m_islandFlag == true){ } else { island.AddJoint(jn.joint); jn.joint.m_islandFlag = true; other = jn.other; if ((other.m_flags & b2Body.e_islandFlag)){ } else { var _temp3 = stackCount; stackCount = (stackCount + 1); _local16 = _temp3; stack[_local16] = other; other.m_flags = (other.m_flags | b2Body.e_islandFlag); }; }; jn = jn.next; }; }; }; island.Solve(step, m_gravity, m_positionCorrection, m_allowSleep); if (island.m_positionIterationCount > m_positionIterationCount){ m_positionIterationCount = island.m_positionIterationCount; }; i = 0; while (i < island.m_bodyCount) { b = island.m_bodies[i]; if (b.IsStatic()){ b.m_flags = (b.m_flags & ~(b2Body.e_islandFlag)); }; i++; }; }; }; seed = seed.m_next; }; b = m_bodyList; while (b) { if ((b.m_flags & (b2Body.e_sleepFlag | b2Body.e_frozenFlag))){ } else { if (b.IsStatic()){ } else { inRange = b.SynchronizeShapes(); if ((((inRange == false)) && (!((m_boundaryListener == null))))){ m_boundaryListener.Violation(b); }; }; }; b = b.m_next; }; m_broadPhase.Commit(); } public function Query(aabb:b2AABB, shapes:Array, maxCount:int):int{ var results:Array = new Array(maxCount); var count:int = m_broadPhase.QueryAABB(aabb, results, maxCount); var i:int; while (i < count) { shapes[i] = results[i]; i++; }; return (count); } public function GetContactCount():int{ return (m_contactCount); } public function SolveTOI(step:b2TimeStep):void{ var b:b2Body; var s1:b2Shape; var s2:b2Shape; var b1:b2Body; var b2:b2Body; var cn:b2ContactEdge; var c:b2Contact; var minContact:b2Contact; var minTOI:Number; var seed:b2Body; var stackCount:int; var subStep:b2TimeStep; var i:int; var toi:Number; var t0:Number; var other:b2Body; var inRange:Boolean; var island:b2Island = new b2Island(m_bodyCount, b2Settings.b2_maxTOIContactsPerIsland, 0, m_stackAllocator, m_contactListener); var stackSize:int = m_bodyCount; var stack:Array = new Array(stackSize); b = m_bodyList; while (b) { b.m_flags = (b.m_flags & ~(b2Body.e_islandFlag)); b.m_sweep.t0 = 0; b = b.m_next; }; c = m_contactList; while (c) { c.m_flags = (c.m_flags & ~((b2Contact.e_toiFlag | b2Contact.e_islandFlag))); c = c.m_next; }; while (true) { minContact = null; minTOI = 1; c = m_contactList; for (;c;(c = c.m_next)) { if ((c.m_flags & (b2Contact.e_slowFlag | b2Contact.e_nonSolidFlag))){ } else { toi = 1; if ((c.m_flags & b2Contact.e_toiFlag)){ toi = c.m_toi; } else { s1 = c.m_shape1; s2 = c.m_shape2; b1 = s1.m_body; b2 = s2.m_body; if (((((b1.IsStatic()) || (b1.IsSleeping()))) && (((b2.IsStatic()) || (b2.IsSleeping()))))){ continue; }; t0 = b1.m_sweep.t0; if (b1.m_sweep.t0 < b2.m_sweep.t0){ t0 = b2.m_sweep.t0; b1.m_sweep.Advance(t0); } else { if (b2.m_sweep.t0 < b1.m_sweep.t0){ t0 = b1.m_sweep.t0; b2.m_sweep.Advance(t0); }; }; toi = b2TimeOfImpact.TimeOfImpact(c.m_shape1, b1.m_sweep, c.m_shape2, b2.m_sweep); if ((((toi > 0)) && ((toi < 1)))){ toi = (((1 - toi) * t0) + toi); if (toi > 1){ toi = 1; }; }; c.m_toi = toi; c.m_flags = (c.m_flags | b2Contact.e_toiFlag); }; if ((((Number.MIN_VALUE < toi)) && ((toi < minTOI)))){ minContact = c; minTOI = toi; }; }; }; if ((((minContact == null)) || (((1 - (100 * Number.MIN_VALUE)) < minTOI)))){ break; }; s1 = minContact.m_shape1; s2 = minContact.m_shape2; b1 = s1.m_body; b2 = s2.m_body; b1.Advance(minTOI); b2.Advance(minTOI); minContact.Update(m_contactListener); minContact.m_flags = (minContact.m_flags & ~(b2Contact.e_toiFlag)); if (minContact.m_manifoldCount == 0){ } else { seed = b1; if (seed.IsStatic()){ seed = b2; }; island.Clear(); stackCount = 0; var _temp1 = stackCount; stackCount = (stackCount + 1); var _local22 = _temp1; stack[_local22] = seed; seed.m_flags = (seed.m_flags | b2Body.e_islandFlag); while (stackCount > 0) { --stackCount; b = stack[stackCount]; island.AddBody(b); b.m_flags = (b.m_flags & ~(b2Body.e_sleepFlag)); if (b.IsStatic()){ } else { cn = b.m_contactList; while (cn) { if (island.m_contactCount == island.m_contactCapacity){ } else { if ((cn.contact.m_flags & ((b2Contact.e_islandFlag | b2Contact.e_slowFlag) | b2Contact.e_nonSolidFlag))){ } else { if (cn.contact.m_manifoldCount == 0){ } else { island.AddContact(cn.contact); cn.contact.m_flags = (cn.contact.m_flags | b2Contact.e_islandFlag); other = cn.other; if ((other.m_flags & b2Body.e_islandFlag)){ } else { if (other.IsStatic() == false){ other.Advance(minTOI); other.WakeUp(); }; var _temp2 = stackCount; stackCount = (stackCount + 1); var _local23 = _temp2; stack[_local23] = other; other.m_flags = (other.m_flags | b2Body.e_islandFlag); }; }; }; }; cn = cn.next; }; }; }; subStep = new b2TimeStep(); subStep.dt = ((1 - minTOI) * step.dt); subStep.inv_dt = (1 / subStep.dt); subStep.maxIterations = step.maxIterations; island.SolveTOI(subStep); i = 0; while (i < island.m_bodyCount) { b = island.m_bodies[i]; b.m_flags = (b.m_flags & ~(b2Body.e_islandFlag)); if ((b.m_flags & (b2Body.e_sleepFlag | b2Body.e_frozenFlag))){ } else { if (b.IsStatic()){ } else { inRange = b.SynchronizeShapes(); if ((((inRange == false)) && (!((m_boundaryListener == null))))){ m_boundaryListener.Violation(b); }; cn = b.m_contactList; while (cn) { cn.contact.m_flags = (cn.contact.m_flags & ~(b2Contact.e_toiFlag)); cn = cn.next; }; }; }; i++; }; i = 0; while (i < island.m_contactCount) { c = island.m_contacts[i]; c.m_flags = (c.m_flags & ~((b2Contact.e_toiFlag | b2Contact.e_islandFlag))); i++; }; m_broadPhase.Commit(); }; }; } public function GetJointList():b2Joint{ return (m_jointList); } public function Validate():void{ m_broadPhase.Validate(); } public function SetGravity(gravity:b2Vec2):void{ m_gravity = gravity; } public function GetPairCount():int{ return (m_broadPhase.m_pairManager.m_pairCount); } public function GetBodyList():b2Body{ return (m_bodyList); } public function SetWarmStarting(flag:Boolean):void{ m_warmStarting = flag; } public function SetPositionCorrection(flag:Boolean):void{ m_positionCorrection = flag; } public function CreateJoint(def:b2JointDef):b2Joint{ var b:b2Body; var s:b2Shape; var j:b2Joint = b2Joint.Create(def, m_blockAllocator); j.m_prev = null; j.m_next = m_jointList; if (m_jointList){ m_jointList.m_prev = j; }; m_jointList = j; m_jointCount++; j.m_node1.joint = j; j.m_node1.other = j.m_body2; j.m_node1.prev = null; j.m_node1.next = j.m_body1.m_jointList; if (j.m_body1.m_jointList){ j.m_body1.m_jointList.prev = j.m_node1; }; j.m_body1.m_jointList = j.m_node1; j.m_node2.joint = j; j.m_node2.other = j.m_body1; j.m_node2.prev = null; j.m_node2.next = j.m_body2.m_jointList; if (j.m_body2.m_jointList){ j.m_body2.m_jointList.prev = j.m_node2; }; j.m_body2.m_jointList = j.m_node2; if (def.collideConnected == false){ b = ((def.body1.m_shapeCount < def.body2.m_shapeCount)) ? def.body1 : def.body2; s = b.m_shapeList; while (s) { s.RefilterProxy(m_broadPhase, b.m_xf); s = s.m_next; }; }; return (j); } public function DestroyJoint(j:b2Joint):void{ var b:b2Body; var s:b2Shape; var collideConnected:Boolean = j.m_collideConnected; if (j.m_prev){ j.m_prev.m_next = j.m_next; }; if (j.m_next){ j.m_next.m_prev = j.m_prev; }; if (j == m_jointList){ m_jointList = j.m_next; }; var body1:b2Body = j.m_body1; var body2:b2Body = j.m_body2; body1.WakeUp(); body2.WakeUp(); if (j.m_node1.prev){ j.m_node1.prev.next = j.m_node1.next; }; if (j.m_node1.next){ j.m_node1.next.prev = j.m_node1.prev; }; if (j.m_node1 == body1.m_jointList){ body1.m_jointList = j.m_node1.next; }; j.m_node1.prev = null; j.m_node1.next = null; if (j.m_node2.prev){ j.m_node2.prev.next = j.m_node2.next; }; if (j.m_node2.next){ j.m_node2.next.prev = j.m_node2.prev; }; if (j.m_node2 == body2.m_jointList){ body2.m_jointList = j.m_node2.next; }; j.m_node2.prev = null; j.m_node2.next = null; b2Joint.Destroy(j, m_blockAllocator); m_jointCount--; if (collideConnected == false){ b = ((body1.m_shapeCount < body2.m_shapeCount)) ? body1 : body2; s = b.m_shapeList; while (s) { s.RefilterProxy(m_broadPhase, b.m_xf); s = s.m_next; }; }; } public function SetContactListener(listener:b2ContactListener):void{ m_contactListener = listener; } public function Raycast(segment:b2Segment, shapes:Array, maxCount:int, solidShapes:Boolean, userData):int{ var count:int; var results:Array = new Array(maxCount); m_raycastSegment = segment; m_raycastUserData = userData; if (solidShapes){ count = m_broadPhase.QuerySegment(segment, results, maxCount, RaycastSortKey); } else { count = m_broadPhase.QuerySegment(segment, results, maxCount, RaycastSortKey2); }; var i:int; while (i < count) { shapes[i] = results[i]; i++; }; return (count); } public function RaycastSortKey2(shape:b2Shape){ if (((m_contactFilter) && (!(m_contactFilter.RayCollide(m_raycastUserData, shape))))){ return (-1); }; var body:b2Body = shape.GetBody(); var xf:b2XForm = body.GetXForm(); var lambda:Array = [0]; if (shape.TestSegment(xf, lambda, m_raycastNormal, m_raycastSegment, 1) != b2Shape.e_hitCollide){ return (-1); }; return (lambda[0]); } public function RaycastOne(segment:b2Segment, lambda:Array, normal:b2Vec2, solidShapes:Boolean, userData):b2Shape{ var shapes:Array = new Array(1); var count:Number = Raycast(segment, shapes, 1, solidShapes, userData); if (count == 0){ return (null); }; if (count > 1){ trace(count); }; var shape:b2Shape = shapes[0]; var xf:b2XForm = shape.GetBody().GetXForm(); shape.TestSegment(xf, lambda, normal, segment, 1); return (shape); } public function CreateBody(def:b2BodyDef):b2Body{ if (m_lock == true){ return (null); }; var b:b2Body = new b2Body(def, this); b.m_prev = null; b.m_next = m_bodyList; if (m_bodyList){ m_bodyList.m_prev = b; }; m_bodyList = b; m_bodyCount++; return (b); } public function RaycastSortKey(shape:b2Shape){ if (((m_contactFilter) && (!(m_contactFilter.RayCollide(m_raycastUserData, shape))))){ return (-1); }; var body:b2Body = shape.GetBody(); var xf:b2XForm = body.GetXForm(); var lambda:Array = [0]; if (shape.TestSegment(xf, lambda, m_raycastNormal, m_raycastSegment, 1) == b2Shape.e_missCollide){ return (-1); }; return (lambda[0]); } public function SetBoundaryListener(listener:b2BoundaryListener):void{ m_boundaryListener = listener; } public function SetDestructionListener(listener:b2DestructionListener):void{ m_destructionListener = listener; } public function Step(dt:Number, iterations:int):void{ m_lock = true; var step:b2TimeStep = new b2TimeStep(); step.dt = dt; step.maxIterations = iterations; if (dt > 0){ step.inv_dt = (1 / dt); } else { step.inv_dt = 0; }; step.dtRatio = (m_inv_dt0 * dt); step.positionCorrection = m_positionCorrection; step.warmStarting = m_warmStarting; m_contactManager.Collide(); if (step.dt > 0){ Solve(step); }; if (((m_continuousPhysics) && ((step.dt > 0)))){ SolveTOI(step); }; DrawDebugData(); m_inv_dt0 = step.inv_dt; m_lock = false; } public function GetBodyCount():int{ return (m_bodyCount); } public function GetJointCount():int{ return (m_jointCount); } } }//package Box2D.Dynamics
Section 75
//AuxFunctions (caurina.transitions.AuxFunctions) package caurina.transitions { public class AuxFunctions { public function AuxFunctions(){ super(); } public static function concatObjects(... _args):Object{ var currentObject:Object; var prop:String; var finalObject:Object = {}; var i:int; while (i < _args.length) { currentObject = _args[i]; for (prop in currentObject) { if (currentObject[prop] == null){ delete finalObject[prop]; } else { finalObject[prop] = currentObject[prop]; }; }; i++; }; return (finalObject); } public static function numberToG(p_num:Number):Number{ return (((p_num & 0xFF00) >> 8)); } public static function numberToR(p_num:Number):Number{ return (((p_num & 0xFF0000) >> 16)); } public static function isInArray(p_string:String, p_array:Array):Boolean{ var l:uint = p_array.length; var i:uint; while (i < l) { if (p_array[i] == p_string){ return (true); }; i++; }; return (false); } public static function getObjectLength(p_object:Object):uint{ var pName:String; var totalProperties:uint; for (pName in p_object) { totalProperties++; }; return (totalProperties); } public static function numberToB(p_num:Number):Number{ return ((p_num & 0xFF)); } } }//package caurina.transitions
Section 76
//Equations (caurina.transitions.Equations) package caurina.transitions { public class Equations { public function Equations(){ super(); trace("Equations is a static class and should not be instantiated."); } public static function easeOutBounce(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); if (t < (1 / 2.75)){ return (((c * ((7.5625 * t) * t)) + b)); }; if (t < (2 / 2.75)){ t = (t - (1.5 / 2.75)); return (((c * (((7.5625 * t) * t) + 0.75)) + b)); }; if (t < (2.5 / 2.75)){ t = (t - (2.25 / 2.75)); return (((c * (((7.5625 * t) * t) + 0.9375)) + b)); }; t = (t - (2.625 / 2.75)); return (((c * (((7.5625 * t) * t) + 0.984375)) + b)); } public static function easeInOutElastic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number; if (t == 0){ return (b); }; t = (t / (d / 2)); if (t == 2){ return ((b + c)); }; var p:Number = (((!(Boolean(p_params))) || (isNaN(p_params.period)))) ? (d * (0.3 * 1.5)) : p_params.period; var a:Number = (((!(Boolean(p_params))) || (isNaN(p_params.amplitude)))) ? 0 : p_params.amplitude; if (((!(Boolean(a))) || ((a < Math.abs(c))))){ a = c; s = (p / 4); } else { s = ((p / (2 * Math.PI)) * Math.asin((c / a))); }; if (t < 1){ --t; return (((-0.5 * ((a * Math.pow(2, (10 * t))) * Math.sin(((((t * d) - s) * (2 * Math.PI)) / p)))) + b)); }; --t; return ((((((a * Math.pow(2, (-10 * t))) * Math.sin(((((t * d) - s) * (2 * Math.PI)) / p))) * 0.5) + c) + b)); } public static function easeInOutQuad(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return (((((c / 2) * t) * t) + b)); }; --t; return ((((-(c) / 2) * ((t * (t - 2)) - 1)) + b)); } public static function easeInOutBounce(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (((easeInBounce((t * 2), 0, c, d) * 0.5) + b)); }; return ((((easeOutBounce(((t * 2) - d), 0, c, d) * 0.5) + (c * 0.5)) + b)); } public static function easeInOutBack(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number = (((!(Boolean(p_params))) || (isNaN(p_params.overshoot)))) ? 1.70158 : p_params.overshoot; t = (t / (d / 2)); if (t < 1){ s = (s * 1.525); return ((((c / 2) * ((t * t) * (((s + 1) * t) - s))) + b)); }; t = (t - 2); s = (s * 1.525); return ((((c / 2) * (((t * t) * (((s + 1) * t) + s)) + 2)) + b)); } public static function easeOutInCubic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutCubic((t * 2), b, (c / 2), d, p_params)); }; return (easeInCubic(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeNone(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return ((((c * t) / d) + b)); } public static function easeOutBack(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number = (((!(Boolean(p_params))) || (isNaN(p_params.overshoot)))) ? 1.70158 : p_params.overshoot; t = ((t / d) - 1); return (((c * (((t * t) * (((s + 1) * t) + s)) + 1)) + b)); } public static function easeInOutSine(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return ((((-(c) / 2) * (Math.cos(((Math.PI * t) / d)) - 1)) + b)); } public static function easeInBack(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number = (((!(Boolean(p_params))) || (isNaN(p_params.overshoot)))) ? 1.70158 : p_params.overshoot; t = (t / d); return (((((c * t) * t) * (((s + 1) * t) - s)) + b)); } public static function easeInQuart(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return ((((((c * t) * t) * t) * t) + b)); } public static function easeOutInQuint(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutQuint((t * 2), b, (c / 2), d, p_params)); }; return (easeInQuint(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeOutInBounce(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutBounce((t * 2), b, (c / 2), d, p_params)); }; return (easeInBounce(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function init():void{ Tweener.registerTransition("easenone", easeNone); Tweener.registerTransition("linear", easeNone); Tweener.registerTransition("easeinquad", easeInQuad); Tweener.registerTransition("easeoutquad", easeOutQuad); Tweener.registerTransition("easeinoutquad", easeInOutQuad); Tweener.registerTransition("easeoutinquad", easeOutInQuad); Tweener.registerTransition("easeincubic", easeInCubic); Tweener.registerTransition("easeoutcubic", easeOutCubic); Tweener.registerTransition("easeinoutcubic", easeInOutCubic); Tweener.registerTransition("easeoutincubic", easeOutInCubic); Tweener.registerTransition("easeinquart", easeInQuart); Tweener.registerTransition("easeoutquart", easeOutQuart); Tweener.registerTransition("easeinoutquart", easeInOutQuart); Tweener.registerTransition("easeoutinquart", easeOutInQuart); Tweener.registerTransition("easeinquint", easeInQuint); Tweener.registerTransition("easeoutquint", easeOutQuint); Tweener.registerTransition("easeinoutquint", easeInOutQuint); Tweener.registerTransition("easeoutinquint", easeOutInQuint); Tweener.registerTransition("easeinsine", easeInSine); Tweener.registerTransition("easeoutsine", easeOutSine); Tweener.registerTransition("easeinoutsine", easeInOutSine); Tweener.registerTransition("easeoutinsine", easeOutInSine); Tweener.registerTransition("easeincirc", easeInCirc); Tweener.registerTransition("easeoutcirc", easeOutCirc); Tweener.registerTransition("easeinoutcirc", easeInOutCirc); Tweener.registerTransition("easeoutincirc", easeOutInCirc); Tweener.registerTransition("easeinexpo", easeInExpo); Tweener.registerTransition("easeoutexpo", easeOutExpo); Tweener.registerTransition("easeinoutexpo", easeInOutExpo); Tweener.registerTransition("easeoutinexpo", easeOutInExpo); Tweener.registerTransition("easeinelastic", easeInElastic); Tweener.registerTransition("easeoutelastic", easeOutElastic); Tweener.registerTransition("easeinoutelastic", easeInOutElastic); Tweener.registerTransition("easeoutinelastic", easeOutInElastic); Tweener.registerTransition("easeinback", easeInBack); Tweener.registerTransition("easeoutback", easeOutBack); Tweener.registerTransition("easeinoutback", easeInOutBack); Tweener.registerTransition("easeoutinback", easeOutInBack); Tweener.registerTransition("easeinbounce", easeInBounce); Tweener.registerTransition("easeoutbounce", easeOutBounce); Tweener.registerTransition("easeinoutbounce", easeInOutBounce); Tweener.registerTransition("easeoutinbounce", easeOutInBounce); } public static function easeOutExpo(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return (((t)==d) ? (b + c) : (((c * 1.001) * (-(Math.pow(2, ((-10 * t) / d))) + 1)) + b)); } public static function easeOutInBack(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutBack((t * 2), b, (c / 2), d, p_params)); }; return (easeInBack(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeInExpo(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return (((t)==0) ? b : (((c * Math.pow(2, (10 * ((t / d) - 1)))) + b) - (c * 0.001))); } public static function easeInCubic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return (((((c * t) * t) * t) + b)); } public static function easeInQuint(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return (((((((c * t) * t) * t) * t) * t) + b)); } public static function easeInOutCirc(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return ((((-(c) / 2) * (Math.sqrt((1 - (t * t))) - 1)) + b)); }; t = (t - 2); return ((((c / 2) * (Math.sqrt((1 - (t * t))) + 1)) + b)); } public static function easeInQuad(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return ((((c * t) * t) + b)); } public static function easeInBounce(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return (((c - easeOutBounce((d - t), 0, c, d)) + b)); } public static function easeOutInExpo(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutExpo((t * 2), b, (c / 2), d, p_params)); }; return (easeInExpo(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeOutQuart(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = ((t / d) - 1); return (((-(c) * ((((t * t) * t) * t) - 1)) + b)); } public static function easeInSine(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return ((((-(c) * Math.cos(((t / d) * (Math.PI / 2)))) + c) + b)); } public static function easeInOutQuart(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return (((((((c / 2) * t) * t) * t) * t) + b)); }; t = (t - 2); return ((((-(c) / 2) * ((((t * t) * t) * t) - 2)) + b)); } public static function easeOutQuad(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return ((((-(c) * t) * (t - 2)) + b)); } public static function easeOutInElastic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutElastic((t * 2), b, (c / 2), d, p_params)); }; return (easeInElastic(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeInElastic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number; if (t == 0){ return (b); }; t = (t / d); if (t == 1){ return ((b + c)); }; var p:Number = (((!(Boolean(p_params))) || (isNaN(p_params.period)))) ? (d * 0.3) : p_params.period; var a:Number = (((!(Boolean(p_params))) || (isNaN(p_params.amplitude)))) ? 0 : p_params.amplitude; if (((!(Boolean(a))) || ((a < Math.abs(c))))){ a = c; s = (p / 4); } else { s = ((p / (2 * Math.PI)) * Math.asin((c / a))); }; --t; return ((-(((a * Math.pow(2, (10 * t))) * Math.sin(((((t * d) - s) * (2 * Math.PI)) / p)))) + b)); } public static function easeOutCubic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = ((t / d) - 1); return (((c * (((t * t) * t) + 1)) + b)); } public static function easeOutQuint(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = ((t / d) - 1); return (((c * (((((t * t) * t) * t) * t) + 1)) + b)); } public static function easeOutInQuad(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutQuad((t * 2), b, (c / 2), d, p_params)); }; return (easeInQuad(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeOutSine(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return (((c * Math.sin(((t / d) * (Math.PI / 2)))) + b)); } public static function easeInOutCubic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return ((((((c / 2) * t) * t) * t) + b)); }; t = (t - 2); return ((((c / 2) * (((t * t) * t) + 2)) + b)); } public static function easeInOutQuint(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return ((((((((c / 2) * t) * t) * t) * t) * t) + b)); }; t = (t - 2); return ((((c / 2) * (((((t * t) * t) * t) * t) + 2)) + b)); } public static function easeInCirc(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return (((-(c) * (Math.sqrt((1 - (t * t))) - 1)) + b)); } public static function easeOutInSine(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutSine((t * 2), b, (c / 2), d, p_params)); }; return (easeInSine(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeInOutExpo(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t == 0){ return (b); }; if (t == d){ return ((b + c)); }; t = (t / (d / 2)); if (t < 1){ return (((((c / 2) * Math.pow(2, (10 * (t - 1)))) + b) - (c * 0.0005))); }; --t; return (((((c / 2) * 1.0005) * (-(Math.pow(2, (-10 * t))) + 2)) + b)); } public static function easeOutElastic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number; if (t == 0){ return (b); }; t = (t / d); if (t == 1){ return ((b + c)); }; var p:Number = (((!(Boolean(p_params))) || (isNaN(p_params.period)))) ? (d * 0.3) : p_params.period; var a:Number = (((!(Boolean(p_params))) || (isNaN(p_params.amplitude)))) ? 0 : p_params.amplitude; if (((!(Boolean(a))) || ((a < Math.abs(c))))){ a = c; s = (p / 4); } else { s = ((p / (2 * Math.PI)) * Math.asin((c / a))); }; return (((((a * Math.pow(2, (-10 * t))) * Math.sin(((((t * d) - s) * (2 * Math.PI)) / p))) + c) + b)); } public static function easeOutCirc(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = ((t / d) - 1); return (((c * Math.sqrt((1 - (t * t)))) + b)); } public static function easeOutInQuart(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutQuart((t * 2), b, (c / 2), d, p_params)); }; return (easeInQuart(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeOutInCirc(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutCirc((t * 2), b, (c / 2), d, p_params)); }; return (easeInCirc(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } } }//package caurina.transitions
Section 77
//PropertyInfoObj (caurina.transitions.PropertyInfoObj) package caurina.transitions { public class PropertyInfoObj { public var modifierParameters:Array; public var isSpecialProperty:Boolean; public var valueComplete:Number; public var modifierFunction:Function; public var extra:Object; public var valueStart:Number; public var hasModifier:Boolean; public var arrayIndex:Number; public var originalValueComplete:Object; public function PropertyInfoObj(p_valueStart:Number, p_valueComplete:Number, p_originalValueComplete:Object, p_arrayIndex:Number, p_extra:Object, p_isSpecialProperty:Boolean, p_modifierFunction:Function, p_modifierParameters:Array){ super(); valueStart = p_valueStart; valueComplete = p_valueComplete; originalValueComplete = p_originalValueComplete; arrayIndex = p_arrayIndex; extra = p_extra; isSpecialProperty = p_isSpecialProperty; hasModifier = Boolean(p_modifierFunction); modifierFunction = p_modifierFunction; modifierParameters = p_modifierParameters; } public function toString():String{ var returnStr:String = "\n[PropertyInfoObj "; returnStr = (returnStr + ("valueStart:" + String(valueStart))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("valueComplete:" + String(valueComplete))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("originalValueComplete:" + String(originalValueComplete))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("arrayIndex:" + String(arrayIndex))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("extra:" + String(extra))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("isSpecialProperty:" + String(isSpecialProperty))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("hasModifier:" + String(hasModifier))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("modifierFunction:" + String(modifierFunction))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("modifierParameters:" + String(modifierParameters))); returnStr = (returnStr + "]\n"); return (returnStr); } public function clone():PropertyInfoObj{ var nProperty:PropertyInfoObj = new PropertyInfoObj(valueStart, valueComplete, originalValueComplete, arrayIndex, extra, isSpecialProperty, modifierFunction, modifierParameters); return (nProperty); } } }//package caurina.transitions
Section 78
//SpecialProperty (caurina.transitions.SpecialProperty) package caurina.transitions { public class SpecialProperty { public var parameters:Array; public var getValue:Function; public var preProcess:Function; public var setValue:Function; public function SpecialProperty(p_getFunction:Function, p_setFunction:Function, p_parameters:Array=null, p_preProcessFunction:Function=null){ super(); getValue = p_getFunction; setValue = p_setFunction; parameters = p_parameters; preProcess = p_preProcessFunction; } public function toString():String{ var value:String = ""; value = (value + "[SpecialProperty "); value = (value + ("getValue:" + String(getValue))); value = (value + ", "); value = (value + ("setValue:" + String(setValue))); value = (value + ", "); value = (value + ("parameters:" + String(parameters))); value = (value + ", "); value = (value + ("preProcess:" + String(preProcess))); value = (value + "]"); return (value); } } }//package caurina.transitions
Section 79
//SpecialPropertyModifier (caurina.transitions.SpecialPropertyModifier) package caurina.transitions { public class SpecialPropertyModifier { public var getValue:Function; public var modifyValues:Function; public function SpecialPropertyModifier(p_modifyFunction:Function, p_getFunction:Function){ super(); modifyValues = p_modifyFunction; getValue = p_getFunction; } public function toString():String{ var value:String = ""; value = (value + "[SpecialPropertyModifier "); value = (value + ("modifyValues:" + String(modifyValues))); value = (value + ", "); value = (value + ("getValue:" + String(getValue))); value = (value + "]"); return (value); } } }//package caurina.transitions
Section 80
//SpecialPropertySplitter (caurina.transitions.SpecialPropertySplitter) package caurina.transitions { public class SpecialPropertySplitter { public var parameters:Array; public var splitValues:Function; public function SpecialPropertySplitter(p_splitFunction:Function, p_parameters:Array){ super(); splitValues = p_splitFunction; parameters = p_parameters; } public function toString():String{ var value:String = ""; value = (value + "[SpecialPropertySplitter "); value = (value + ("splitValues:" + String(splitValues))); value = (value + ", "); value = (value + ("parameters:" + String(parameters))); value = (value + "]"); return (value); } } }//package caurina.transitions
Section 81
//Tweener (caurina.transitions.Tweener) package caurina.transitions { import flash.events.*; import flash.display.*; import flash.utils.*; public class Tweener { private static var _timeScale:Number = 1; private static var _currentTimeFrame:Number; private static var _specialPropertySplitterList:Object; private static var _engineExists:Boolean = false; private static var _specialPropertyModifierList:Object; private static var _currentTime:Number; private static var _tweenList:Array; private static var _specialPropertyList:Object; private static var _transitionList:Object; private static var _inited:Boolean = false; private static var __tweener_controller__:MovieClip; public function Tweener(){ super(); trace("Tweener is a static class and should not be instantiated."); } public static function registerSpecialPropertyModifier(p_name:String, p_modifyFunction:Function, p_getFunction:Function):void{ if (!_inited){ init(); }; var spm:SpecialPropertyModifier = new SpecialPropertyModifier(p_modifyFunction, p_getFunction); _specialPropertyModifierList[p_name] = spm; } public static function registerSpecialProperty(p_name:String, p_getFunction:Function, p_setFunction:Function, p_parameters:Array=null, p_preProcessFunction:Function=null):void{ if (!_inited){ init(); }; var sp:SpecialProperty = new SpecialProperty(p_getFunction, p_setFunction, p_parameters, p_preProcessFunction); _specialPropertyList[p_name] = sp; } public static function init(... _args):void{ _inited = true; _transitionList = new Object(); Equations.init(); _specialPropertyList = new Object(); _specialPropertyModifierList = new Object(); _specialPropertySplitterList = new Object(); } private static function updateTweens():Boolean{ var i:int; if (_tweenList.length == 0){ return (false); }; i = 0; while (i < _tweenList.length) { if ((((_tweenList[i] == undefined)) || (!(_tweenList[i].isPaused)))){ if (!updateTweenByIndex(i)){ removeTweenByIndex(i); }; if (_tweenList[i] == null){ removeTweenByIndex(i, true); i--; }; }; i++; }; return (true); } public static function addCaller(p_scopes:Object=null, p_parameters:Object=null):Boolean{ var i:Number; var rScopes:Array; var rTransition:Function; var nTween:TweenListObj; var myT:Number; var trans:String; if (!Boolean(p_scopes)){ return (false); }; if ((p_scopes is Array)){ rScopes = p_scopes.concat(); } else { rScopes = [p_scopes]; }; var p_obj:Object = p_parameters; if (!_inited){ init(); }; if (((!(_engineExists)) || (!(Boolean(__tweener_controller__))))){ startEngine(); }; var rTime:Number = (isNaN(p_obj.time)) ? 0 : p_obj.time; var rDelay:Number = (isNaN(p_obj.delay)) ? 0 : p_obj.delay; if (typeof(p_obj.transition) == "string"){ trans = p_obj.transition.toLowerCase(); rTransition = _transitionList[trans]; } else { rTransition = p_obj.transition; }; if (!Boolean(rTransition)){ rTransition = _transitionList["easeoutexpo"]; }; i = 0; while (i < rScopes.length) { if (p_obj.useFrames == true){ nTween = new TweenListObj(rScopes[i], (_currentTimeFrame + (rDelay / _timeScale)), (_currentTimeFrame + ((rDelay + rTime) / _timeScale)), true, rTransition, p_obj.transitionParams); } else { nTween = new TweenListObj(rScopes[i], (_currentTime + ((rDelay * 1000) / _timeScale)), (_currentTime + (((rDelay * 1000) + (rTime * 1000)) / _timeScale)), false, rTransition, p_obj.transitionParams); }; nTween.properties = null; nTween.onStart = p_obj.onStart; nTween.onUpdate = p_obj.onUpdate; nTween.onComplete = p_obj.onComplete; nTween.onOverwrite = p_obj.onOverwrite; nTween.onStartParams = p_obj.onStartParams; nTween.onUpdateParams = p_obj.onUpdateParams; nTween.onCompleteParams = p_obj.onCompleteParams; nTween.onOverwriteParams = p_obj.onOverwriteParams; nTween.onStartScope = p_obj.onStartScope; nTween.onUpdateScope = p_obj.onUpdateScope; nTween.onCompleteScope = p_obj.onCompleteScope; nTween.onOverwriteScope = p_obj.onOverwriteScope; nTween.onErrorScope = p_obj.onErrorScope; nTween.isCaller = true; nTween.count = p_obj.count; nTween.waitFrames = p_obj.waitFrames; _tweenList.push(nTween); if ((((rTime == 0)) && ((rDelay == 0)))){ myT = (_tweenList.length - 1); updateTweenByIndex(myT); removeTweenByIndex(myT); }; i++; }; return (true); } public static function pauseAllTweens():Boolean{ var i:uint; if (!Boolean(_tweenList)){ return (false); }; var paused:Boolean; i = 0; while (i < _tweenList.length) { pauseTweenByIndex(i); paused = true; i++; }; return (paused); } public static function removeTweens(p_scope:Object, ... _args):Boolean{ var i:uint; var properties:Array = new Array(); i = 0; while (i < _args.length) { if ((((typeof(_args[i]) == "string")) && (!(AuxFunctions.isInArray(_args[i], properties))))){ properties.push(_args[i]); }; i++; }; return (affectTweens(removeTweenByIndex, p_scope, properties)); } public static function splitTweens(p_tween:Number, p_properties:Array):uint{ var i:uint; var pName:String; var found:Boolean; var originalTween:TweenListObj = _tweenList[p_tween]; var newTween:TweenListObj = originalTween.clone(false); i = 0; while (i < p_properties.length) { pName = p_properties[i]; if (Boolean(originalTween.properties[pName])){ originalTween.properties[pName] = undefined; delete originalTween.properties[pName]; }; i++; }; for (pName in newTween.properties) { found = false; i = 0; while (i < p_properties.length) { if (p_properties[i] == pName){ found = true; break; }; i++; }; if (!found){ newTween.properties[pName] = undefined; delete newTween.properties[pName]; }; }; _tweenList.push(newTween); return ((_tweenList.length - 1)); } public static function updateFrame():void{ _currentTimeFrame++; } public static function resumeTweenByIndex(p_tween:Number):Boolean{ var tTweening:TweenListObj = _tweenList[p_tween]; if ((((tTweening == null)) || (!(tTweening.isPaused)))){ return (false); }; var cTime:Number = getCurrentTweeningTime(tTweening); tTweening.timeStart = (tTweening.timeStart + (cTime - tTweening.timePaused)); tTweening.timeComplete = (tTweening.timeComplete + (cTime - tTweening.timePaused)); tTweening.timePaused = undefined; tTweening.isPaused = false; return (true); } public static function getVersion():String{ return ("AS3 1.31.71"); } public static function onEnterFrame(e:Event):void{ updateTime(); updateFrame(); var hasUpdated:Boolean; hasUpdated = updateTweens(); if (!hasUpdated){ stopEngine(); }; } public static function updateTime():void{ _currentTime = getTimer(); } private static function updateTweenByIndex(i:Number):Boolean{ var tTweening:TweenListObj; var mustUpdate:Boolean; var nv:Number; var t:Number; var b:Number; var c:Number; var d:Number; var pName:String; var eventScope:Object; var tScope:Object; var tProperty:Object; var pv:Number; var i = i; tTweening = _tweenList[i]; if ((((tTweening == null)) || (!(Boolean(tTweening.scope))))){ return (false); }; var isOver:Boolean; var cTime:Number = getCurrentTweeningTime(tTweening); if (cTime >= tTweening.timeStart){ tScope = tTweening.scope; if (tTweening.isCaller){ do { t = (((tTweening.timeComplete - tTweening.timeStart) / tTweening.count) * (tTweening.timesCalled + 1)); b = tTweening.timeStart; c = (tTweening.timeComplete - tTweening.timeStart); d = (tTweening.timeComplete - tTweening.timeStart); nv = tTweening.transition(t, b, c, d); //unresolved if if (Boolean(tTweening.onUpdate)){ eventScope = (Boolean(tTweening.onUpdateScope)) ? tTweening.onUpdateScope : tScope; tTweening.onUpdate.apply(eventScope, tTweening.onUpdateParams); continue; var _slot1 = e; handleError(tTweening, _slot1, "onUpdate"); }; } while (tTweening.timesCalled++, !(tTweening.timesCalled >= tTweening.count)); } else { mustUpdate = (((((tTweening.skipUpdates < 1)) || (!(tTweening.skipUpdates)))) || ((tTweening.updatesSkipped >= tTweening.skipUpdates))); if (cTime >= tTweening.timeComplete){ isOver = true; mustUpdate = true; }; if (!tTweening.hasStarted){ if (Boolean(tTweening.onStart)){ eventScope = (Boolean(tTweening.onStartScope)) ? tTweening.onStartScope : tScope; tTweening.onStart.apply(eventScope, tTweening.onStartParams); //unresolved jump var _slot1 = e; handleError(tTweening, _slot1, "onStart"); }; for (pName in tTweening.properties) { if (tTweening.properties[pName].isSpecialProperty){ if (Boolean(_specialPropertyList[pName].preProcess)){ tTweening.properties[pName].valueComplete = _specialPropertyList[pName].preProcess(tScope, _specialPropertyList[pName].parameters, tTweening.properties[pName].originalValueComplete, tTweening.properties[pName].extra); }; pv = _specialPropertyList[pName].getValue(tScope, _specialPropertyList[pName].parameters, tTweening.properties[pName].extra); } else { pv = tScope[pName]; }; tTweening.properties[pName].valueStart = (isNaN(pv)) ? tTweening.properties[pName].valueComplete : pv; }; mustUpdate = true; tTweening.hasStarted = true; }; if (mustUpdate){ for (pName in tTweening.properties) { tProperty = tTweening.properties[pName]; if (isOver){ nv = tProperty.valueComplete; } else { if (tProperty.hasModifier){ t = (cTime - tTweening.timeStart); d = (tTweening.timeComplete - tTweening.timeStart); nv = tTweening.transition(t, 0, 1, d, tTweening.transitionParams); nv = tProperty.modifierFunction(tProperty.valueStart, tProperty.valueComplete, nv, tProperty.modifierParameters); } else { t = (cTime - tTweening.timeStart); b = tProperty.valueStart; c = (tProperty.valueComplete - tProperty.valueStart); d = (tTweening.timeComplete - tTweening.timeStart); nv = tTweening.transition(t, b, c, d, tTweening.transitionParams); }; }; if (tTweening.rounded){ nv = Math.round(nv); }; if (tProperty.isSpecialProperty){ _specialPropertyList[pName].setValue(tScope, nv, _specialPropertyList[pName].parameters, tTweening.properties[pName].extra); } else { tScope[pName] = nv; }; }; tTweening.updatesSkipped = 0; if (Boolean(tTweening.onUpdate)){ eventScope = (Boolean(tTweening.onUpdateScope)) ? tTweening.onUpdateScope : tScope; tTweening.onUpdate.apply(eventScope, tTweening.onUpdateParams); //unresolved jump var _slot1 = e; handleError(tTweening, _slot1, "onUpdate"); }; } else { tTweening.updatesSkipped++; }; }; if (((isOver) && (Boolean(tTweening.onComplete)))){ eventScope = (Boolean(tTweening.onCompleteScope)) ? tTweening.onCompleteScope : tScope; tTweening.onComplete.apply(eventScope, tTweening.onCompleteParams); //unresolved jump var _slot1 = e; handleError(tTweening, _slot1, "onComplete"); }; return (!(isOver)); }; return (true); } public static function setTimeScale(p_time:Number):void{ var i:Number; var cTime:Number; if (isNaN(p_time)){ p_time = 1; }; if (p_time < 1E-5){ p_time = 1E-5; }; if (p_time != _timeScale){ if (_tweenList != null){ i = 0; while (i < _tweenList.length) { cTime = getCurrentTweeningTime(_tweenList[i]); _tweenList[i].timeStart = (cTime - (((cTime - _tweenList[i].timeStart) * _timeScale) / p_time)); _tweenList[i].timeComplete = (cTime - (((cTime - _tweenList[i].timeComplete) * _timeScale) / p_time)); if (_tweenList[i].timePaused != undefined){ _tweenList[i].timePaused = (cTime - (((cTime - _tweenList[i].timePaused) * _timeScale) / p_time)); }; i++; }; }; _timeScale = p_time; }; } public static function resumeAllTweens():Boolean{ var i:uint; if (!Boolean(_tweenList)){ return (false); }; var resumed:Boolean; i = 0; while (i < _tweenList.length) { resumeTweenByIndex(i); resumed = true; i++; }; return (resumed); } private static function handleError(pTweening:TweenListObj, pError:Error, pCallBackName:String):void{ var eventScope:Object; var pTweening = pTweening; var pError = pError; var pCallBackName = pCallBackName; if (((Boolean(pTweening.onError)) && ((pTweening.onError is Function)))){ eventScope = (Boolean(pTweening.onErrorScope)) ? pTweening.onErrorScope : pTweening.scope; pTweening.onError.apply(eventScope, [pTweening.scope, pError]); //unresolved jump var _slot1 = metaError; printError(((((String(pTweening.scope) + " raised an error while executing the 'onError' handler. Original error:\n ") + pError.getStackTrace()) + "\nonError error: ") + _slot1.getStackTrace())); } else { if (!Boolean(pTweening.onError)){ printError(((((String(pTweening.scope) + " raised an error while executing the '") + pCallBackName) + "'handler. \n") + pError.getStackTrace())); }; }; } private static function startEngine():void{ _engineExists = true; _tweenList = new Array(); __tweener_controller__ = new MovieClip(); __tweener_controller__.addEventListener(Event.ENTER_FRAME, Tweener.onEnterFrame); _currentTimeFrame = 0; updateTime(); } public static function removeAllTweens():Boolean{ var i:uint; if (!Boolean(_tweenList)){ return (false); }; var removed:Boolean; i = 0; while (i < _tweenList.length) { removeTweenByIndex(i); removed = true; i++; }; return (removed); } public static function addTween(p_scopes:Object=null, p_parameters:Object=null):Boolean{ var i:Number; var j:Number; var istr:String; var rScopes:Array; var rTransition:Function; var nProperties:Object; var nTween:TweenListObj; var myT:Number; var splitProperties:Array; var splitProperties2:Array; var tempModifiedProperties:Array; var trans:String; if (!Boolean(p_scopes)){ return (false); }; if ((p_scopes is Array)){ rScopes = p_scopes.concat(); } else { rScopes = [p_scopes]; }; var p_obj:Object = TweenListObj.makePropertiesChain(p_parameters); if (!_inited){ init(); }; if (((!(_engineExists)) || (!(Boolean(__tweener_controller__))))){ startEngine(); }; var rTime:Number = (isNaN(p_obj.time)) ? 0 : p_obj.time; var rDelay:Number = (isNaN(p_obj.delay)) ? 0 : p_obj.delay; var rProperties:Array = new Array(); var restrictedWords:Object = {time:true, delay:true, useFrames:true, skipUpdates:true, transition:true, transitionParams:true, onStart:true, onUpdate:true, onComplete:true, onOverwrite:true, onError:true, rounded:true, onStartParams:true, onUpdateParams:true, onCompleteParams:true, onOverwriteParams:true, onStartScope:true, onUpdateScope:true, onCompleteScope:true, onOverwriteScope:true, onErrorScope:true}; var modifiedProperties:Object = new Object(); for (istr in p_obj) { if (!restrictedWords[istr]){ if (_specialPropertySplitterList[istr]){ splitProperties = _specialPropertySplitterList[istr].splitValues(p_obj[istr], _specialPropertySplitterList[istr].parameters); i = 0; while (i < splitProperties.length) { if (_specialPropertySplitterList[splitProperties[i].name]){ splitProperties2 = _specialPropertySplitterList[splitProperties[i].name].splitValues(splitProperties[i].value, _specialPropertySplitterList[splitProperties[i].name].parameters); j = 0; while (j < splitProperties2.length) { rProperties[splitProperties2[j].name] = {valueStart:undefined, valueComplete:splitProperties2[j].value, arrayIndex:splitProperties2[j].arrayIndex, isSpecialProperty:false}; j++; }; } else { rProperties[splitProperties[i].name] = {valueStart:undefined, valueComplete:splitProperties[i].value, arrayIndex:splitProperties[i].arrayIndex, isSpecialProperty:false}; }; i++; }; } else { if (_specialPropertyModifierList[istr] != undefined){ tempModifiedProperties = _specialPropertyModifierList[istr].modifyValues(p_obj[istr]); i = 0; while (i < tempModifiedProperties.length) { modifiedProperties[tempModifiedProperties[i].name] = {modifierParameters:tempModifiedProperties[i].parameters, modifierFunction:_specialPropertyModifierList[istr].getValue}; i++; }; } else { rProperties[istr] = {valueStart:undefined, valueComplete:p_obj[istr]}; }; }; }; }; for (istr in rProperties) { if (_specialPropertyList[istr] != undefined){ rProperties[istr].isSpecialProperty = true; } else { if (rScopes[0][istr] == undefined){ printError((((("The property '" + istr) + "' doesn't seem to be a normal object property of ") + String(rScopes[0])) + " or a registered special property.")); }; }; }; for (istr in modifiedProperties) { if (rProperties[istr] != undefined){ rProperties[istr].modifierParameters = modifiedProperties[istr].modifierParameters; rProperties[istr].modifierFunction = modifiedProperties[istr].modifierFunction; }; }; if (typeof(p_obj.transition) == "string"){ trans = p_obj.transition.toLowerCase(); rTransition = _transitionList[trans]; } else { rTransition = p_obj.transition; }; if (!Boolean(rTransition)){ rTransition = _transitionList["easeoutexpo"]; }; i = 0; while (i < rScopes.length) { nProperties = new Object(); for (istr in rProperties) { nProperties[istr] = new PropertyInfoObj(rProperties[istr].valueStart, rProperties[istr].valueComplete, rProperties[istr].valueComplete, rProperties[istr].arrayIndex, {}, rProperties[istr].isSpecialProperty, rProperties[istr].modifierFunction, rProperties[istr].modifierParameters); }; if (p_obj.useFrames == true){ nTween = new TweenListObj(rScopes[i], (_currentTimeFrame + (rDelay / _timeScale)), (_currentTimeFrame + ((rDelay + rTime) / _timeScale)), true, rTransition, p_obj.transitionParams); } else { nTween = new TweenListObj(rScopes[i], (_currentTime + ((rDelay * 1000) / _timeScale)), (_currentTime + (((rDelay * 1000) + (rTime * 1000)) / _timeScale)), false, rTransition, p_obj.transitionParams); }; nTween.properties = nProperties; nTween.onStart = p_obj.onStart; nTween.onUpdate = p_obj.onUpdate; nTween.onComplete = p_obj.onComplete; nTween.onOverwrite = p_obj.onOverwrite; nTween.onError = p_obj.onError; nTween.onStartParams = p_obj.onStartParams; nTween.onUpdateParams = p_obj.onUpdateParams; nTween.onCompleteParams = p_obj.onCompleteParams; nTween.onOverwriteParams = p_obj.onOverwriteParams; nTween.onStartScope = p_obj.onStartScope; nTween.onUpdateScope = p_obj.onUpdateScope; nTween.onCompleteScope = p_obj.onCompleteScope; nTween.onOverwriteScope = p_obj.onOverwriteScope; nTween.onErrorScope = p_obj.onErrorScope; nTween.rounded = p_obj.rounded; nTween.skipUpdates = p_obj.skipUpdates; removeTweensByTime(nTween.scope, nTween.properties, nTween.timeStart, nTween.timeComplete); _tweenList.push(nTween); if ((((rTime == 0)) && ((rDelay == 0)))){ myT = (_tweenList.length - 1); updateTweenByIndex(myT); removeTweenByIndex(myT); }; i++; }; return (true); } public static function registerTransition(p_name:String, p_function:Function):void{ if (!_inited){ init(); }; _transitionList[p_name] = p_function; } public static function printError(p_message:String):void{ trace(("## [Tweener] Error: " + p_message)); } private static function affectTweens(p_affectFunction:Function, p_scope:Object, p_properties:Array):Boolean{ var i:uint; var affectedProperties:Array; var j:uint; var objectProperties:uint; var slicedTweenIndex:uint; var affected:Boolean; if (!Boolean(_tweenList)){ return (false); }; i = 0; while (i < _tweenList.length) { if (((_tweenList[i]) && ((_tweenList[i].scope == p_scope)))){ if (p_properties.length == 0){ p_affectFunction(i); affected = true; } else { affectedProperties = new Array(); j = 0; while (j < p_properties.length) { if (Boolean(_tweenList[i].properties[p_properties[j]])){ affectedProperties.push(p_properties[j]); }; j++; }; if (affectedProperties.length > 0){ objectProperties = AuxFunctions.getObjectLength(_tweenList[i].properties); if (objectProperties == affectedProperties.length){ p_affectFunction(i); affected = true; } else { slicedTweenIndex = splitTweens(i, affectedProperties); p_affectFunction(slicedTweenIndex); affected = true; }; }; }; }; i++; }; return (affected); } public static function getTweens(p_scope:Object):Array{ var i:uint; var pName:String; if (!Boolean(_tweenList)){ return ([]); }; var tList:Array = new Array(); i = 0; while (i < _tweenList.length) { if (((Boolean(_tweenList[i])) && ((_tweenList[i].scope == p_scope)))){ for (pName in _tweenList[i].properties) { tList.push(pName); }; }; i++; }; return (tList); } public static function isTweening(p_scope:Object):Boolean{ var i:uint; if (!Boolean(_tweenList)){ return (false); }; i = 0; while (i < _tweenList.length) { if (((Boolean(_tweenList[i])) && ((_tweenList[i].scope == p_scope)))){ return (true); }; i++; }; return (false); } public static function pauseTweenByIndex(p_tween:Number):Boolean{ var tTweening:TweenListObj = _tweenList[p_tween]; if ((((tTweening == null)) || (tTweening.isPaused))){ return (false); }; tTweening.timePaused = getCurrentTweeningTime(tTweening); tTweening.isPaused = true; return (true); } public static function getCurrentTweeningTime(p_tweening:Object):Number{ return ((p_tweening.useFrames) ? _currentTimeFrame : _currentTime); } public static function getTweenCount(p_scope:Object):Number{ var i:uint; if (!Boolean(_tweenList)){ return (0); }; var c:Number = 0; i = 0; while (i < _tweenList.length) { if (((Boolean(_tweenList[i])) && ((_tweenList[i].scope == p_scope)))){ c = (c + AuxFunctions.getObjectLength(_tweenList[i].properties)); }; i++; }; return (c); } private static function stopEngine():void{ _engineExists = false; _tweenList = null; _currentTime = 0; _currentTimeFrame = 0; __tweener_controller__.removeEventListener(Event.ENTER_FRAME, Tweener.onEnterFrame); __tweener_controller__ = null; } public static function removeTweensByTime(p_scope:Object, p_properties:Object, p_timeStart:Number, p_timeComplete:Number):Boolean{ var removedLocally:Boolean; var i:uint; var pName:String; var eventScope:Object; var p_scope = p_scope; var p_properties = p_properties; var p_timeStart = p_timeStart; var p_timeComplete = p_timeComplete; var removed:Boolean; var tl:uint = _tweenList.length; i = 0; while (i < tl) { if (((Boolean(_tweenList[i])) && ((p_scope == _tweenList[i].scope)))){ if ((((p_timeComplete > _tweenList[i].timeStart)) && ((p_timeStart < _tweenList[i].timeComplete)))){ removedLocally = false; for (pName in _tweenList[i].properties) { if (Boolean(p_properties[pName])){ if (Boolean(_tweenList[i].onOverwrite)){ eventScope = (Boolean(_tweenList[i].onOverwriteScope)) ? _tweenList[i].onOverwriteScope : _tweenList[i].scope; _tweenList[i].onOverwrite.apply(eventScope, _tweenList[i].onOverwriteParams); //unresolved jump var _slot1 = e; handleError(_tweenList[i], _slot1, "onOverwrite"); }; _tweenList[i].properties[pName] = undefined; delete _tweenList[i].properties[pName]; removedLocally = true; removed = true; }; }; if (removedLocally){ if (AuxFunctions.getObjectLength(_tweenList[i].properties) == 0){ removeTweenByIndex(i); }; }; }; }; i = (i + 1); }; return (removed); } public static function registerSpecialPropertySplitter(p_name:String, p_splitFunction:Function, p_parameters:Array=null):void{ if (!_inited){ init(); }; var sps:SpecialPropertySplitter = new SpecialPropertySplitter(p_splitFunction, p_parameters); _specialPropertySplitterList[p_name] = sps; } public static function removeTweenByIndex(i:Number, p_finalRemoval:Boolean=false):Boolean{ _tweenList[i] = null; if (p_finalRemoval){ _tweenList.splice(i, 1); }; return (true); } public static function resumeTweens(p_scope:Object, ... _args):Boolean{ var i:uint; var properties:Array = new Array(); i = 0; while (i < _args.length) { if ((((typeof(_args[i]) == "string")) && (!(AuxFunctions.isInArray(_args[i], properties))))){ properties.push(_args[i]); }; i++; }; return (affectTweens(resumeTweenByIndex, p_scope, properties)); } public static function pauseTweens(p_scope:Object, ... _args):Boolean{ var i:uint; var properties:Array = new Array(); i = 0; while (i < _args.length) { if ((((typeof(_args[i]) == "string")) && (!(AuxFunctions.isInArray(_args[i], properties))))){ properties.push(_args[i]); }; i++; }; return (affectTweens(pauseTweenByIndex, p_scope, properties)); } } }//package caurina.transitions
Section 82
//TweenListObj (caurina.transitions.TweenListObj) package caurina.transitions { public class TweenListObj { public var hasStarted:Boolean; public var onUpdate:Function; public var useFrames:Boolean; public var count:Number; public var onOverwriteParams:Array; public var timeStart:Number; public var timeComplete:Number; public var onStartParams:Array; public var onUpdateScope:Object; public var rounded:Boolean; public var onUpdateParams:Array; public var properties:Object; public var onComplete:Function; public var transitionParams:Object; public var updatesSkipped:Number; public var onStart:Function; public var onOverwriteScope:Object; public var skipUpdates:Number; public var onStartScope:Object; public var scope:Object; public var isCaller:Boolean; public var timePaused:Number; public var transition:Function; public var onCompleteParams:Array; public var onError:Function; public var timesCalled:Number; public var onErrorScope:Object; public var onOverwrite:Function; public var isPaused:Boolean; public var waitFrames:Boolean; public var onCompleteScope:Object; public function TweenListObj(p_scope:Object, p_timeStart:Number, p_timeComplete:Number, p_useFrames:Boolean, p_transition:Function, p_transitionParams:Object){ super(); scope = p_scope; timeStart = p_timeStart; timeComplete = p_timeComplete; useFrames = p_useFrames; transition = p_transition; transitionParams = p_transitionParams; properties = new Object(); isPaused = false; timePaused = undefined; isCaller = false; updatesSkipped = 0; timesCalled = 0; skipUpdates = 0; hasStarted = false; } public function clone(omitEvents:Boolean):TweenListObj{ var pName:String; var nTween:TweenListObj = new TweenListObj(scope, timeStart, timeComplete, useFrames, transition, transitionParams); nTween.properties = new Array(); for (pName in properties) { nTween.properties[pName] = properties[pName].clone(); }; nTween.skipUpdates = skipUpdates; nTween.updatesSkipped = updatesSkipped; if (!omitEvents){ nTween.onStart = onStart; nTween.onUpdate = onUpdate; nTween.onComplete = onComplete; nTween.onOverwrite = onOverwrite; nTween.onError = onError; nTween.onStartParams = onStartParams; nTween.onUpdateParams = onUpdateParams; nTween.onCompleteParams = onCompleteParams; nTween.onOverwriteParams = onOverwriteParams; nTween.onStartScope = onStartScope; nTween.onUpdateScope = onUpdateScope; nTween.onCompleteScope = onCompleteScope; nTween.onOverwriteScope = onOverwriteScope; nTween.onErrorScope = onErrorScope; }; nTween.rounded = rounded; nTween.isPaused = isPaused; nTween.timePaused = timePaused; nTween.isCaller = isCaller; nTween.count = count; nTween.timesCalled = timesCalled; nTween.waitFrames = waitFrames; nTween.hasStarted = hasStarted; return (nTween); } public function toString():String{ var i:String; var returnStr:String = "\n[TweenListObj "; returnStr = (returnStr + ("scope:" + String(scope))); returnStr = (returnStr + ", properties:"); var isFirst:Boolean; for (i in properties) { if (!isFirst){ returnStr = (returnStr + ","); }; returnStr = (returnStr + ("[name:" + properties[i].name)); returnStr = (returnStr + (",valueStart:" + properties[i].valueStart)); returnStr = (returnStr + (",valueComplete:" + properties[i].valueComplete)); returnStr = (returnStr + "]"); isFirst = false; }; returnStr = (returnStr + (", timeStart:" + String(timeStart))); returnStr = (returnStr + (", timeComplete:" + String(timeComplete))); returnStr = (returnStr + (", useFrames:" + String(useFrames))); returnStr = (returnStr + (", transition:" + String(transition))); returnStr = (returnStr + (", transitionParams:" + String(transitionParams))); if (skipUpdates){ returnStr = (returnStr + (", skipUpdates:" + String(skipUpdates))); }; if (updatesSkipped){ returnStr = (returnStr + (", updatesSkipped:" + String(updatesSkipped))); }; if (Boolean(onStart)){ returnStr = (returnStr + (", onStart:" + String(onStart))); }; if (Boolean(onUpdate)){ returnStr = (returnStr + (", onUpdate:" + String(onUpdate))); }; if (Boolean(onComplete)){ returnStr = (returnStr + (", onComplete:" + String(onComplete))); }; if (Boolean(onOverwrite)){ returnStr = (returnStr + (", onOverwrite:" + String(onOverwrite))); }; if (Boolean(onError)){ returnStr = (returnStr + (", onError:" + String(onError))); }; if (onStartParams){ returnStr = (returnStr + (", onStartParams:" + String(onStartParams))); }; if (onUpdateParams){ returnStr = (returnStr + (", onUpdateParams:" + String(onUpdateParams))); }; if (onCompleteParams){ returnStr = (returnStr + (", onCompleteParams:" + String(onCompleteParams))); }; if (onOverwriteParams){ returnStr = (returnStr + (", onOverwriteParams:" + String(onOverwriteParams))); }; if (onStartScope){ returnStr = (returnStr + (", onStartScope:" + String(onStartScope))); }; if (onUpdateScope){ returnStr = (returnStr + (", onUpdateScope:" + String(onUpdateScope))); }; if (onCompleteScope){ returnStr = (returnStr + (", onCompleteScope:" + String(onCompleteScope))); }; if (onOverwriteScope){ returnStr = (returnStr + (", onOverwriteScope:" + String(onOverwriteScope))); }; if (onErrorScope){ returnStr = (returnStr + (", onErrorScope:" + String(onErrorScope))); }; if (rounded){ returnStr = (returnStr + (", rounded:" + String(rounded))); }; if (isPaused){ returnStr = (returnStr + (", isPaused:" + String(isPaused))); }; if (timePaused){ returnStr = (returnStr + (", timePaused:" + String(timePaused))); }; if (isCaller){ returnStr = (returnStr + (", isCaller:" + String(isCaller))); }; if (count){ returnStr = (returnStr + (", count:" + String(count))); }; if (timesCalled){ returnStr = (returnStr + (", timesCalled:" + String(timesCalled))); }; if (waitFrames){ returnStr = (returnStr + (", waitFrames:" + String(waitFrames))); }; if (hasStarted){ returnStr = (returnStr + (", hasStarted:" + String(hasStarted))); }; returnStr = (returnStr + "]\n"); return (returnStr); } public static function makePropertiesChain(p_obj:Object):Object{ var chainedObject:Object; var chain:Object; var currChainObj:Object; var len:Number; var i:Number; var k:Number; var baseObject:Object = p_obj.base; if (baseObject){ chainedObject = {}; if ((baseObject is Array)){ chain = []; k = 0; while (k < baseObject.length) { chain.push(baseObject[k]); k++; }; } else { chain = [baseObject]; }; chain.push(p_obj); len = chain.length; i = 0; while (i < len) { if (chain[i]["base"]){ currChainObj = AuxFunctions.concatObjects(makePropertiesChain(chain[i]["base"]), chain[i]); } else { currChainObj = chain[i]; }; chainedObject = AuxFunctions.concatObjects(chainedObject, currChainObj); i++; }; if (chainedObject["base"]){ delete chainedObject["base"]; }; return (chainedObject); //unresolved jump }; return (p_obj); } } }//package caurina.transitions
Section 83
//CoreEvent (core.events.CoreEvent) package core.events { import flash.events.*; public class CoreEvent extends Event { public var data:Object; public static const PRE_UPDATE:String = "PreUpdate"; public static const POST_UPDATE:String = "PostUpdate"; public static const UPDATE:String = "Update"; public static const DESTROY:String = "Destroy"; public function CoreEvent(type:String, data:Object=null, bubbles:Boolean=false, cancelable:Boolean=false):void{ super(type, bubbles, cancelable); this.data = data; } } }//package core.events
Section 84
//AbstractBullet (core.objects.weapons.AbstractBullet) package core.objects.weapons { import flash.events.*; import flash.display.*; import core.objects.*; import core.events.*; import flash.geom.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Common.Math.*; public class AbstractBullet extends BaseObject { protected var sndTransform:SoundTransform; protected var totalLifeTime:uint; protected var sndChannel:SoundChannel; protected var bulletDef:BulletDef; protected var lifeTime:uint; protected var sndRicochet1:Sound; public static const BULLET_ADD:String = "BulletAdd"; public static const BULLET_HIT:String = "BulletHit"; public function AbstractBullet(def:BulletDef):void{ bulletDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = (bulletDef.radius / engine.m_physScale); shapeDef.density = 0.2; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } protected function updateHandler(e:CoreEvent=null):void{ updateSkin(); lifeTime++; if (lifeTime >= totalLifeTime){ isDead = true; dieFromTime(); }; } private function collideAddHandler(e:CoreEvent):void{ var hitObj:BaseObject; var body1:b2Body = e.data.body1; var body2:b2Body = e.data.body2; var pos:b2Vec2 = e.data.pos; var posX:Number = (pos.x * engine.m_physScale); var posY:Number = (pos.y * engine.m_physScale); if (body2 == body){ hitObj = body1.m_userData; if (!isDead){ createBounce(posX, posY); }; isDead = true; }; } private function bounceEfHandler(e:Event):void{ var bounce:MovieClip = (e.target as MovieClip); if (bounce.currentFrame == bounce.totalFrames){ bounce.parent.removeChild(bounce); bounce.removeEventListener(Event.ENTER_FRAME, bounceEfHandler); }; } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } override protected function init():void{ super.init(); totalLifeTime = 100; lifeTime = 0; var impulse:b2Vec2 = bulletDef.impulse.Copy(); var invMass:Number = (1 / body.GetMass()); impulse.Multiply((20 / invMass)); body.ApplyImpulse(impulse, body.GetWorldCenter()); engine.addEventListener(CoreEvent.UPDATE, updateHandler); } private function dieComplete(animSkin:Sprite):void{ animSkin.parent.removeChild(animSkin); } private function trackEfHandler(e:Event):void{ var m:Matrix; var track:MovieClip = (e.target as MovieClip); if (track.currentFrame == track.totalFrames){ track.parent.removeChild(track); track.removeEventListener(Event.ENTER_FRAME, trackEfHandler); m = new Matrix(1, 0, 0, 1, track.x, track.y); }; } private function createBounce(x:Number, y:Number):void{ var BounceClass:Class = engine.assets.getAssetClass("BulletWallBounce"); var bounce:MovieClip = new (BounceClass); bounce.rotation = (((skin.rotation - 180) - 20) + (Math.random() * 40)); bounce.x = x; bounce.y = y; engine.canvas.objectsContainer.addChild(bounce); bounce.addEventListener(Event.ENTER_FRAME, bounceEfHandler); sndChannel = sndRicochet1.play(); } override public function updateSkin():void{ var pos:b2Vec2 = body.GetWorldCenter(); skin.x = (pos.x * engine.m_physScale); skin.y = (pos.y * engine.m_physScale); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); bodyDef.userData = this; bodyDef.isBullet = true; bodyDef.angularDamping = 10; return (bodyDef); } private function dieFromTime():void{ var animSkin:Sprite = createSkin(); animSkin.x = skin.x; animSkin.y = skin.y; Tweener.addTween(animSkin, {alpha:0, time:0.5, transition:"linear", onComplete:dieComplete, onCompleteParams:[animSkin]}); } private function hitGround():void{ var TrackClass:Class = engine.assets.getAssetClass("TankTurretBulletTrackAsset"); var track:MovieClip = new (TrackClass); var pos:b2Vec2 = body.GetPosition().Copy(); pos.Multiply(engine.m_physScale); track.x = pos.x; track.y = pos.y; engine.canvas.objectsContainer.addChild(track); track.addEventListener(Event.ENTER_FRAME, trackEfHandler); } public function setDirection(angle:Number):void{ var angleRad:Number = ((angle * Math.PI) / 180); var dx:Number = (Math.cos(angleRad) * 0.25); var dy:Number = (Math.sin(angleRad) * 0.25); var impulse:b2Vec2 = new b2Vec2(dx, dy); body.ApplyImpulse(impulse, body.GetWorldCenter()); skin.rotation = angle; } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } } }//package core.objects.weapons
Section 85
//AbstractWeapon (core.objects.weapons.AbstractWeapon) package core.objects.weapons { import flash.events.*; import core.*; import flash.display.*; import core.events.*; import flash.geom.*; import caurina.transitions.*; public class AbstractWeapon extends EventDispatcher { protected var engine:CoreEngine; public var reloadTime:int; protected var skinShot:MovieClip; public var bulletsLeft:int;// = 5 protected var skinInner:Sprite; protected var categoryBits:uint; protected var part2X:Number; public var totalReloadTime:uint;// = 30 protected var part3X:Number; protected var skin:Sprite; public static const WEAPON_READY:String = "WeaponReady"; public function AbstractWeapon(categoryBits:uint, skin:Sprite):void{ super(); this.categoryBits = categoryBits; this.skin = skin; init(); } public function rotateToPoint(gp:Point):void{ var lp:Point = skin.parent.globalToLocal(gp); var angle:Number = ((Math.atan2(lp.y, lp.x) * 180) / Math.PI); skin.rotation = angle; } public function update():void{ if (reloadTime == -1){ return; }; if (reloadTime < totalReloadTime){ reloadTime++; } else { reloadTime = -1; dispatchEvent(new CoreEvent(WEAPON_READY)); }; } public function getSkin():Sprite{ return (skin); } public function reset():void{ reloadTime = -1; } protected function init():void{ engine = CoreEngine.getInstance(); skin = createSkin(); skinInner = (skin.getChildByName("inner") as Sprite); skinShot = (skin.getChildByName("shot") as MovieClip); skinShot.stop(); reset(); } protected function createSkin():Sprite{ return (skin); } protected function doFire():void{ var gp:Point = skin.localToGlobal(new Point(25, 0)); var CannonShotSmokeClass:Class = engine.assets.getAssetClass("CannonShotSmokeAsset"); var shotSmoke:Sprite = new (CannonShotSmokeClass); shotSmoke.x = gp.x; shotSmoke.y = gp.y; engine.canvas.objectsContainer.addChild(shotSmoke); Tweener.addTween(shotSmoke, {alpha:0, time:3, transition:"linear", onComplete:shotSmokeComplete, onCompleteParams:[shotSmoke]}); } protected function shotSmokeComplete(smoke:Sprite):void{ smoke.parent.removeChild(smoke); } public function fire():void{ if (bulletsLeft > 0){ reloadTime = 0; skinShot.gotoAndPlay(2); doFire(); bulletsLeft--; }; } } }//package core.objects.weapons
Section 86
//BulletDef (core.objects.weapons.BulletDef) package core.objects.weapons { import core.objects.*; import Box2D.Common.Math.*; public class BulletDef extends BaseObjectDef { public var radius:Number; public var categoryBits:uint; public var impulse:b2Vec2; public function BulletDef(x:Number, y:Number, radius:Number, impulse:b2Vec2, categoryBits:uint):void{ this.radius = radius; this.impulse = impulse; this.categoryBits = categoryBits; super(x, y); } } }//package core.objects.weapons
Section 87
//Cannon (core.objects.weapons.Cannon) package core.objects.weapons { import flash.display.*; import flash.geom.*; import flash.media.*; import Box2D.Common.Math.*; public class Cannon extends AbstractWeapon { private var sndShot:Sound; public function Cannon(categoryBits:uint, skin:Sprite):void{ super(categoryBits, skin); } override protected function init():void{ super.init(); initSounds(); } override protected function doFire():void{ super.doFire(); var gp:Point = skin.localToGlobal(new Point(25, 0)); var angle:Number = (skin.rotation + skin.parent.parent.rotation); var angleRad:Number = ((angle * Math.PI) / 180); var dx:Number = Math.cos(angleRad); var dy:Number = Math.sin(angleRad); var def:BulletDef = new BulletDef(gp.x, gp.y, 4, new b2Vec2(dx, dy), categoryBits); var bullet:CannonBullet = new CannonBullet(def); engine.playSound(sndShot); } private function initSounds():void{ var SndShotClass:Class = engine.assets.getAssetClass("SndCannonShot"); sndShot = new (SndShotClass); } } }//package core.objects.weapons
Section 88
//CannonBullet (core.objects.weapons.CannonBullet) package core.objects.weapons { import core.*; import flash.display.*; import core.objects.*; import core.events.*; import flash.geom.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class CannonBullet extends AbstractBullet { private var hitPos:b2Vec2; private var hitVelocity:b2Vec2; private var sndMetalHit:Sound; private var hitValue:Number; private var sndGroundHit:Sound; private var trackDelay:uint;// = 1 private var trackTime:uint; public function CannonBullet(def:BulletDef):void{ super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.density = 8; shapeDef.filter.categoryBits = bulletDef.categoryBits; shapeDef.filter.maskBits = (0xFFFF & ~(bulletDef.categoryBits)); return (shapeDef); } private function collideAddHandler(e:CoreEvent):void{ var thisBody:b2Body; var otherBody:b2Body; var minHitValue:Number; var maxHitValue:Number; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ thisBody = ((body1.m_userData == this)) ? body1 : body2; otherBody = ((body1.m_userData == this)) ? body2 : body1; minHitValue = 3; maxHitValue = 10; hitValue = Math.abs(b2Math.b2Dot(body.m_linearVelocity, point.normal)); if (hitValue < minHitValue){ return; }; if (hitValue > maxHitValue){ hitValue = maxHitValue; }; hitValue = (hitValue / maxHitValue); hitPos = point.position.Copy(); hitVelocity = body.m_linearVelocity.Copy(); hitVelocity.Normalize(); if ((otherBody.m_userData is BalloonUnit)){ collideWithBalloonUnit(); } else { if ((otherBody.m_userData is StaticWall)){ collideWithWall(); } else { if ((otherBody.m_userData is GroundBot)){ collideWithGroundBot(); }; }; }; }; } override protected function updateHandler(e:CoreEvent=null):void{ super.updateHandler(e); } private function updateTrack():void{ if (trackTime >= trackDelay){ createTrack(); trackTime = 0; } else { trackTime++; }; } private function collideWithWall():void{ if (hitValue < 0.8){ return; }; engine.playSound(sndGroundHit); engine.addEventListener(CoreEvent.POST_UPDATE, createParticles); } private function collideWithBalloonUnit():void{ engine.playSound(sndMetalHit); } private function createParticles(e:CoreEvent):void{ var def:BaseObjectDef; var particle:WallBulletParticle; var pos:Point = new Point((hitPos.x * engine.m_physScale), (hitPos.y * engine.m_physScale)); var numParticles:uint = Math.floor((hitValue * 5)); var i:uint; while (i < numParticles) { def = new BaseObjectDef(pos.x, pos.y); particle = new WallBulletParticle(def); particle.initialize(hitVelocity, hitValue); i++; }; engine.removeEventListener(CoreEvent.POST_UPDATE, createParticles); } override protected function init():void{ super.init(); trackTime = 0; initSounds(); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("CannonBulletAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } private function trackComplete(track:Sprite):void{ track.parent.removeChild(track); } private function createTrack():void{ var TrackClass:Class = engine.assets.getAssetClass("CannonBulletTrackAsset"); var track:Sprite = new (TrackClass); engine.canvas.objectsContainer.addChild(track); var pos:b2Vec2 = body.GetPosition(); track.x = (pos.x * engine.m_physScale); track.y = (pos.y * engine.m_physScale); Tweener.addTween(track, {alpha:0, time:0.3, transition:"linear", onComplete:trackComplete, onCompleteParams:[track]}); } private function initSounds():void{ var SndHitMetalClass:Class = engine.assets.getAssetClass("SndCannonBulletHitMetal"); sndMetalHit = new (SndHitMetalClass); var SndGroundHitClass:Class = engine.assets.getAssetClass("SndBulletHitGround"); sndGroundHit = new (SndGroundHitClass); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } private function collideWithGroundBot():void{ engine.playSound(sndMetalHit); } } }//package core.objects.weapons
Section 89
//GroundBotWeapon (core.objects.weapons.GroundBotWeapon) package core.objects.weapons { import core.*; import flash.display.*; import flash.geom.*; import caurina.transitions.*; import flash.media.*; import Box2D.Common.Math.*; public class GroundBotWeapon extends AbstractWeapon { private var sndShot:Sound; public function GroundBotWeapon(categoryBits:uint, skin:Sprite):void{ super(categoryBits, skin); } override protected function init():void{ engine = CoreEngine.getInstance(); skinShot = (skin.getChildByName("shot") as MovieClip); skinShot.stop(); skinInner = (skin.getChildByName("inner") as MovieClip); (skinInner as MovieClip).stop(); initSounds(); bulletsLeft = 100000; totalReloadTime = 100; reset(); } override protected function doFire():void{ super.doFire(); var gp:Point = skin.localToGlobal(new Point(22, 0)); var angle:Number = (skin.rotation + skin.parent.rotation); var angleRad:Number = ((angle * Math.PI) / 180); var dx:Number = Math.cos(angleRad); var dy:Number = Math.sin(angleRad); var def:BulletDef = new BulletDef(gp.x, gp.y, 4, new b2Vec2(dx, dy), categoryBits); var bullet:CannonBullet = new CannonBullet(def); skinInner.x = -4; Tweener.addTween(skinInner, {x:0, time:0.5, transition:"linear"}); engine.playSound(sndShot); } private function initSounds():void{ var SndShotClass:Class = engine.assets.getAssetClass("SndCannonShot"); sndShot = new (SndShotClass); } public function damage():void{ (skinInner as MovieClip).gotoAndStop(2); } } }//package core.objects.weapons
Section 90
//MineBotWeapon (core.objects.weapons.MineBotWeapon) package core.objects.weapons { import core.*; import flash.display.*; import flash.geom.*; import caurina.transitions.*; import flash.media.*; import Box2D.Common.Math.*; public class MineBotWeapon extends AbstractWeapon { private var sndShot:Sound; public function MineBotWeapon(categoryBits:uint, skin:Sprite):void{ super(categoryBits, skin); } override protected function init():void{ engine = CoreEngine.getInstance(); skinShot = (skin.getChildByName("shot") as MovieClip); skinShot.stop(); skinInner = (skin.getChildByName("inner") as Sprite); initSounds(); bulletsLeft = 100000; totalReloadTime = (80 + Math.round((Math.random() * 50))); reloadTime = 0; } override protected function doFire():void{ super.doFire(); var gp:Point = skin.localToGlobal(new Point(22, 0)); var angle:Number = 90; var angleRad:Number = ((angle * Math.PI) / 180); var dx:Number = (5 * Math.cos(angleRad)); var dy:Number = (5 * Math.sin(angleRad)); var def:BulletDef = new BulletDef(gp.x, gp.y, 5, new b2Vec2(dx, dy), categoryBits); var bullet:MineBullet = new MineBullet(def); skinInner.x = -4; Tweener.addTween(skinInner, {x:0, time:0.5, transition:"linear"}); engine.playSound(sndShot); } private function initSounds():void{ var SndShotClass:Class = engine.assets.getAssetClass("SndCannonShot"); sndShot = new (SndShotClass); } } }//package core.objects.weapons
Section 91
//MineBullet (core.objects.weapons.MineBullet) package core.objects.weapons { import core.*; import flash.display.*; import core.objects.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class MineBullet extends AbstractBullet { public function MineBullet(def:BulletDef):void{ super(def); } override protected function init():void{ super.init(); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function updateHandler(e:CoreEvent=null):void{ super.updateHandler(e); } private function collideAddHandler(e:CoreEvent):void{ var otherBody:b2Body; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ otherBody = ((body1.m_userData == this)) ? body2 : body1; if (((!((otherBody.m_userData is MineBot))) && (!((otherBody.m_userData is Coin))))){ engine.addEventListener(CoreEvent.UPDATE, explode); }; }; } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.density = 8; shapeDef.filter.categoryBits = bulletDef.categoryBits; shapeDef.filter.maskBits = (0xFFFF & ~(bulletDef.categoryBits)); return (shapeDef); } private function explode(e:CoreEvent):void{ var angle:Number; var angleRad:Number; var dx:Number; var dy:Number; var randX:Number; var randY:Number; var pos:b2Vec2; var px:Number; var py:Number; var def:BulletDef; var bullet:ShrapnelBullet; isDead = true; engine.removeEventListener(CoreEvent.UPDATE, explode); var i:uint; while (i < 4) { angle = (((i * 90) - 60) + (Math.random() * 120)); angleRad = ((angle * Math.PI) / 180); dx = (Math.cos(angleRad) * 0.8); dy = (Math.sin(angleRad) * 0.8); randX = ((-(dx) * 0.2) + ((dx * Math.random()) * 0.4)); randY = ((-(dy) * 0.2) + ((dy * Math.random()) * 0.4)); pos = body.GetPosition(); px = (pos.x * engine.m_physScale); py = (pos.y * engine.m_physScale); def = new BulletDef(px, py, 2, new b2Vec2((dx + randX), (dy + randY)), body.m_shapeList.m_filter.categoryBits); bullet = new ShrapnelBullet(def); i++; }; } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("MineBulletAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = super.createBodyDef(); bodyDef.userData = this; return (bodyDef); } } }//package core.objects.weapons
Section 92
//ShrapnelBullet (core.objects.weapons.ShrapnelBullet) package core.objects.weapons { import flash.display.*; import Box2D.Collision.Shapes.*; public class ShrapnelBullet extends AbstractBullet { public function ShrapnelBullet(def:BulletDef):void{ super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = (2 / engine.m_physScale); shapeDef.density = 0.2; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; shapeDef.filter.categoryBits = bulletDef.categoryBits; shapeDef.filter.maskBits = (0xFFFF & ~(bulletDef.categoryBits)); return (shapeDef); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("ShrapnelBulletAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } } }//package core.objects.weapons
Section 93
//ShrapnelWeapon (core.objects.weapons.ShrapnelWeapon) package core.objects.weapons { import flash.display.*; import core.events.*; import flash.geom.*; import Box2D.Common.Math.*; public class ShrapnelWeapon extends AbstractWeapon { public function ShrapnelWeapon(categoryBits:uint, skin:Sprite):void{ super(categoryBits, skin); } override protected function doFire():void{ super.doFire(); var bullets:Number = 5; var i:uint; while (i < bullets) { addBullet(); i++; }; } override protected function createSkin():Sprite{ return (skin); } private function addBullet():void{ var gp:Point = skin.localToGlobal(new Point(25, 0)); var angle:Number = (skin.rotation + skin.parent.rotation); var angleRad:Number = ((angle * Math.PI) / 180); var dx:Number = Math.cos(angleRad); var dy:Number = Math.sin(angleRad); var randX:Number = ((-(dx) * 0.2) + ((dx * Math.random()) * 0.4)); var randY:Number = ((-(dy) * 0.2) + ((dy * Math.random()) * 0.4)); var def:BulletDef = new BulletDef(gp.x, gp.y, 2, new b2Vec2((dx + randX), (dy + randY)), categoryBits); var bullet:ShrapnelBullet = new ShrapnelBullet(def); dispatchEvent(new CoreEvent(AbstractBullet.BULLET_ADD, bullet)); } } }//package core.objects.weapons
Section 94
//AbstractUnit (core.objects.AbstractUnit) package core.objects { import Box2D.Common.Math.*; public class AbstractUnit extends BaseObject { public function AbstractUnit(def:BaseObjectDef):void{ super(def); } protected function getShootAngle():Number{ var thisPos:b2Vec2 = body.GetPosition(); var playerPos:b2Vec2 = engine.player.getBody().GetPosition(); var dx:Number = (playerPos.x - thisPos.x); var dy:Number = (playerPos.y - thisPos.y); var g:Number = 20; var v:Number = 20; var a:Number = (((g * dx) * dx) / ((2 * v) * v)); if (Math.abs(a) < 1E-6){ a = 1E-6; }; var b:Number = dx; var c:Number = (a - dy); var d:Number = ((b * b) - ((4 * a) * c)); if (d < 0){ return (NaN); }; var x1:Number = ((-(b) + Math.sqrt(d)) / (2 * a)); var x2:Number = ((-(b) - Math.sqrt(d)) / (2 * a)); var angle1:Number = Math.atan(x1); var angle2:Number = Math.atan(x2); if (dx < 0){ angle1 = (angle1 + Math.PI); angle2 = (angle2 + Math.PI); }; var t1:Number = (dx / (v * Math.cos(angle1))); var t2:Number = (dx / (v * Math.cos(angle2))); return (((t1 <= t2)) ? angle1 : angle2); } } }//package core.objects
Section 95
//AmmoBox (core.objects.AmmoBox) package core.objects { import core.*; import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Collision.*; public class AmmoBox extends BaseObject { private var ammoBoxDef:AmmoBoxDef; private var sndRecharge:Sound; public function AmmoBox(def:AmmoBoxDef):void{ ammoBoxDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((ammoBoxDef.width / engine.m_physScale) / 2); var h2:Number = ((ammoBoxDef.height / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 0; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; shapeDef.filter.maskBits = 2; shapeDef.isSensor = true; return (shapeDef); } private function updateHandler(e:CoreEvent):void{ updateSkin(); } private function collideWithPlayer():void{ isDead = true; engine.playSound(sndRecharge); engine.player.rechargeWeapon(); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((ammoBoxDef.x / engine.m_physScale), (ammoBoxDef.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } protected function collideAddHandler(e:CoreEvent):void{ var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ collideWithPlayer(); }; } override protected function init():void{ super.init(); initSounds(); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } private function initSounds():void{ var SndRechargeClass:Class = engine.assets.getAssetClass("SndCannonRecharge"); sndRecharge = new (SndRechargeClass); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("AmmoBoxAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } } }//package core.objects
Section 96
//AmmoBoxDef (core.objects.AmmoBoxDef) package core.objects { public class AmmoBoxDef extends BaseObjectDef { public var width:Number; public var height:Number; public static const NAME:String = "AmmoBox"; public function AmmoBoxDef(x:Number, y:Number, width:Number, height:Number){ this.width = width; this.height = height; super(x, y); } public static function parseStringDef(stringDef:String):AmmoBoxDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:AmmoBoxDef = new AmmoBoxDef(x, y, width, height); return (def); } } }//package core.objects
Section 97
//ArmoredBox (core.objects.ArmoredBox) package core.objects { import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; public class ArmoredBox extends BaseObject { private var armoredBoxDef:ArmoredBoxDef; public function ArmoredBox(def:ArmoredBoxDef):void{ armoredBoxDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((armoredBoxDef.width / engine.m_physScale) / 2); var h2:Number = ((armoredBoxDef.height / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 0; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } private function updateHandler(e:CoreEvent):void{ updateSkin(); } private function collideWithCannonBullet():void{ isDead = true; } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((armoredBoxDef.x / engine.m_physScale), (armoredBoxDef.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function createSkin():Sprite{ var SkinDataClass:Class = engine.assets.getAssetClass("ArmoredBoxData"); var skinData:BitmapData = new SkinDataClass(0, 0); var skin:Sprite = new Sprite(); var skinInner:Sprite = new Sprite(); skinInner.graphics.beginBitmapFill(skinData); skinInner.graphics.drawRect(0, 0, armoredBoxDef.width, armoredBoxDef.height); skinInner.graphics.endFill(); skinInner.x = (-(armoredBoxDef.width) / 2); skinInner.y = (-(armoredBoxDef.height) / 2); skin.addChild(skinInner); engine.canvas.objectsContainer.addChild(skin); return (skin); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } } }//package core.objects
Section 98
//ArmoredBoxDef (core.objects.ArmoredBoxDef) package core.objects { public class ArmoredBoxDef extends BaseObjectDef { public var width:Number; public var height:Number; public static const NAME:String = "ArmoredBox"; public function ArmoredBoxDef(x:Number, y:Number, width:Number, height:Number){ this.width = width; this.height = height; super(x, y); } public static function parseStringDef(stringDef:String):ArmoredBoxDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:ArmoredBoxDef = new ArmoredBoxDef(x, y, width, height); return (def); } } }//package core.objects
Section 99
//BalloonBot (core.objects.BalloonBot) package core.objects { import flash.events.*; import core.*; import flash.display.*; import core.events.*; import core.objects.weapons.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import flash.ui.*; public class BalloonBot extends BalloonUnit { private var whiskers:b2Shape; private var isShooting:Boolean;// = true private var movable:Boolean;// = true private var currentWeapon:AbstractWeapon; private var skinWhiskers:Sprite; private var cannon:Cannon; private var nearTenons:Array; public function BalloonBot(def:BalloonBotDef):void{ super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.filter.categoryBits = 8; shapeDef.filter.maskBits = (0xFFFF & ~(bulletsCategoryBits)); return (shapeDef); } override protected function updateHandler(e:CoreEvent):void{ super.updateHandler(e); if (((isActive) && (isShooting))){ updateWeapon(); }; } protected function recoil():void{ var angle:Number = (skinBoat.rotation + currentWeapon.getSkin().rotation); var angleRad:Number = ((angle * Math.PI) / 180); var dx:Number = (-(Math.cos(angleRad)) * 5); var dy:Number = (-(Math.sin(angleRad)) * 5); body.ApplyImpulse(new b2Vec2(dx, dy), body.GetPosition()); } private function updateWeapon():void{ currentWeapon.update(); var segment:b2Segment = new b2Segment(); segment.p1.SetV(body.GetWorldPoint(new b2Vec2((-5 / engine.m_physScale), 0))); var pp:b2Vec2 = body.GetLocalPoint(engine.player.getBody().GetPosition()); segment.p2.SetV(pp); segment.p2.Add(segment.p1); var sd:b2CircleDef = new b2CircleDef(); sd.filter.maskBits = (1 | 2); var s:b2Shape = new b2Shape(sd); var lambda:Array = [1]; var normal:b2Vec2 = new b2Vec2(); var shape:b2Shape = engine.m_world.RaycastOne(segment, lambda, normal, true, s); if (shape){ if (!(shape.GetBody().m_userData is Player)){ return; }; } else { return; }; var angle:Number = Math.round(((getShootAngle() * 180) / Math.PI)); if (!isNaN(angle)){ currentWeapon.getSkin().rotation = angle; if ((((currentWeapon.reloadTime == -1)) && ((currentWeapon.bulletsLeft > 0)))){ currentWeapon.fire(); recoil(); skinWeaponIndicator.gotoAndStop(1); skinWeaponCharger.play(); cannon.totalReloadTime = (50 + Math.floor((Math.random() * 30))); }; }; } private function collideAddHandler(e:CoreEvent):void{ var otherBody:b2Body; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((point.shape1 == whiskers)) || ((point.shape2 == whiskers)))){ otherBody = ((point.shape1 == whiskers)) ? body2 : body1; trace(otherBody.m_userData); if ((otherBody.m_userData is Tenons)){ if (nearTenons.indexOf(otherBody) == -1){ nearTenons.push(otherBody); }; }; }; } override protected function init():void{ bulletsCategoryBits = 16; super.init(); skinWhiskers = (skinBoat.getChildByName("whiskers") as Sprite); skinWhiskers.visible = false; createWeapons(); nearTenons = []; } private function updatePosition():void{ var impulse:b2Vec2; var liftImpulse:b2Vec2; var thisPos:b2Vec2 = body.GetPosition(); var playerPos:b2Vec2 = engine.player.getBody().GetPosition(); var magnitude:Number = 0.4; isSteered = false; var impulseX:Number = 1; if (thisPos.x < playerPos.x){ impulseX = 1; } else { if (thisPos.x > playerPos.x){ impulseX = -1; }; }; body.ApplyImpulse(new b2Vec2((impulseX * 0.1), 0), body.GetWorldCenter()); if (thisPos.y > playerPos.y){ liftImpulse = new b2Vec2(0, -0.6); body.ApplyImpulse(liftImpulse, body.GetWorldCenter()); isSteered = true; }; } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("BalloonBotAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } override protected function preUpdateHandler(e:CoreEvent):void{ super.preUpdateHandler(e); if (movable){ updatePosition(); }; } private function weaponReadyHandler(e:CoreEvent):void{ skinWeaponIndicator.gotoAndStop(2); } private function setWeapon(weapon:AbstractWeapon):void{ cannon.getSkin().visible = false; currentWeapon = weapon; currentWeapon.getSkin().visible = true; } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.canvas.levelContainer.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); } private function keyDownHandler(e:KeyboardEvent):void{ var angle:Number; if (e.keyCode == Keyboard.ENTER){ if (currentWeapon.reloadTime == -1){ angle = Math.round(((getShootAngle() * 180) / Math.PI)); if (!isNaN(angle)){ currentWeapon.getSkin().rotation = angle; currentWeapon.fire(); }; }; }; } private function createWhiskers():void{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = ((skinWhiskers.width / 2) / engine.m_physScale); shapeDef.isSensor = true; shapeDef.localPosition.Set((skinWhiskers.x / engine.m_physScale), (skinWhiskers.y / engine.m_physScale)); whiskers = body.CreateShape(shapeDef); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } private function createWeapons():void{ cannon = new Cannon(bulletsCategoryBits, skinWeapon); cannon.totalReloadTime = (50 + Math.floor((Math.random() * 30))); cannon.reloadTime = 0; cannon.addEventListener(AbstractWeapon.WEAPON_READY, weaponReadyHandler); skinWeaponHolder.addChild(cannon.getSkin()); setWeapon(cannon); } } }//package core.objects
Section 100
//BalloonBotDef (core.objects.BalloonBotDef) package core.objects { public class BalloonBotDef extends BalloonUnitDef { public static const NAME:String = "BalloonBot"; public function BalloonBotDef(x:Number, y:Number, width:Number, height:Number):void{ super(x, y, width, height); } public static function parseStringDef(stringDef:String):BalloonBotDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:BalloonBotDef = new BalloonBotDef(x, y, width, height); return (def); } } }//package core.objects
Section 101
//BalloonUnit (core.objects.BalloonUnit) package core.objects { import flash.display.*; import core.events.*; import flash.geom.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; public class BalloonUnit extends AbstractUnit { protected var exhaustDelay:uint;// = 6 protected var skinWeaponHolder:Sprite; protected var skinWeaponCharger:MovieClip; protected var propeller:Propeller; protected var skinPropeller:MovieClip; protected var skinWeaponIndicator:MovieClip; protected var exhaustTime:uint; protected var isSteered:Boolean; protected var balloonUnitDef:BalloonUnitDef; protected var propellerDelay:uint; protected var skinPressureArrow:Sprite; protected var skinPressureDetector:Sprite; protected var centerShape:b2Shape; public var isActive:Boolean; protected var skinBoat:Sprite; protected var balloon1:SingleBalloon; protected var balloon2:SingleBalloon; protected var bulletsCategoryBits:uint;// = 0 protected var skinWeapon:Sprite; protected var propellerTime:uint; public static const DEACTIVATE:String = "Deactivate"; public static const BOAT_SENSOR:String = "BoatSensor"; public static const CENTER_SENSOR:String = "CenterSensor"; public function BalloonUnit(def:BalloonUnitDef):void{ balloonUnitDef = def; super(def); } protected function exhaustComplete(exhaust:Sprite):void{ exhaust.parent.removeChild(exhaust); } override protected function init():void{ super.init(); skinBoat = (skin.getChildByName("boat") as Sprite); skinWeaponHolder = (skinBoat.getChildByName("weaponHolder") as Sprite); skinWeapon = (skinWeaponHolder.getChildByName("weapon") as Sprite); skinWeaponIndicator = (skinBoat.getChildByName("weaponIndicator") as MovieClip); skinWeaponIndicator.gotoAndStop(2); skinPropeller = (skinBoat.getChildByName("propeller") as MovieClip); skinPropeller.stop(); skinWeaponCharger = (skinBoat.getChildByName("weaponCharger") as MovieClip); skinWeaponCharger.stop(); skinPressureDetector = (skinBoat.getChildByName("pressureDetector") as Sprite); skinPressureArrow = (skinPressureDetector.getChildByName("arrow") as Sprite); createBalloons(); createPropeller(); createCenter(); exhaustTime = 0; isSteered = false; propellerDelay = 2; propellerTime = 0; isActive = true; engine.addEventListener(CoreEvent.PRE_UPDATE, preUpdateHandler); engine.addEventListener(CoreEvent.UPDATE, updateHandler); } protected function updateExhaust():void{ var ExhaustClass:Class; var exhaust:MovieClip; var pos:b2Vec2; if (!isSteered){ return; }; exhaustTime++; if (exhaustTime >= exhaustDelay){ exhaustTime = 0; ExhaustClass = engine.assets.getAssetClass("ExhaustAsset"); exhaust = new (ExhaustClass); exhaust.gotoAndStop((1 + Math.floor((Math.random() * 2)))); pos = body.GetWorldPoint(new b2Vec2((((-(balloonUnitDef.width) / 2) - 5) / engine.m_physScale), ((balloonUnitDef.height / 2) / engine.m_physScale))); exhaust.x = (pos.x * engine.m_physScale); exhaust.y = (pos.y * engine.m_physScale); exhaust.scaleX = 0.2; exhaust.scaleY = 0.2; engine.canvas.objectsContainer.addChild(exhaust); Tweener.addTween(exhaust, {y:(exhaust.y - 50), scaleX:1, scaleY:1, alpha:0, rotation:(-500 + (Math.random() * 1000)), time:2, transition:"linear", onComplete:exhaustComplete, onCompleteParams:[exhaust]}); }; } protected function updatePressure():void{ if (isSteered){ skinPressureArrow.rotation = (-10 + (Math.random() * 20)); }; } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((balloonUnitDef.width / engine.m_physScale) / 2); var h2:Number = ((balloonUnitDef.height / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 1; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; shapeDef.userData = BOAT_SENSOR; return (shapeDef); } protected function updateHandler(e:CoreEvent):void{ var localPos:Point; var pos:b2Vec2 = body.GetWorldCenter(); localPos = skin.globalToLocal(new Point((pos.x * engine.m_physScale), (pos.y * engine.m_physScale))); skinBoat.x = localPos.x; skinBoat.y = localPos.y; skinBoat.rotation = ((body.GetAngle() * 180) / Math.PI); if (isActive){ updateExhaust(); updatePropeller(); updatePressure(); }; } protected function updatePropeller():void{ propellerDelay = (isSteered) ? 1 : 2; if (propellerTime >= propellerDelay){ if ((skinPropeller.currentFrame == skinPropeller.totalFrames)){ skinPropeller.gotoAndStop(0); } else { skinPropeller.nextFrame(); }; propellerTime = 0; } else { propellerTime++; }; } protected function createBalloons():void{ var de:BaseObjectDef; var bodyPos:b2Vec2 = body.GetPosition(); var skinBalloon1:Sprite = (skin.getChildByName("balloon1") as Sprite); var skinBalloon2:Sprite = (skin.getChildByName("balloon2") as Sprite); def = new BaseObjectDef(((bodyPos.x * engine.m_physScale) - 15), ((bodyPos.y * engine.m_physScale) - 45)); balloon1 = new SingleBalloon(def); balloon1.initialize(body, new Point(0, -30), skinBalloon1); balloon1.liftForce.Set(0, -1); balloon1.addEventListener(SingleBalloon.BALLOON_POPPED, balloonPoppedHandler); def = new BaseObjectDef(((bodyPos.x * engine.m_physScale) + 15), ((bodyPos.y * engine.m_physScale) - 45)); balloon2 = new SingleBalloon(def); balloon2.initialize(body, new Point(0, -30), skinBalloon2); balloon2.liftForce.Set(0, -1); balloon2.addEventListener(SingleBalloon.BALLOON_POPPED, balloonPoppedHandler); var djd:b2DistanceJointDef = new b2DistanceJointDef(); djd.Initialize(balloon1.getBody(), balloon2.getBody(), balloon1.getBody().GetWorldCenter(), balloon2.getBody().GetWorldCenter()); djd.collideConnected = true; engine.m_world.CreateJoint(djd); } private function dieComplete(dieSkin:Sprite):void{ dieSkin.parent.removeChild(dieSkin); } protected function preUpdateHandler(e:CoreEvent):void{ } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); bodyDef.userData = this; bodyDef.linearDamping = 0.8; bodyDef.angularDamping = 0.5; return (bodyDef); } protected function balloonPoppedHandler(e:CoreEvent):void{ if (((balloon1.isDead) && (balloon2.isDead))){ deactivate(); } else { balloon1.liftForce.Multiply(1.3); balloon2.liftForce.Multiply(1.3); }; } protected function createCenter():void{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = (1 / engine.m_physScale); shapeDef.isSensor = true; shapeDef.filter.maskBits = ((0xFFFF & ~(4)) & ~(16)); shapeDef.userData = CENTER_SENSOR; centerShape = body.CreateShape(shapeDef); } protected function createPropeller():void{ var propellerDef:BaseObjectDef = new BaseObjectDef((skin.x + skinPropeller.x), (skin.y + skinPropeller.y)); propeller = new Propeller(propellerDef, skinPropeller, this); } public function deactivate():void{ if (isActive){ balloon1.deactivate(); balloon2.deactivate(); isActive = false; dispatchEvent(new CoreEvent(DEACTIVATE)); }; } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); balloon1.removeEventListener(SingleBalloon.BALLOON_POPPED, balloonPoppedHandler); balloon2.removeEventListener(SingleBalloon.BALLOON_POPPED, balloonPoppedHandler); engine.removeEventListener(CoreEvent.PRE_UPDATE, preUpdateHandler); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } } }//package core.objects
Section 102
//BalloonUnitDef (core.objects.BalloonUnitDef) package core.objects { public class BalloonUnitDef extends BaseObjectDef { public var width:Number; public var height:Number; public function BalloonUnitDef(x:Number, y:Number, width:Number, height:Number):void{ this.width = width; this.height = height; super(x, y); } } }//package core.objects
Section 103
//BaseObject (core.objects.BaseObject) package core.objects { import flash.events.*; import core.*; import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; public class BaseObject extends EventDispatcher { protected var body:b2Body; protected var def:BaseObjectDef; protected var engine:CoreEngine; public var isDead:Boolean; protected var skin:Sprite; public function BaseObject(def:BaseObjectDef):void{ super(); this.def = def; init(); } protected function createShapeDef():b2ShapeDef{ return (null); } protected function postUpdateHandler(e:CoreEvent):void{ if (isDead){ destroy(); }; } public function updateSkin():void{ var pos:b2Vec2 = body.GetPosition(); skin.x = (pos.x * engine.m_physScale); skin.y = (pos.y * engine.m_physScale); skin.rotation = ((body.GetAngle() * 180) / Math.PI); } protected function createBodyDef():b2BodyDef{ return (null); } public function moveTo(x:Number, y:Number):void{ var pos:b2Vec2 = new b2Vec2((x / engine.m_physScale), (y / engine.m_physScale)); body.SetXForm(pos, body.GetAngle()); updateSkin(); } protected function init():void{ engine = CoreEngine.getInstance(); var shapeDef:b2ShapeDef = createShapeDef(); var bodyDef:b2BodyDef = createBodyDef(); body = createBody(bodyDef, shapeDef); skin = createSkin(); updateSkin(); isDead = false; engine.addEventListener(CoreEvent.POST_UPDATE, postUpdateHandler); engine.addEventListener(CoreEvent.DESTROY, destroy); } public function destroy(e:CoreEvent=null):void{ if (skin){ skin.parent.removeChild(skin); }; if (body){ engine.m_world.DestroyBody(body); }; engine.removeEventListener(CoreEvent.POST_UPDATE, postUpdateHandler); engine.removeEventListener(CoreEvent.DESTROY, destroy); } public function getSkin():Sprite{ return (skin); } public function getBody():b2Body{ return (body); } protected function createSkin():Sprite{ return (null); } protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ return (null); } } }//package core.objects
Section 104
//BaseObjectDef (core.objects.BaseObjectDef) package core.objects { public class BaseObjectDef { public var x:Number; public var y:Number; public function BaseObjectDef(x:Number, y:Number):void{ super(); this.x = x; this.y = y; } } }//package core.objects
Section 105
//BrickBox (core.objects.BrickBox) package core.objects { import core.*; import flash.display.*; import core.events.*; import core.objects.weapons.*; import flash.geom.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class BrickBox extends BaseObject { private var pieceImpulse:b2Vec2; private var sndBreak:Sound; private var brickBoxDef:BrickBoxDef; public function BrickBox(def:BrickBoxDef):void{ brickBoxDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((brickBoxDef.width / engine.m_physScale) / 2); var h2:Number = ((brickBoxDef.height / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 0; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } private function createPieces(e:CoreEvent):void{ var i:uint; var posX:Number; var posY:Number; var def:BrickParticleDef; var particle:BrickParticle; var impulse:b2Vec2; var pos:b2Vec2 = body.GetPosition(); var cp:Point = new Point(((11.5 - 5) + (Math.random() * 10)), ((11 - 5) + (Math.random() * 10))); var zp:Point = new Point(0, 0); var le:Number = ((11 - 5) + (Math.random() * 10)); var te:Number = ((11.5 - 5) + (Math.random() * 10)); var re:Number = ((11 - 5) + (Math.random() * 10)); var be:Number = ((11.5 - 5) + (Math.random() * 10)); var vs:Array = [new Point(0, 0), new Point(te, 0), new Point(23, 0), new Point(23, re), new Point(23, 22), new Point(be, 22), new Point(0, 22), new Point(0, le)]; i = 0; while (i < vs.length) { vs[i].x = (vs[i].x - cp.x); vs[i].y = (vs[i].y - cp.y); i++; }; var allVs:Array = [[zp, vs[7], vs[0], vs[1]], [zp, vs[1], vs[2], vs[3]], [zp, vs[3], vs[4], vs[5]], [zp, vs[5], vs[6], vs[7]]]; i = 0; while (i < 4) { posX = (((pos.x * engine.m_physScale) - (brickBoxDef.width / 2)) + cp.x); posY = (((pos.y * engine.m_physScale) - (brickBoxDef.height / 2)) + cp.y); def = new BrickParticleDef(posX, posY, allVs[i], cp); particle = new BrickParticle(def); impulse = pieceImpulse.Copy(); impulse.Multiply(((particle.getBody().m_mass * 0.5) * ((1 - 0.2) + (Math.random() * 0.4)))); particle.getBody().ApplyImpulse(impulse, particle.getBody().GetWorldCenter()); i++; }; engine.removeEventListener(CoreEvent.POST_UPDATE, createPieces); } private function collideWithCannonBullet(bullet:CannonBullet):void{ var smoke:Sprite; var time:Number; var angle:Number; isDead = true; bullet.isDead = true; var SmokeClass:Class = engine.assets.getAssetClass("CannonShotSmokeAsset"); var i:uint; while (i < 3) { smoke = new (SmokeClass); smoke.x = ((skin.x - 10) + (Math.random() * 20)); smoke.y = ((skin.y - 10) + (Math.random() * 20)); engine.canvas.objectsContainer.addChild(smoke); time = (2 + (Math.random() * 1)); angle = (-500 + (Math.random() * 1000)); Tweener.addTween(smoke, {alpha:0, rotation:angle, time:time, transition:"linear", onComplete:smokeComplete, onCompleteParams:[smoke]}); i++; }; var vel:b2Vec2 = bullet.getBody().m_linearVelocity; pieceImpulse = new b2Vec2(vel.x, vel.y); engine.playSound(sndBreak); engine.addEventListener(CoreEvent.POST_UPDATE, createPieces); } private function smokeComplete(smoke:Sprite):void{ smoke.parent.removeChild(smoke); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((brickBoxDef.x / engine.m_physScale), (brickBoxDef.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function init():void{ super.init(); initSounds(); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } private function initSounds():void{ var SndBreakClass:Class = engine.assets.getAssetClass("SndBrickBreak"); sndBreak = new (SndBreakClass); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("BrickBoxAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } private function updateHandler(e:CoreEvent):void{ updateSkin(); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } private function collideAddHandler(e:CoreEvent):void{ var otherBody:b2Body; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ otherBody = ((body1.m_userData == this)) ? body2 : body1; if ((otherBody.m_userData is CannonBullet)){ collideWithCannonBullet((otherBody.m_userData as CannonBullet)); }; }; } } }//package core.objects
Section 106
//BrickBoxDef (core.objects.BrickBoxDef) package core.objects { public class BrickBoxDef extends BaseObjectDef { public var width:Number; public var height:Number; public static const NAME:String = "BrickBox"; public function BrickBoxDef(x:Number, y:Number, width:Number, height:Number){ this.width = width; this.height = height; super(x, y); } public static function parseStringDef(stringDef:String):BrickBoxDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:BrickBoxDef = new BrickBoxDef(x, y, width, height); return (def); } } }//package core.objects
Section 107
//BrickParticle (core.objects.BrickParticle) package core.objects { import flash.display.*; import core.events.*; import flash.geom.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; public class BrickParticle extends BaseObject { private var lifeTime:uint; private var totalLifeTime:uint; private var particleDef:BrickParticleDef; public function BrickParticle(def:BrickParticleDef):void{ particleDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var vertex:Point; var shapeDef:b2PolygonDef = new b2PolygonDef(); shapeDef.vertexCount = particleDef.vertices.length; var i:uint; while (i < particleDef.vertices.length) { vertex = particleDef.vertices[i]; shapeDef.vertices[i].Set((vertex.x / engine.m_physScale), (vertex.y / engine.m_physScale)); i++; }; shapeDef.density = 1; shapeDef.filter.categoryBits = 32; return (shapeDef); } protected function updateHandler(e:CoreEvent):void{ var deadSkin:Sprite; updateSkin(); lifeTime++; if (lifeTime > totalLifeTime){ isDead = true; deadSkin = createSkin(); deadSkin.x = skin.x; deadSkin.y = skin.y; deadSkin.rotation = skin.rotation; Tweener.addTween(deadSkin, {alpha:0, time:0.2, transition:"linear", onComplete:deadSkinComplete, onCompleteParams:[deadSkin]}); }; } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } override protected function init():void{ super.init(); lifeTime = 0; totalLifeTime = (50 + Math.round((Math.random() * 50))); engine.addEventListener(CoreEvent.UPDATE, updateHandler); } override protected function createSkin():Sprite{ var vertex:Point; var BrickClass:Class = engine.assets.getAssetClass("BrickBoxAsset"); var skinBrick:Sprite = new (BrickClass); var bmpData:BitmapData = new BitmapData(skinBrick.width, skinBrick.height, false); var m:Matrix = new Matrix(); m.translate((skinBrick.width / 2), (skinBrick.height / 2)); bmpData.draw(skinBrick, m, null, null, null, true); var skin:Sprite = new Sprite(); var skinInner:Sprite = new Sprite(); skin.addChild(skinInner); skinInner.graphics.clear(); skinInner.graphics.beginBitmapFill(bmpData); var firstVertex:Point = new Point((particleDef.vertices[0].x + particleDef.center.x), (particleDef.vertices[0].y + particleDef.center.y)); skinInner.graphics.moveTo(firstVertex.x, firstVertex.y); var i:uint = 1; while (i < 4) { vertex = particleDef.vertices[i]; skinInner.graphics.lineTo((vertex.x + particleDef.center.x), (vertex.y + particleDef.center.y)); i++; }; skinInner.graphics.lineTo(firstVertex.x, firstVertex.y); skinInner.graphics.endFill(); skinInner.x = -(firstVertex.x); skinInner.y = -(firstVertex.y); engine.canvas.objectsContainer.addChild(skin); return (skin); } private function deadSkinComplete(deadSkin:Sprite):void{ deadSkin.parent.removeChild(deadSkin); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } } }//package core.objects
Section 108
//BrickParticleDef (core.objects.BrickParticleDef) package core.objects { import flash.geom.*; public class BrickParticleDef extends BaseObjectDef { public var vertices:Array; public var center:Point; public function BrickParticleDef(x:Number, y:Number, vertices:Array, center:Point):void{ this.vertices = vertices; this.center = center; super(x, y); } } }//package core.objects
Section 109
//Cloud (core.objects.Cloud) package core.objects { import flash.events.*; import core.*; import flash.display.*; import core.events.*; public class Cloud extends EventDispatcher { private var container:Sprite; private var speed:Number; public var skin:MovieClip; public static const FINISH:String = "Finish"; public function Cloud(container:Sprite):void{ super(); this.container = container; init(); } private function init():void{ createSkin(); container.addEventListener(Event.ENTER_FRAME, updateHandler); } private function updateHandler(e:Event):void{ skin.x = (skin.x + speed); if (skin.x >= 640){ dispatchEvent(new CoreEvent(FINISH)); destroy(null); }; } private function createSkin():void{ var SkinClass:Class = CoreAssets.getInstance().getAssetClass("CloudAsset"); skin = new (SkinClass); var frame:uint = (1 + Math.floor((Math.random() * skin.totalFrames))); skin.gotoAndStop(frame); skin.y = Math.floor((Math.random() * 150)); speed = (0.5 + (Math.random() * 0.5)); container.addChild(skin); } public function destroy(e:CoreEvent):void{ skin.parent.removeChild(skin); container.removeEventListener(Event.ENTER_FRAME, updateHandler); } } }//package core.objects
Section 110
//Coin (core.objects.Coin) package core.objects { import core.*; import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Collision.*; public class Coin extends BaseObject { private var sndCollect:Sound; public static const COLLECT:String = "Collect"; public function Coin(def:CoinDef):void{ super(def); } override protected function init():void{ super.init(); initSounds(); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } private function initSounds():void{ var SndCollectClass:Class = engine.assets.getAssetClass("SndCoinCollect"); sndCollect = new (SndCollectClass); } private function collideWithPlayer():void{ isDead = true; engine.playSound(sndCollect); dispatchEvent(new CoreEvent(COLLECT)); } private function collideAddHandler(e:CoreEvent):void{ var otherBody:b2Body; var otherShape:b2Shape; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ otherBody = ((body1.m_userData == this)) ? body2 : body1; otherShape = ((body1 == otherBody)) ? point.shape1 : point.shape2; if ((((otherBody.m_userData is Player)) && ((otherShape.m_userData == BalloonUnit.BOAT_SENSOR)))){ collideWithPlayer(); }; }; } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("CoinAsset"); var skin:MovieClip = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); return (body); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = (5 / engine.m_physScale); shapeDef.isSensor = true; return (shapeDef); } } }//package core.objects
Section 111
//CoinDef (core.objects.CoinDef) package core.objects { public class CoinDef extends BaseObjectDef { public var width:Number; public var height:Number; public static const NAME:String = "Coin"; public function CoinDef(x:Number, y:Number):void{ super(x, y); } public static function parseStringDef(stringDef:String):CoinDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var def:CoinDef = new CoinDef(x, y); return (def); } } }//package core.objects
Section 112
//Exit (core.objects.Exit) package core.objects { import core.*; import flash.display.*; import core.events.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Collision.*; public class Exit extends BaseObject { private var isClosed:Boolean; public static const PLAYER_ENTER:String = "PlayerEnter"; public function Exit(def:ExitDef):void{ super(def); isClosed = true; skin.visible = false; engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((30 / engine.m_physScale) / 2); var h2:Number = ((60 / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 0; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; shapeDef.isSensor = true; shapeDef.filter.maskBits = 2; return (shapeDef); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("ExitAsset"); var skin:Sprite = new (SkinClass); engine.canvas.bottomObjectsContainer.addChild(skin); return (skin); } public function open():void{ isClosed = false; skin.visible = true; skin.alpha = 0; Tweener.addTween(skin, {alpha:1, time:0.3, transition:"linear"}); } private function collideAddHandler(e:CoreEvent):void{ var otherShape:b2Shape; var otherBody:b2Body; if (isClosed){ return; }; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ otherShape = ((body1.m_userData == this)) ? point.shape2 : point.shape1; otherBody = ((body1.m_userData == this)) ? body2 : body1; if (otherShape.m_userData == BalloonUnit.CENTER_SENSOR){ if ((otherBody.m_userData as BalloonUnit).isActive){ dispatchEvent(new CoreEvent(PLAYER_ENTER)); }; }; }; } } }//package core.objects
Section 113
//ExitDef (core.objects.ExitDef) package core.objects { public class ExitDef extends BaseObjectDef { public static const NAME:String = "Exit"; public function ExitDef(x:Number, y:Number):void{ super(x, y); } public static function parseStringDef(stringDef:String):ExitDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var def:ExitDef = new ExitDef(x, y); return (def); } } }//package core.objects
Section 114
//GroundBot (core.objects.GroundBot) package core.objects { import flash.events.*; import core.*; import flash.display.*; import core.events.*; import core.objects.weapons.*; import flash.geom.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class GroundBot extends AbstractUnit { private var skinBarrel:Sprite; private var weapon:GroundBotWeapon; private var weaponRotationSpeed:Number; private var damage:uint; private var sndGrandExplosion:Sound; private var bulletVel:b2Vec2; public function GroundBot(def:GroundBotDef):void{ super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((22 / engine.m_physScale) / 2); var h2:Number = ((8 / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 0; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } private function updateHandler(e:CoreEvent):void{ var weaponAngle:Number; weapon.update(); var playerPos:b2Vec2 = engine.player.getBody().GetPosition(); var p:Point = new Point((playerPos.x * engine.m_physScale), (playerPos.y * engine.m_physScale)); var angle:Number = Math.round(((getShootAngle() * 180) / Math.PI)); if (angle < 0){ angle = (angle + 360); }; if (((((!(isNaN(angle))) && ((angle > (180 + 20))))) && ((angle < (360 - 20))))){ if (isPlayerVisible()){ weaponAngle = weapon.getSkin().rotation; if (weaponAngle < 0){ weaponAngle = (weaponAngle + 360); }; if (Math.abs((weaponAngle - angle)) < 5){ weapon.getSkin().rotation = angle; if (weapon.reloadTime == -1){ weapon.fire(); }; } else { if (weaponAngle < angle){ weapon.getSkin().rotation = (weapon.getSkin().rotation + weaponRotationSpeed); } else { weapon.getSkin().rotation = (weapon.getSkin().rotation - weaponRotationSpeed); }; }; }; }; } private function collideAddHandler(e:CoreEvent):void{ var thisBody:b2Body; var otherBody:b2Body; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ thisBody = ((body1.m_userData == this)) ? body1 : body2; otherBody = ((body1.m_userData == this)) ? body2 : body1; if ((otherBody.m_userData is CannonBullet)){ collideWithCannonBullet((otherBody.m_userData as CannonBullet)); }; }; } private function explodeEfHandler(e:Event):void{ var mc:MovieClip = (e.target as MovieClip); if (mc.currentFrame == mc.totalFrames){ mc.parent.removeChild(mc); mc.removeEventListener(Event.ENTER_FRAME, explodeEfHandler); }; } private function initWeapon():void{ skinBarrel = (skin.getChildByName("barrel") as Sprite); weapon = new GroundBotWeapon(16, skinBarrel); weapon.getSkin().rotation = -90; } private function isPlayerVisible():Boolean{ var segment:b2Segment = new b2Segment(); segment.p1.SetV(body.GetWorldPoint(new b2Vec2((0 / engine.m_physScale), (-5 / engine.m_physScale)))); var pp:b2Vec2 = body.GetLocalPoint(engine.player.getBody().GetPosition()); segment.p2.SetV(pp); segment.p2.Add(segment.p1); var sd:b2CircleDef = new b2CircleDef(); sd.filter.maskBits = (1 | 2); var s:b2Shape = new b2Shape(sd); var lambda:Array = [1]; var normal:b2Vec2 = new b2Vec2(); var shape:b2Shape = engine.m_world.RaycastOne(segment, lambda, normal, true, s); if (shape){ if (!(shape.GetBody().m_userData is Player)){ return (false); }; } else { return (false); }; return (true); } override protected function init():void{ super.init(); initWeapon(); damage = 0; initSounds(); weaponRotationSpeed = 2; engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); engine.addEventListener(CoreEvent.UPDATE, updateHandler); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("GroundBotAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } private function explode(e:Event):void{ weapon.getSkin().visible = false; var particleDef:BaseObjectDef = new BaseObjectDef(skin.x, skin.y); var particle:GroundBotParticle = new GroundBotParticle(particleDef); bulletVel.Multiply(0.2); var ExplosionClass:Class = engine.assets.getAssetClass("Explosion2Asset"); var explosion:MovieClip = new (ExplosionClass); explosion.x = (skin.x - 29); explosion.y = (skin.y - 59); explosion.addEventListener(Event.ENTER_FRAME, explodeEfHandler); engine.canvas.topObjectsContainer.addChild(explosion); engine.playSound(sndGrandExplosion); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); engine.removeEventListener(CoreEvent.UPDATE, explode); } private function collideWithCannonBullet(bullet:CannonBullet):void{ if (bullet.getBody().m_shapeList.m_filter.categoryBits == 4){ if (!bullet.isDead){ damage++; if (damage == 1){ weapon.damage(); } else { if (damage == 2){ bulletVel = bullet.getBody().m_linearVelocity.Copy(); engine.addEventListener(CoreEvent.UPDATE, explode); }; }; }; bullet.isDead = true; }; } override public function updateSkin():void{ var pos:b2Vec2 = body.GetWorldCenter(); skin.x = (pos.x * engine.m_physScale); skin.y = ((pos.y * engine.m_physScale) + 4); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), ((def.y - 4) / engine.m_physScale)); bodyDef.userData = this; bodyDef.linearDamping = 0.8; bodyDef.angularDamping = 0.5; return (bodyDef); } private function initSounds():void{ var SndGrandExplosionClass:Class = engine.assets.getAssetClass("SndGrandExplosion"); sndGrandExplosion = new (SndGrandExplosionClass); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } } }//package core.objects
Section 115
//GroundBotDef (core.objects.GroundBotDef) package core.objects { public class GroundBotDef extends BaseObjectDef { public static const NAME:String = "GroundBot"; public function GroundBotDef(x:Number, y:Number):void{ super(x, y); } public static function parseStringDef(stringDef:String):GroundBotDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var def:GroundBotDef = new GroundBotDef(x, y); return (def); } } }//package core.objects
Section 116
//GroundBotParticle (core.objects.GroundBotParticle) package core.objects { import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; public class GroundBotParticle extends BaseObject { private var angle:Number; public function GroundBotParticle(def:BaseObjectDef):void{ super(def); } override protected function init():void{ angle = (Math.random() * Math.PI); super.init(); var impulse:b2Vec2 = new b2Vec2((-3 + (Math.random() * 6)), (-2 - (Math.random() * 2))); body.ApplyImpulse(impulse, body.GetWorldCenter()); body.m_angularVelocity = (-5 + (Math.random() * 10)); engine.addEventListener(CoreEvent.UPDATE, updateHandler); } private function updateHandler(e:CoreEvent):void{ updateSkin(); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), ((def.y - 5) / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("GroundBotBarrelAsset"); var skinInner:Sprite = new (SkinClass); var skinInner2:MovieClip = (skinInner.getChildByName("inner") as MovieClip); skinInner2.gotoAndStop(2); var skin:Sprite = new Sprite(); skin.addChild(skinInner); skinInner.x = (-(skinInner.width) / 2); engine.canvas.objectsContainer.addChild(skin); return (skin); } override public function updateSkin():void{ var pos:b2Vec2 = body.GetPosition(); skin.x = (pos.x * engine.m_physScale); skin.y = (pos.y * engine.m_physScale); skin.rotation = (((angle + body.GetAngle()) * 180) / Math.PI); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } override protected function createShapeDef():b2ShapeDef{ var w2:Number; var h2:Number; var shapeDef:b2PolygonDef = new b2PolygonDef(); shapeDef.SetAsBox(w2, h2); w2 = ((22 / 2) / engine.m_physScale); h2 = ((11 / 2) / engine.m_physScale); shapeDef.SetAsOrientedBox(w2, h2, new b2Vec2(0, 0), angle); shapeDef.density = 1; shapeDef.filter.categoryBits = 32; return (shapeDef); } } }//package core.objects
Section 117
//MineBot (core.objects.MineBot) package core.objects { import core.*; import flash.display.*; import core.events.*; import core.objects.weapons.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class MineBot extends AbstractUnit { private var skinBarrel:Sprite; private var barrelShape:b2Shape; private var weapon:MineBotWeapon; public static const BARREL_SENSOR:String = "BarrelSensor"; public function MineBot(def:MineBotDef):void{ super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((22 / engine.m_physScale) / 2); var h2:Number = ((8 / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 0; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } private function updateHandler(e:CoreEvent):void{ weapon.update(); if (weapon.reloadTime == -1){ weapon.fire(); }; } private function collideAddHandler(e:CoreEvent):void{ var thisShape:b2Shape; var otherBody:b2Body; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ thisShape = ((point.shape1.m_body == body)) ? point.shape1 : point.shape2; otherBody = ((body1.m_userData == this)) ? body2 : body1; if ((((otherBody.m_userData is MineBullet)) && ((thisShape.m_userData == BARREL_SENSOR)))){ collideWithMineBullet(otherBody.m_userData); }; }; } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("MineBotAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } private function initWeapon():void{ skinBarrel = (skin.getChildByName("barrel") as Sprite); weapon = new MineBotWeapon(16, skinBarrel); weapon.getSkin().rotation = -90; } override public function updateSkin():void{ var pos:b2Vec2 = body.GetWorldCenter(); skin.x = (pos.x * engine.m_physScale); skin.y = ((pos.y * engine.m_physScale) + 4); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), ((def.y - 4) / engine.m_physScale)); bodyDef.userData = this; bodyDef.linearDamping = 0.8; bodyDef.angularDamping = 0.5; return (bodyDef); } override protected function init():void{ super.init(); initWeapon(); createBarrelShape(); engine.addEventListener(CoreEvent.UPDATE, updateHandler); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } private function collideWithMineBullet(bullet:MineBullet):void{ bullet.isDead = true; } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); engine.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } private function createBarrelShape():void{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.localPosition = new b2Vec2(0, (-6 / engine.m_physScale)); shapeDef.radius = (4 / engine.m_physScale); shapeDef.isSensor = true; shapeDef.userData = BARREL_SENSOR; barrelShape = body.CreateShape(shapeDef); } } }//package core.objects
Section 118
//MineBotDef (core.objects.MineBotDef) package core.objects { public class MineBotDef extends BaseObjectDef { public static const NAME:String = "MineBot"; public function MineBotDef(x:Number, y:Number):void{ super(x, y); } public static function parseStringDef(stringDef:String):MineBotDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var def:MineBotDef = new MineBotDef(x, y); return (def); } } }//package core.objects
Section 119
//Player (core.objects.Player) package core.objects { import flash.events.*; import core.*; import flash.display.*; import core.events.*; import core.objects.weapons.*; import flash.geom.*; import Box2D.Collision.Shapes.*; import flash.media.*; import Box2D.Common.Math.*; public class Player extends BalloonUnit { public var unlimAmmo:Boolean; private var input:Input; private var isMouseDown:Boolean; private var shrapnel:ShrapnelWeapon; private var currentWeapon:AbstractWeapon; private var sndNoAmmo:Sound; private var cannon:Cannon; public static const PLAYER_SHOT:String = "PlayerShot"; public function Player(def:PlayerDef):void{ super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.filter.categoryBits = 2; shapeDef.filter.maskBits = (0xFFFF & ~(bulletsCategoryBits)); return (shapeDef); } override protected function updateHandler(e:CoreEvent):void{ super.updateHandler(e); updateWeapon(); } protected function recoil():void{ var angle:Number = (skinBoat.rotation + currentWeapon.getSkin().rotation); var angleRad:Number = ((angle * Math.PI) / 180); var dx:Number = (-(Math.cos(angleRad)) * 5); var dy:Number = (-(Math.sin(angleRad)) * 5); body.ApplyImpulse(new b2Vec2(dx, dy), body.GetPosition()); } override public function deactivate():void{ super.deactivate(); } private function levelClickHandler(e:MouseEvent):void{ isMouseDown = true; } private function preUpdateWeapon():void{ if (isMouseDown){ if (currentWeapon.reloadTime == -1){ if (currentWeapon.bulletsLeft > 0){ recoil(); currentWeapon.fire(); skinWeaponIndicator.gotoAndStop(1); if (unlimAmmo){ currentWeapon.bulletsLeft++; } else { skinWeaponCharger.play(); }; dispatchEvent(new CoreEvent(PLAYER_SHOT)); } else { engine.playSound(sndNoAmmo); }; }; isMouseDown = false; }; } private function updateWeapon():void{ currentWeapon.update(); var p:Point = new Point(skin.stage.mouseX, skin.stage.mouseY); currentWeapon.rotateToPoint(p); } override protected function init():void{ bulletsCategoryBits = 4; super.init(); centerShape.m_filter.categoryBits = 2; input = Input.getInstance(); createWeapons(); initSounds(); unlimAmmo = false; } override protected function createSkin():Sprite{ var skin:Sprite = createAsset(def); engine.canvas.objectsContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.canvas.levelContainer.removeEventListener(MouseEvent.MOUSE_DOWN, levelClickHandler); engine.canvas.levelContainer.stage.removeEventListener(MouseEvent.CLICK, levelClickHandler); } override protected function preUpdateHandler(e:CoreEvent):void{ super.preUpdateHandler(e); if (isActive){ preUpdatePos(); }; preUpdateWeapon(); } private function weaponReadyHandler(e:CoreEvent):void{ skinWeaponIndicator.gotoAndStop(2); } private function setWeapon(weapon:AbstractWeapon):void{ currentWeapon = weapon; dispatchEvent(new CoreEvent(CoreEngine.PLAYER_WEAPON_SET, currentWeapon)); } private function preUpdatePos():void{ var impulse:b2Vec2; isSteered = false; var magnitude:Number = 0.6; if (((input.isKeyPressed(Input.KEY_UP)) || (input.isKeyPressed(Input.KEY_W)))){ impulse = new b2Vec2(0, -(magnitude)); body.ApplyImpulse(new b2Vec2(0, (-(magnitude) * 2)), body.GetWorldCenter()); isSteered = true; }; if (((input.isKeyPressed(Input.KEY_LEFT)) || (input.isKeyPressed(Input.KEY_A)))){ impulse = new b2Vec2((-(magnitude) / 2), 0); body.ApplyImpulse(impulse, body.GetWorldCenter()); } else { if (((input.isKeyPressed(Input.KEY_RIGHT)) || (input.isKeyPressed(Input.KEY_D)))){ impulse = new b2Vec2((magnitude / 2), 0); body.ApplyImpulse(impulse, body.GetWorldCenter()); }; }; var angle:Number = body.GetAngularVelocity(); body.ApplyTorque((-(angle) * 5)); } private function keyDownHandler(e:KeyboardEvent):void{ if (e.keyCode == 49){ setWeapon(cannon); } else { if (e.keyCode == 50){ setWeapon(shrapnel); }; }; } public function rechargeWeapon():void{ currentWeapon.bulletsLeft = 5; skinWeaponCharger.gotoAndStop(1); } private function initSounds():void{ var SndNoAmmoClass:Class = engine.assets.getAssetClass("SndNoAmmo"); sndNoAmmo = new (SndNoAmmoClass); } private function createWeapons():void{ cannon = new Cannon(bulletsCategoryBits, skinWeapon); cannon.addEventListener(AbstractWeapon.WEAPON_READY, weaponReadyHandler); setWeapon(cannon); isMouseDown = false; engine.canvas.levelContainer.addEventListener(MouseEvent.MOUSE_DOWN, levelClickHandler); } public function getCurrentWeapon():AbstractWeapon{ return (currentWeapon); } public static function createAsset(def:BaseObjectDef):Sprite{ var SkinClass:Class = CoreAssets.getInstance().getAssetClass("PlayerAsset"); var skin:Sprite = new (SkinClass); return (skin); } } }//package core.objects
Section 120
//PlayerDef (core.objects.PlayerDef) package core.objects { public class PlayerDef extends BalloonUnitDef { public static const NAME:String = "Player"; public function PlayerDef(x:Number, y:Number, width:Number, height:Number):void{ super(x, y, width, height); } public static function parseStringDef(stringDef:String):PlayerDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:PlayerDef = new PlayerDef(x, y, width, height); return (def); } } }//package core.objects
Section 121
//Propeller (core.objects.Propeller) package core.objects { import core.*; import flash.display.*; import core.events.*; import flash.geom.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class Propeller extends BaseObject { private var owner:BalloonUnit; public function Propeller(def:BaseObjectDef, skin:Sprite, owner:BalloonUnit):void{ this.skin = skin; this.owner = owner; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = (6 / engine.m_physScale); shapeDef.density = 1; shapeDef.filter.maskBits = ((0xFFFF & ~(4)) & ~(16)); shapeDef.isSensor = true; shapeDef.localPosition.Set(0, (32 / engine.m_physScale)); shapeDef.userData = this; owner.getBody().CreateShape(shapeDef); return (shapeDef); } private function updateHandler(e:CoreEvent):void{ var gp:Point = skin.parent.localToGlobal(new Point(skin.x, skin.y)); body.SetXForm(new b2Vec2((gp.x / engine.m_physScale), (gp.y / engine.m_physScale)), 0); } private function collideAddHandler(e:CoreEvent):void{ var otherBody:b2Body; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((point.shape1.m_userData == this)) || ((point.shape2.m_userData == this)))){ otherBody = ((body1.m_userData == owner)) ? body2 : body1; if ((otherBody.m_userData is SingleBalloon)){ collideWithBalloon((otherBody.m_userData as SingleBalloon)); }; }; } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } private function collideWithBalloon(balloon:SingleBalloon):void{ balloon.pop(); } override public function updateSkin():void{ } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); return (bodyDef); } override protected function init():void{ super.init(); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } override protected function createSkin():Sprite{ return (skin); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ return (owner.getBody()); } } }//package core.objects
Section 122
//SingleBalloon (core.objects.SingleBalloon) package core.objects { import core.*; import flash.display.*; import core.events.*; import core.objects.weapons.*; import flash.geom.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; import Box2D.Collision.*; public class SingleBalloon extends BaseObject { private var skinConnection:Sprite; private var ownerAnchor:Point; private var shrapnelHits:uint; private var skinInner:Sprite; public var liftForce:b2Vec2; private var sndPop:Sound; private var totalShrapnelHits:uint;// = 3 private var ownerBody:b2Body; public static const BALLOON_POPPED:String = "BalloonPopped"; public function SingleBalloon(def:BaseObjectDef):void{ super(def); } protected function updateHandler(e:CoreEvent):void{ var localPos:Point; var pos:b2Vec2 = body.GetPosition(); localPos = skin.parent.globalToLocal(new Point((pos.x * engine.m_physScale), (pos.y * engine.m_physScale))); skin.x = localPos.x; skin.y = localPos.y; var boatUpPos:b2Vec2 = ownerBody.GetWorldPoint(new b2Vec2((ownerAnchor.x / engine.m_physScale), (ownerAnchor.y / engine.m_physScale))); var angle:Number = Math.atan2((pos.y - boatUpPos.y), (pos.x - boatUpPos.x)); skinInner.rotation = (((angle * 180) / Math.PI) + 90); localPos = skinConnection.globalToLocal(new Point((boatUpPos.x * engine.m_physScale), (boatUpPos.y * engine.m_physScale))); skinConnection.graphics.clear(); skinConnection.graphics.lineStyle(0, 0, 1); skinConnection.graphics.moveTo(0, 15); skinConnection.graphics.lineTo(localPos.x, (localPos.y + 1)); } public function deactivate():void{ body.m_linearDamping = 10; engine.removeEventListener(CoreEvent.PRE_UPDATE, preUpdateHandler); } private function collideWithBullet(bullet:AbstractBullet):void{ if (bullet.isDead){ return; }; bullet.isDead = true; if ((((bullet is CannonBullet)) || ((bullet is MineBullet)))){ pop(); } else { if ((bullet is ShrapnelBullet)){ addShrapnelHit(); }; }; } protected function collideAddHandler(e:CoreEvent):void{ var thisBody:b2Body; var otherBody:b2Body; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ thisBody = ((body1.m_userData == this)) ? body1 : body2; otherBody = ((body1.m_userData == this)) ? body2 : body1; if ((otherBody.m_userData is AbstractBullet)){ collideWithBullet(otherBody.m_userData); } else { if ((otherBody.m_userData is Tenons)){ collideWithTenons(); }; }; }; } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = (15 / engine.m_physScale); shapeDef.density = 1; shapeDef.filter.categoryBits = ownerBody.m_shapeList.m_filter.categoryBits; shapeDef.filter.maskBits = ownerBody.m_shapeList.m_filter.maskBits; return (shapeDef); } public function pop():void{ isDead = true; dispatchEvent(new CoreEvent(BALLOON_POPPED)); var BalloonClass:Class = engine.assets.getAssetClass("BalloonAsset"); var popSkin:Sprite = new (BalloonClass); engine.canvas.objectsContainer.addChild(popSkin); var pos:b2Vec2 = body.GetPosition(); popSkin.x = (pos.x * engine.m_physScale); popSkin.y = (pos.y * engine.m_physScale); popSkin.rotation = skin.rotation; Tweener.addTween(popSkin, {scaleX:2, scaleY:2, alpha:0, time:0.5, transition:"linear", onComplete:popComplete, onCompleteParams:[popSkin]}); engine.playSound(sndPop); } private function addShrapnelHit():void{ var ShrapnelHitClass:Class; var shrapnelHit:Sprite; shrapnelHits++; if (shrapnelHits < totalShrapnelHits){ ShrapnelHitClass = engine.assets.getAssetClass("ShrapnelHitAsset"); shrapnelHit = new (ShrapnelHitClass); shrapnelHit.x = (-10 + (Math.random() * 20)); shrapnelHit.y = (-10 + (Math.random() * 20)); skin.addChild(shrapnelHit); } else { if (!isDead){ pop(); }; }; } protected function preUpdateHandler(e:CoreEvent):void{ var norm:Number; var force:b2Vec2 = liftForce.Copy(); if (body.GetPosition().y < (50 / engine.m_physScale)){ norm = ((body.GetPosition().y * engine.m_physScale) / 50); force.Multiply(norm); }; body.ApplyImpulse(force, body.GetWorldCenter()); } override protected function init():void{ engine = CoreEngine.getInstance(); isDead = false; liftForce = new b2Vec2(0, 0); shrapnelHits = 0; initSounds(); engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); engine.addEventListener(CoreEvent.PRE_UPDATE, preUpdateHandler); engine.addEventListener(CoreEvent.UPDATE, updateHandler); engine.addEventListener(CoreEvent.POST_UPDATE, postUpdateHandler); engine.addEventListener(CoreEvent.DESTROY, destroy); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); bodyDef.userData = this; bodyDef.linearDamping = 0.8; return (bodyDef); } protected function createJoint():void{ var djd:b2DistanceJointDef = new b2DistanceJointDef(); var boatPos:b2Vec2 = ownerBody.GetPosition(); var boatAnchor:b2Vec2 = new b2Vec2(boatPos.x, (boatPos.y - (25 / engine.m_physScale))); djd.Initialize(ownerBody, body, boatAnchor, body.GetWorldCenter()); engine.m_world.CreateJoint(djd); } private function popComplete(popSkin:Sprite):void{ popSkin.parent.removeChild(popSkin); } private function initSounds():void{ var SndPopClass:Class = engine.assets.getAssetClass("SndBalloonPop"); sndPop = new (SndPopClass); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); engine.removeEventListener(CoreEvent.PRE_UPDATE, preUpdateHandler); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } private function collideWithTenons():void{ pop(); } public function initialize(ownerBody:b2Body, ownerAnchor:Point, skin:Sprite):void{ this.ownerBody = ownerBody; this.ownerAnchor = ownerAnchor; this.skin = skin; var shapeDef:b2ShapeDef = createShapeDef(); var bodyDef:b2BodyDef = createBodyDef(); body = createBody(bodyDef, shapeDef); skinInner = (skin.getChildByName("inner") as Sprite); skinConnection = new Sprite(); skinInner.addChild(skinConnection); createJoint(); updateSkin(); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } } }//package core.objects
Section 123
//StaticWall (core.objects.StaticWall) package core.objects { import core.*; import flash.display.*; import flash.geom.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; public class StaticWall extends BaseObject { private var wallDef:StaticWallDef; public static const SkinClassName:String = "BrickBoxAsset"; public function StaticWall(def:StaticWallDef):void{ wallDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((wallDef.width / engine.m_physScale) / 2); var h2:Number = ((wallDef.height / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 0; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((wallDef.x / engine.m_physScale), (wallDef.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function createSkin():Sprite{ var skin:Sprite = createAsset(wallDef); engine.canvas.objectsContainer.addChild(skin); return (skin); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } public static function createAsset(wallDef:StaticWallDef):Sprite{ var m:Matrix; var bmpData:BitmapData = new BitmapData(wallDef.width, wallDef.height, true, 0); var GroundLeftClass:Class = CoreAssets.getInstance().getAssetClass("GroundLeftAsset"); var groundLeft:BitmapData = new GroundLeftClass(0, 0); var GroundCenterClass:Class = CoreAssets.getInstance().getAssetClass("GroundCenterAsset"); var groundCenter:BitmapData = new GroundCenterClass(0, 0); var GroundRightClass:Class = CoreAssets.getInstance().getAssetClass("GroundRightAsset"); var groundRight:BitmapData = new GroundRightClass(0, 0); var skinInner:Sprite = new Sprite(); skinInner.graphics.beginBitmapFill(groundLeft); skinInner.graphics.drawRect(0, 0, 30, wallDef.height); skinInner.graphics.endFill(); m = new Matrix(); m.translate(30, 0); skinInner.graphics.beginBitmapFill(groundCenter, m); skinInner.graphics.drawRect(30, 0, ((wallDef.width - 30) - 20), wallDef.height); skinInner.graphics.endFill(); m = new Matrix(); m.translate((wallDef.width - 20), 0); skinInner.graphics.beginBitmapFill(groundRight, m); skinInner.graphics.drawRect((wallDef.width - 20), 0, 20, wallDef.height); skinInner.graphics.endFill(); skinInner.x = (-(wallDef.width) / 2); skinInner.y = (-(wallDef.height) / 2); var skin:Sprite = new Sprite(); skin.addChild(skinInner); return (skin); } } }//package core.objects
Section 124
//StaticWallDef (core.objects.StaticWallDef) package core.objects { public class StaticWallDef extends BaseObjectDef { public var width:Number; public var height:Number; public static const NAME:String = "Wall"; public function StaticWallDef(x:Number, y:Number, width:Number, height:Number){ this.width = width; this.height = height; super(x, y); } public static function parseStringDef(stringDef:String):StaticWallDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:StaticWallDef = new StaticWallDef(x, y, width, height); return (def); } } }//package core.objects
Section 125
//Tenons (core.objects.Tenons) package core.objects { import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; public class Tenons extends BaseObject { private var tenonsDef:TenonsDef; public function Tenons(def:TenonsDef):void{ tenonsDef = def; super(def); } override protected function init():void{ super.init(); engine.addEventListener(CoreEvent.UPDATE, updateHandler); } protected function updateHandler(e:CoreEvent):void{ updateSkin(); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((tenonsDef.x / engine.m_physScale), (tenonsDef.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("TenonsAsset"); var skin:Sprite = new (SkinClass); skin.width = tenonsDef.width; skin.height = tenonsDef.height; engine.canvas.objectsContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((tenonsDef.width / engine.m_physScale) / 2); var h2:Number = ((tenonsDef.height / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 1; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } } }//package core.objects
Section 126
//TenonsBalloon (core.objects.TenonsBalloon) package core.objects { import flash.display.*; import core.events.*; import flash.geom.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class TenonsBalloon extends Tenons { private var tenonsDef:TenonsBalloonDef; private var balloon:SingleBalloon; public function TenonsBalloon(def:TenonsBalloonDef):void{ tenonsDef = def; super(def); } override protected function init():void{ super.init(); createBalloon(); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); balloon.removeEventListener(SingleBalloon.BALLOON_POPPED, balloonPoppedHandler); } override public function updateSkin():void{ super.updateSkin(); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.density = 1; return (shapeDef); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("TenonsBalloonAsset"); var skin:Sprite = new (SkinClass); var skinTenons:Sprite = (skin.getChildByName("tenons") as Sprite); skinTenons.width = tenonsDef.width; skinTenons.height = tenonsDef.height; engine.canvas.objectsContainer.addChild(skin); return (skin); } private function createBalloon():void{ var def:BaseObjectDef; var bodyPos:b2Vec2 = body.GetPosition(); var skinBalloon:Sprite = (skin.getChildByName("balloon") as Sprite); def = new BaseObjectDef((bodyPos.x * engine.m_physScale), ((bodyPos.y * engine.m_physScale) - 45)); balloon = new SingleBalloon(def); balloon.initialize(body, new Point(0, 0), skinBalloon); balloon.liftForce.Set(0, -1.2); balloon.addEventListener(SingleBalloon.BALLOON_POPPED, balloonPoppedHandler); } private function balloonPoppedHandler(e:CoreEvent):void{ } } }//package core.objects
Section 127
//TenonsBalloonDef (core.objects.TenonsBalloonDef) package core.objects { import flash.geom.*; public class TenonsBalloonDef extends TenonsDef { public var anchor:Point; public static const NAME:String = "TenonsBalloon"; public function TenonsBalloonDef(x:Number, y:Number, width:Number, height:Number):void{ super(x, y, width, height); } public static function parseStringDef(stringDef:String):TenonsBalloonDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:TenonsBalloonDef = new TenonsBalloonDef(x, y, width, height); return (def); } } }//package core.objects
Section 128
//TenonsBox (core.objects.TenonsBox) package core.objects { import flash.display.*; import Box2D.Collision.Shapes.*; public class TenonsBox extends Tenons { private var tenonsDef:TenonsBoxDef; public function TenonsBox(def:TenonsBoxDef):void{ tenonsDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.density = 0; return (shapeDef); } override protected function createSkin():Sprite{ var SkinDataClass:Class = engine.assets.getAssetClass("TenonsBoxData"); var skinData:BitmapData = new SkinDataClass(0, 0); var skin:Sprite = new Sprite(); var skinInner:Sprite = new Sprite(); skinInner.graphics.beginBitmapFill(skinData); skinInner.graphics.drawRect(0, 0, tenonsDef.width, tenonsDef.height); skinInner.graphics.endFill(); skinInner.x = (-(tenonsDef.width) / 2); skinInner.y = (-(tenonsDef.height) / 2); skin.addChild(skinInner); engine.canvas.objectsContainer.addChild(skin); return (skin); } } }//package core.objects
Section 129
//TenonsBoxDef (core.objects.TenonsBoxDef) package core.objects { public class TenonsBoxDef extends TenonsDef { public static const NAME:String = "TenonsBox"; public function TenonsBoxDef(x:Number, y:Number, width:Number, height:Number):void{ super(x, y, width, height); } public static function parseStringDef(stringDef:String):TenonsBoxDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:TenonsBoxDef = new TenonsBoxDef(x, y, width, height); return (def); } } }//package core.objects
Section 130
//TenonsDef (core.objects.TenonsDef) package core.objects { public class TenonsDef extends BaseObjectDef { public var width:Number; public var height:Number; public static const TYPE_SUSPENSION:String = "TypeSuspension"; public static const NAME:String = "Tenons"; public function TenonsDef(x:Number, y:Number, width:Number, height:Number):void{ this.width = width; this.height = height; super(x, y); } public static function parseStringDef(stringDef:String):TenonsDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:TenonsDef = new TenonsDef(x, y, width, height); return (def); } } }//package core.objects
Section 131
//TenonsProp (core.objects.TenonsProp) package core.objects { import flash.display.*; import core.events.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class TenonsProp extends Tenons { private var skinProp:MovieClip; private var totalSteps:uint; private var speed:Number; private var propFrame:uint; private var dy:Number; protected var exhaustTime:uint; private var dx:Number; private var tenonsDef:TenonsPropDef; private var currentStep:uint; private var mult:int; protected var exhaustDelay:uint;// = 25 public function TenonsProp(def:TenonsPropDef):void{ this.tenonsDef = def; super(def); } override protected function updateHandler(e:CoreEvent):void{ updatePos(); updateSkin(); updateExhaust(); } private function updatePos():void{ var pos:b2Vec2; if (currentStep >= totalSteps){ currentStep = 0; if (mult == 1){ pos = new b2Vec2((tenonsDef.x2 / engine.m_physScale), (tenonsDef.y2 / engine.m_physScale)); } else { pos = new b2Vec2((tenonsDef.x / engine.m_physScale), (tenonsDef.y / engine.m_physScale)); }; mult = (mult * -1); } else { pos = body.GetPosition().Copy(); pos.x = (pos.x + ((dx * mult) / engine.m_physScale)); pos.y = (pos.y + ((dy * mult) / engine.m_physScale)); currentStep++; }; body.SetXForm(pos, 0); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.density = 0; return (shapeDef); } override protected function init():void{ super.init(); skinProp = (skin.getChildByName("prop") as MovieClip); skinProp.stop(); propFrame = 0; speed = 1; var angle:Number = Math.atan2((tenonsDef.y2 - tenonsDef.y), (tenonsDef.x2 - tenonsDef.x)); dx = (speed * Math.cos(angle)); dy = (speed * Math.sin(angle)); var dist:Number = Math.sqrt((((tenonsDef.x2 - tenonsDef.x) * (tenonsDef.x2 - tenonsDef.x)) + ((tenonsDef.y2 - tenonsDef.y) * (tenonsDef.y2 - tenonsDef.y)))); totalSteps = Math.round((dist / speed)); currentStep = 0; mult = 1; } protected function exhaustComplete(exhaust:Sprite):void{ exhaust.parent.removeChild(exhaust); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("TenonsPropAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } protected function updateExhaust():void{ var ExhaustClass:Class; var exhaust:MovieClip; var pos:b2Vec2; exhaustTime++; if (exhaustTime >= exhaustDelay){ exhaustTime = 0; ExhaustClass = engine.assets.getAssetClass("ExhaustAsset"); exhaust = new (ExhaustClass); exhaust.gotoAndStop((1 + Math.floor((Math.random() * 2)))); pos = body.GetWorldPoint(new b2Vec2((0 / engine.m_physScale), (-30 / engine.m_physScale))); exhaust.x = (pos.x * engine.m_physScale); exhaust.y = (pos.y * engine.m_physScale); exhaust.scaleX = 0.2; exhaust.scaleY = 0.2; engine.canvas.objectsContainer.addChild(exhaust); Tweener.addTween(exhaust, {y:(exhaust.y - 50), scaleX:1, scaleY:1, alpha:0, rotation:(-500 + (Math.random() * 1000)), time:2, transition:"linear", onComplete:exhaustComplete, onCompleteParams:[exhaust]}); }; } override public function updateSkin():void{ super.updateSkin(); if (propFrame >= 2){ propFrame = 0; if ((skinProp.currentFrame == skinProp.totalFrames)){ skinProp.gotoAndStop(1); } else { skinProp.nextFrame(); }; } else { propFrame++; }; } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); } } }//package core.objects
Section 132
//TenonsPropDef (core.objects.TenonsPropDef) package core.objects { public class TenonsPropDef extends TenonsDef { public var y2:Number; public var x2:Number; public static const NAME:String = "TenonsProp"; public function TenonsPropDef(x:Number, y:Number, x2:Number, y2:Number, width:Number, height:Number):void{ this.x2 = x2; this.y2 = y2; super(x, y, width, height); } public static function parseStringDef(stringDef:String):TenonsPropDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var x2:Number = props[3]; var y2:Number = props[4]; var width:Number = props[5]; var height:Number = props[6]; var def:TenonsPropDef = new TenonsPropDef(x, y, x2, y2, width, height); return (def); } } }//package core.objects
Section 133
//TenonsSusp (core.objects.TenonsSusp) package core.objects { import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; public class TenonsSusp extends Tenons { private var skinSusp:Sprite; private var tenonsDef:TenonsSuspDef; public function TenonsSusp(def:TenonsSuspDef):void{ tenonsDef = def; super(def); } override protected function init():void{ super.init(); createSuspension(); } override protected function createSkin():Sprite{ var skin:Sprite = super.createSkin(); skinSusp = new Sprite(); engine.canvas.bottomObjectsContainer.addChild(skinSusp); return (skin); } override public function updateSkin():void{ super.updateSkin(); skinSusp.graphics.clear(); skinSusp.graphics.lineStyle(0, 0); skinSusp.graphics.moveTo(skin.x, skin.y); skinSusp.graphics.lineTo(tenonsDef.anchor.x, tenonsDef.anchor.y); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.density = 1; return (shapeDef); } private function createSuspension():void{ var djd:b2DistanceJointDef = new b2DistanceJointDef(); djd.Initialize(body, engine.getBodyUnderPoint(tenonsDef.anchor), body.GetPosition(), new b2Vec2((tenonsDef.anchor.x / engine.m_physScale), (tenonsDef.anchor.y / engine.m_physScale))); engine.m_world.CreateJoint(djd); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); } } }//package core.objects
Section 134
//TenonsSuspDef (core.objects.TenonsSuspDef) package core.objects { import flash.geom.*; public class TenonsSuspDef extends TenonsDef { public var anchor:Point; public static const NAME:String = "TenonsSuspension"; public function TenonsSuspDef(x:Number, y:Number, width:Number, height:Number, anchor:Point):void{ this.anchor = anchor; super(x, y, width, height); } public static function parseStringDef(stringDef:String):TenonsSuspDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var anchorX:Number = props[5]; var anchorY:Number = props[6]; var def:TenonsSuspDef = new TenonsSuspDef(x, y, width, height, new Point(anchorX, anchorY)); return (def); } } }//package core.objects
Section 135
//WallBulletParticle (core.objects.WallBulletParticle) package core.objects { import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import Box2D.Common.Math.*; public class WallBulletParticle extends BaseObject { private var totalLifeTime:uint; private var gravity:Number; private var dx:Number; private var dy:Number; private var radius:Number; private var lifeTime:uint; private var x:Number; private var y:Number; private var direction:b2Vec2; public function WallBulletParticle(def:BaseObjectDef):void{ super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = (radius / engine.m_physScale); shapeDef.density = 0.1; shapeDef.filter.categoryBits = 32; shapeDef.filter.maskBits = 1; return (shapeDef); } protected function updateHandler(e:CoreEvent):void{ updateSkin(); skin.alpha = (1 - (lifeTime / totalLifeTime)); lifeTime++; if (lifeTime > totalLifeTime){ isDead = true; }; } override protected function init():void{ radius = (1 + Math.floor((Math.random() * 3))); super.init(); dx = (-2 + (Math.random() * 4)); dy = (-2 + (Math.random() * 4)); skin.width = (skin.height = (radius * 2)); gravity = -2; lifeTime = 0; totalLifeTime = (20 + Math.round((Math.random() * 50))); engine.addEventListener(CoreEvent.UPDATE, updateHandler); } public function initialize(vel:b2Vec2, hitValue:Number):void{ var dx:Number = (-0.5 + Math.random()); var dy:Number = (-0.5 - (Math.random() * 0.5)); var impulse:b2Vec2 = vel.Copy(); impulse.Negative(); impulse.Multiply((hitValue * body.m_mass)); impulse.Multiply((20 + (Math.random() * 40))); var m:b2Mat22 = new b2Mat22(((-(Math.PI) / 16) + ((Math.random() * Math.PI) / 8))); impulse = b2Math.b2MulMV(m, impulse); body.ApplyImpulse(impulse, body.GetWorldCenter()); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("DebrisGrassAsset"); var skin:MovieClip = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); switch (radius){ case 1: skin.gotoAndStop(1); break; case 2: if ((Math.random() > 0.5)){ skin.gotoAndStop(2); } else { skin.gotoAndStop(3); }; break; case 3: if ((Math.random() > 0.5)){ skin.gotoAndStop(4); } else { skin.gotoAndStop(5); }; break; }; return (skin); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); bodyDef.userData = this; bodyDef.angularDamping = 10; return (bodyDef); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } } }//package core.objects
Section 136
//Water (core.objects.Water) package core.objects { import flash.events.*; import core.*; import flash.display.*; import core.events.*; import core.objects.weapons.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class Water extends BaseObject { private var sndSplash:Sound; private var waterBodies:Array; public function Water(def:BaseObjectDef):void{ super(def); } private function collideWithGroundBotParticle(particle:GroundBotParticle):void{ engine.playSound(sndSplash); collideWithBaseObject(particle); } private function collideWithBrickParticle(particle:BrickParticle):void{ collideWithBaseObject(particle); } private function collideWithBullet(bullet:AbstractBullet):void{ var bulletPos:b2Vec2; var splashX:Number; var bubble:WaterBubble; collideWithBaseObject(bullet); if ((bullet is CannonBullet)){ engine.playSound(sndSplash); bulletPos = bullet.getBody().GetPosition(); splashX = (bulletPos.x * engine.m_physScale); createSplash(splashX); bubble = new WaterBubble(); engine.canvas.topObjectsContainer.addChild(bubble); bubble.initialize(splashX); }; } private function collideAddHandler(e:CoreEvent):void{ var otherBody:b2Body; var otherShape:b2Shape; var point:b2ContactPoint = (e.data as b2ContactPoint); var body1:b2Body = point.shape1.m_body; var body2:b2Body = point.shape2.m_body; if ((((body1.m_userData == this)) || ((body2.m_userData == this)))){ otherBody = ((body1.m_userData == this)) ? body2 : body1; otherShape = ((body1 == otherBody)) ? point.shape1 : point.shape2; if (waterBodies.indexOf(otherBody) != -1){ return; }; if ((otherBody.m_userData is AbstractBullet)){ collideWithBullet((otherBody.m_userData as AbstractBullet)); } else { if (otherShape.m_userData == BalloonUnit.CENTER_SENSOR){ collideWithBalloonUnit((otherBody.m_userData as BalloonUnit)); } else { if ((otherBody.m_userData is Tenons)){ collideWithTenons((otherBody.m_userData as Tenons)); } else { if ((otherBody.m_userData is BrickParticle)){ collideWithBrickParticle((otherBody.m_userData as BrickParticle)); } else { if ((otherBody.m_userData is GroundBotParticle)){ collideWithGroundBotParticle((otherBody.m_userData as GroundBotParticle)); }; }; }; }; }; }; } private function splashEfHandler(e:Event):void{ var splash:MovieClip = (e.target as MovieClip); if (splash.currentFrame == splash.totalFrames){ splash.stop(); splash.removeEventListener(Event.ENTER_FRAME, splashEfHandler); splash.parent.removeChild(splash); }; } private function createSplash(x:Number):void{ var SplashClass:Class = engine.assets.getAssetClass("WaterSplashAsset"); var splash:MovieClip = new (SplashClass); splash.x = x; splash.y = (skin.y - (skin.height / 2)); engine.canvas.topObjectsContainer.addChild(splash); splash.addEventListener(Event.ENTER_FRAME, splashEfHandler); } private function collideWithBaseObject(obj:BaseObject):void{ var body:b2Body = obj.getBody(); body.m_linearVelocity.Multiply(0.3); body.m_linearDamping = 10; body.m_angularDamping = 10; waterBodies.push(body); } private function collideWithBalloonUnit(unit:BalloonUnit):void{ collideWithBaseObject(unit); unit.deactivate(); engine.playSound(sndSplash); } private function initSounds():void{ var SndSplashClass:Class = engine.assets.getAssetClass("SndWaterSplash"); sndSplash = new (SndSplashClass); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((def.x / engine.m_physScale), (def.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((640 / 2) / engine.m_physScale); var h2:Number = ((480 - def.y) / engine.m_physScale); shapeDef.SetAsBox(w2, h2); shapeDef.density = 0; shapeDef.isSensor = true; return (shapeDef); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("WaterAsset"); var skin:Sprite = new (SkinClass); engine.canvas.topObjectsContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.contactListener.dispatcher.removeEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } private function collideWithTenons(tenons:Tenons):void{ collideWithBaseObject(tenons); engine.playSound(sndSplash); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); return (body); } override protected function init():void{ super.init(); initSounds(); waterBodies = []; engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD, collideAddHandler); } } }//package core.objects
Section 137
//WaterBubble (core.objects.WaterBubble) package core.objects { import core.*; import flash.display.*; import caurina.transitions.*; public class WaterBubble extends Sprite { private var time:Number; private var dt:Number; private var r:Number; private var skin:Sprite; public function WaterBubble():void{ super(); init(); } private function liftUpComplete():void{ this.parent.removeChild(this); } private function liftUpUpdate():void{ x = (x + Math.sin(time)); time = (time + dt); } public function initialize(startX:Number):void{ y = (480 + (height / 2)); x = startX; r = (0.5 + (Math.random() * 0.5)); time = 0; dt = (0.05 + (Math.random() * 0.15)); Tweener.addTween(this, {y:(y - 47), time:1.5, delay:1, transition:"linear", onUpdate:liftUpUpdate, onComplete:liftUpComplete}); } private function init():void{ var SkinClass:Class = CoreAssets.getInstance().getAssetClass("WaterBubbleAsset"); skin = new (SkinClass); addChild(skin); } } }//package core.objects
Section 138
//WoodBox (core.objects.WoodBox) package core.objects { import flash.display.*; import core.events.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; public class WoodBox extends BaseObject { private var woodBoxDef:WoodBoxDef; public function WoodBox(def:WoodBoxDef):void{ woodBoxDef = def; super(def); } override protected function init():void{ super.init(); engine.addEventListener(CoreEvent.UPDATE, updateHandler); } private function updateHandler(e:CoreEvent):void{ updateSkin(); } override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body = engine.m_world.CreateBody(bodyDef); body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((woodBoxDef.x / engine.m_physScale), (woodBoxDef.y / engine.m_physScale)); bodyDef.userData = this; return (bodyDef); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("WoodBoxAsset"); var skin:Sprite = new (SkinClass); engine.canvas.objectsContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.removeEventListener(CoreEvent.UPDATE, updateHandler); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2PolygonDef = new b2PolygonDef(); var w2:Number = ((woodBoxDef.width / engine.m_physScale) / 2); var h2:Number = ((woodBoxDef.height / engine.m_physScale) / 2); shapeDef.SetAsBox(w2, h2); shapeDef.density = 1; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } } }//package core.objects
Section 139
//WoodBoxDef (core.objects.WoodBoxDef) package core.objects { public class WoodBoxDef extends BaseObjectDef { public var width:Number; public var height:Number; public static const NAME:String = "WoodBox"; public function WoodBoxDef(x:Number, y:Number, width:Number, height:Number){ this.width = width; this.height = height; super(x, y); } public static function parseStringDef(stringDef:String):WoodBoxDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var width:Number = props[3]; var height:Number = props[4]; var def:WoodBoxDef = new WoodBoxDef(x, y, width, height); return (def); } } }//package core.objects
Section 140
//BContactListener (core.BContactListener) package core { import flash.events.*; import core.events.*; import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Dynamics.Contacts.*; public class BContactListener extends b2ContactListener { public var dispatcher:EventDispatcher; public static const COLLIDE_ADD:String = "CollideAdd"; public static const COLLIDE_PERSIST:String = "CollidePersist"; public static const COLLIDE_REMOVE:String = "CollideRemove"; public static const COLLIDE_RESULT:String = "CollideResult"; public function BContactListener():void{ super(); dispatcher = new EventDispatcher(); } override public function Add(point:b2ContactPoint):void{ dispatcher.dispatchEvent(new CoreEvent(COLLIDE_ADD, point)); } override public function Persist(point:b2ContactPoint):void{ dispatcher.dispatchEvent(new CoreEvent(COLLIDE_PERSIST, point)); } public function collideExist(body1:b2Body, body2:b2Body):Boolean{ var c:b2ContactEdge = body1.m_contactList; while (c) { if (c.other == body2){ return (true); }; c = c.next; }; return (false); } override public function Remove(point:b2ContactPoint):void{ dispatcher.dispatchEvent(new CoreEvent(COLLIDE_REMOVE, point)); } override public function Result(point:b2ContactResult):void{ dispatcher.dispatchEvent(new CoreEvent(COLLIDE_RESULT, point)); } } }//package core
Section 141
//CloudsManager (core.CloudsManager) package core { import flash.display.*; import core.objects.*; import core.events.*; public class CloudsManager { private var container:Sprite; public function CloudsManager(container:Sprite):void{ super(); this.container = container; init(); } private function init():void{ var cloud:Cloud; var i:uint; while (i < 3) { cloud = new Cloud(container); cloud.skin.x = Math.floor((Math.random() * 640)); cloud.addEventListener(Cloud.FINISH, cloudFinishHandler); i++; }; } private function cloudFinishHandler(e:CoreEvent):void{ var newCloud:Cloud; var cloud:Cloud = (e.target as Cloud); cloud.removeEventListener(Cloud.FINISH, cloudFinishHandler); newCloud = new Cloud(container); newCloud.skin.x = -100; newCloud.addEventListener(Cloud.FINISH, cloudFinishHandler); } } }//package core
Section 142
//CoreAssets (core.CoreAssets) package core { import flash.events.*; import flash.display.*; import flash.system.*; public class CoreAssets extends EventDispatcher { private var Assets:Class; private var appDomain:ApplicationDomain; public var inited:Boolean; private static var instance:CoreAssets; public function CoreAssets():void{ Assets = CoreAssets_Assets; super(); inited = false; } public function init():void{ var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, assetsInitHandler); loader.loadBytes(new Assets()); } private function assetsInitHandler(e:Event):void{ appDomain = e.target.content.loaderInfo.applicationDomain; inited = true; dispatchEvent(new Event(Event.INIT)); } public function getAssetClass(name:String):Class{ if (!appDomain.hasDefinition(name)){ trace((("*Error*: There is no definition of class '" + name) + "'")); return (null); }; return ((appDomain.getDefinition(name) as Class)); } public static function getInstance():CoreAssets{ if (!instance){ instance = new (CoreAssets); }; return (instance); } } }//package core
Section 143
//CoreAssets_Assets (core.CoreAssets_Assets) package core { import mx.core.*; public class CoreAssets_Assets extends ByteArrayAsset { } }//package core
Section 144
//CoreCanvas (core.CoreCanvas) package core { import flash.display.*; public class CoreCanvas { public var topObjectsContainer:Sprite; public var bottomObjectsContainer:Sprite; public var levelContainer:Sprite; public var objectsContainer:Sprite; public var debugContainer:Sprite; public function CoreCanvas(levelContainer:Sprite, objectsContainer:Sprite, topObjectsContainer:Sprite, bottomObjectsContainer:Sprite, debugContainer:Sprite):void{ super(); this.levelContainer = levelContainer; this.objectsContainer = objectsContainer; this.topObjectsContainer = topObjectsContainer; this.bottomObjectsContainer = bottomObjectsContainer; this.debugContainer = debugContainer; } } }//package core
Section 145
//CoreEngine (core.CoreEngine) package core { import flash.events.*; import flash.display.*; import game.model.*; import core.objects.*; import core.events.*; import flash.geom.*; import caurina.transitions.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.*; import flash.media.*; import Box2D.Common.Math.*; import Box2D.Collision.*; public class CoreEngine extends EventDispatcher { public var sndTransform:SoundTransform; public var assets:CoreAssets; private var currentLevel:Level; public var m_physScale:Number;// = 30 public var exit:Exit; private var levelStatus:String; public var m_world:b2World; private var m_iterations:int;// = 10 private var m_timeStep:Number;// = 0.0333333333333333 private var appProxy:AppProxy; public var canvas:CoreCanvas; private var sndChannel:SoundChannel; private var balloonBots:uint; public var player:Player; private var elapsedTime:uint; public var contactListener:BContactListener; public static const LEVEL_COMPLETE:String = "LevelComplete"; public static const LEVEL_FAIL:String = "LevelFail"; public static const PLAYER_WEAPON_SET:String = "PlayerWeaponSet"; private static var instance:CoreEngine; public function CoreEngine():void{ super(); init(); } private function createAmmoBox(def:AmmoBoxDef):void{ var ammoBox:AmmoBox = new AmmoBox(def); } private function createWater(waterDef:BaseObjectDef):void{ var water:Water = new Water(waterDef); } private function clearCanvas():void{ while (canvas.objectsContainer.numChildren > 0) { canvas.objectsContainer.removeChildAt(0); }; } public function parseLevel(level:Level):void{ var objDef:String; var props:Array; var name:String; currentLevel = level; balloonBots = 0; currentLevel.coinsCollected = 0; var levelDef:String = level.def; trace(levelDef); var objects:Array = levelDef.split(" "); var i:uint; while (i < objects.length) { objDef = objects[i]; props = objDef.split("_"); name = props[0]; switch (name){ case StaticWallDef.NAME: createStaticWall(StaticWallDef.parseStringDef(objDef)); break; case PlayerDef.NAME: createPlayer(PlayerDef.parseStringDef(objDef)); break; case BalloonBotDef.NAME: createBalloonBot(BalloonBotDef.parseStringDef(objDef)); break; case GroundBotDef.NAME: createGroundBot(GroundBotDef.parseStringDef(objDef)); break; case TenonsDef.NAME: createTenons(TenonsDef.parseStringDef(objDef)); break; case TenonsSuspDef.NAME: createTenonsSusp(TenonsSuspDef.parseStringDef(objDef)); break; case TenonsBoxDef.NAME: createTenonsBox(TenonsBoxDef.parseStringDef(objDef)); break; case WoodBoxDef.NAME: createWoodBox(WoodBoxDef.parseStringDef(objDef)); break; case BrickBoxDef.NAME: createBrickBox(BrickBoxDef.parseStringDef(objDef)); break; case ArmoredBoxDef.NAME: createArmoredBox(ArmoredBoxDef.parseStringDef(objDef)); break; case AmmoBoxDef.NAME: createAmmoBox(AmmoBoxDef.parseStringDef(objDef)); break; case CoinDef.NAME: createCoin(CoinDef.parseStringDef(objDef)); break; case TenonsBalloonDef.NAME: createTenonsBalloon(TenonsBalloonDef.parseStringDef(objDef)); break; case TenonsPropDef.NAME: createTenonsProp(TenonsPropDef.parseStringDef(objDef)); break; case ExitDef.NAME: createExit(ExitDef.parseStringDef(objDef)); break; case MineBotDef.NAME: createMineBot(MineBotDef.parseStringDef(objDef)); break; }; i++; }; var waterDef:BaseObjectDef = new BaseObjectDef(320, 456); createWater(waterDef); if (balloonBots == 0){ exit.open(); }; } private function init():void{ var facade:ApplicationFacade = ApplicationFacade.getInstance(); appProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); } private function exitPlayerEnterHandler(e:CoreEvent):void{ levelComplete(); } public function gameStart(canvas:CoreCanvas, sndTransform:SoundTransform):void{ this.canvas = canvas; this.sndTransform = sndTransform; assets = CoreAssets.getInstance(); initBox2d(); initWalls(); Input.getInstance().init(canvas.objectsContainer.stage); levelStatus = ""; elapsedTime = 0; canvas.objectsContainer.addEventListener(Event.ENTER_FRAME, efHandler); } private function efHandler(e:Event):void{ dispatchEvent(new CoreEvent(CoreEvent.PRE_UPDATE)); m_world.Step(m_timeStep, m_iterations); dispatchEvent(new CoreEvent(CoreEvent.UPDATE, elapsedTime)); dispatchEvent(new CoreEvent(CoreEvent.POST_UPDATE)); elapsedTime++; } private function balloonUnitDeactivateHandler(e:CoreEvent):void{ var unit:BalloonUnit = (e.target as BalloonUnit); if ((unit is Player)){ levelFail(); } else { if ((unit is BalloonBot)){ balloonBots--; if (balloonBots == 0){ exit.open(); }; }; }; } private function createGroundBot(def:GroundBotDef):void{ var groundBot:GroundBot = new GroundBot(def); } private function createCoin(coinDef:CoinDef):void{ var coin:Coin = new Coin(coinDef); coin.addEventListener(Coin.COLLECT, coinCollectHandler); } private function coinCollectHandler(e:CoreEvent):void{ currentLevel.coinsCollected++; } private function createTenonsSusp(def:TenonsSuspDef):void{ var tenonsSusp:TenonsSusp = new TenonsSusp(def); } private function createBalloonBot(def:BalloonBotDef):void{ var bot:BalloonBot = new BalloonBot(def); bot.addEventListener(BalloonUnit.DEACTIVATE, balloonUnitDeactivateHandler); balloonBots++; } private function initWalls():void{ var wallB:b2Body; var wallSd:b2PolygonDef = new b2PolygonDef(); var wallBd:b2BodyDef = new b2BodyDef(); wallBd.position.Set((-40 / m_physScale), ((480 / m_physScale) / 2)); wallSd.SetAsBox((40 / m_physScale), ((480 / m_physScale) / 2)); wallB = m_world.CreateBody(wallBd); wallB.CreateShape(wallSd); wallB.SetMassFromShapes(); wallBd.position.Set(((640 + 40) / m_physScale), ((480 / m_physScale) / 2)); wallB = m_world.CreateBody(wallBd); wallB.CreateShape(wallSd); wallB.SetMassFromShapes(); } private function createExit(exitDef:ExitDef):void{ exit = new Exit(exitDef); exit.addEventListener(Exit.PLAYER_ENTER, exitPlayerEnterHandler); } private function createWoodBox(def:WoodBoxDef):void{ var woodBox:WoodBox = new WoodBox(def); } public function playSound(snd:Sound):void{ sndChannel = snd.play(0, 0, appProxy.sndTransform); } public function getBodyUnderPoint(point:Point):b2Body{ var baseObj:BaseObject; var skin:Sprite; var b:b2Body = m_world.m_bodyList; while (b) { baseObj = b.m_userData; if (baseObj){ skin = baseObj.getSkin(); if (((skin) && (skin.hitTestPoint(point.x, point.y, true)))){ return (b); }; }; b = b.m_next; }; return (null); } private function levelFail():void{ if (levelStatus == ""){ levelStatus = "failed"; dispatchEvent(new CoreEvent(LEVEL_FAIL)); }; } private function createTenons(def:TenonsDef):void{ var tenons:Tenons = new Tenons(def); } private function initBox2d():void{ var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-1000, -1000); worldAABB.upperBound.Set(1000, 1000); var gravity:b2Vec2 = new b2Vec2(0, 20); var doSleep:Boolean; m_world = new b2World(worldAABB, gravity, doSleep); var dbgDraw:b2DebugDraw = new b2DebugDraw(); var dbgDrawContainer:Sprite = canvas.debugContainer; dbgDrawContainer.mouseEnabled = false; dbgDrawContainer.mouseChildren = false; dbgDraw.m_sprite = dbgDrawContainer; dbgDraw.m_drawScale = m_physScale; dbgDraw.m_fillAlpha = 0.7; dbgDraw.m_lineThickness = 1; dbgDraw.m_drawFlags = ((b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit) | b2DebugDraw.e_pairBit); contactListener = new BContactListener(); m_world.SetContactListener(contactListener); } private function createTenonsProp(def:TenonsPropDef):void{ var tenonsProp:TenonsProp = new TenonsProp(def); } private function createTenonsBalloon(def:TenonsBalloonDef):void{ var tenonsBallon:TenonsBalloon = new TenonsBalloon(def); } private function levelComplete():void{ if (levelStatus == ""){ levelStatus = "completed"; if (!appProxy.unlimAmmo){ currentLevel.complete(elapsedTime); }; dispatchEvent(new CoreEvent(LEVEL_COMPLETE)); }; } private function createMineBot(def:MineBotDef):void{ var mineBot:MineBot = new MineBot(def); } private function createBrickBox(def:BrickBoxDef):void{ var brickBox:BrickBox = new BrickBox(def); } private function createArmoredBox(def:ArmoredBoxDef):void{ var armoredBox:ArmoredBox = new ArmoredBox(def); } private function createStaticWall(def:StaticWallDef):void{ var wall:StaticWall = new StaticWall(def); } public function pause():void{ Tweener.pauseAllTweens(); canvas.objectsContainer.removeEventListener(Event.ENTER_FRAME, efHandler); } private function createTenonsBox(def:TenonsBoxDef):void{ var tenonsBox:TenonsBox = new TenonsBox(def); } public function destroy():void{ dispatchEvent(new CoreEvent(CoreEvent.DESTROY)); clearCanvas(); canvas.objectsContainer.removeEventListener(Event.ENTER_FRAME, efHandler); } private function createPlayer(def:PlayerDef):void{ player = new Player(def); player.addEventListener(BalloonUnit.DEACTIVATE, balloonUnitDeactivateHandler); if (appProxy.unlimAmmo){ player.unlimAmmo = true; }; } public static function getInstance():CoreEngine{ if (instance == null){ instance = new (CoreEngine); }; return (instance); } } }//package core
Section 146
//Input (core.Input) package core { import flash.events.*; import flash.display.*; public class Input { private var ascii:Array; private var keyState:Array; public static var KEY_A:uint = 65; public static var KEY_LEFT:uint = 37; public static var KEY_DOWN:uint = 40; public static var KEY_D:uint = 68; public static var KEY_SPACE:uint = 32; public static var KEY_S:uint = 83; private static var instance:Input; public static var KEY_W:uint = 87; public static var KEY_UP:uint = 38; public static var KEY_RIGHT:uint = 39; public function Input():void{ super(); } public function init(stage:Stage):void{ stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); keyState = []; var i:uint; while (i < 222) { keyState[i] = 0; i++; }; } private function keyUpHandler(e:KeyboardEvent):void{ keyState[e.keyCode] = -1; } private function keyDownHandler(e:KeyboardEvent):void{ keyState[e.keyCode] = 1; } public function isKeyReleased(k:int):Boolean{ return ((keyState[k] == -1)); } public function isKeyPressed(k:int):Boolean{ return ((keyState[k] == 1)); } private function fillAscii():void{ ascii[65] = "A"; ascii[66] = "B"; ascii[67] = "C"; ascii[68] = "D"; ascii[69] = "E"; ascii[70] = "F"; ascii[71] = "G"; ascii[72] = "H"; ascii[73] = "I"; ascii[74] = "J"; ascii[75] = "K"; ascii[76] = "L"; ascii[77] = "M"; ascii[78] = "N"; ascii[79] = "O"; ascii[80] = "P"; ascii[81] = "Q"; ascii[82] = "R"; ascii[83] = "S"; ascii[84] = "T"; ascii[85] = "U"; ascii[86] = "V"; ascii[87] = "W"; ascii[88] = "X"; ascii[89] = "Y"; ascii[90] = "Z"; ascii[48] = "0"; ascii[49] = "1"; ascii[50] = "2"; ascii[51] = "3"; ascii[52] = "4"; ascii[53] = "5"; ascii[54] = "6"; ascii[55] = "7"; ascii[56] = "8"; ascii[57] = "9"; ascii[32] = "Spacebar"; ascii[17] = "Ctrl"; ascii[16] = "Shift"; ascii[192] = "~"; ascii[38] = "up"; ascii[40] = "down"; ascii[37] = "left"; ascii[39] = "right"; ascii[96] = "Numpad 0"; ascii[97] = "Numpad 1"; ascii[98] = "Numpad 2"; ascii[99] = "Numpad 3"; ascii[100] = "Numpad 4"; ascii[101] = "Numpad 5"; ascii[102] = "Numpad 6"; ascii[103] = "Numpad 7"; ascii[104] = "Numpad 8"; ascii[105] = "Numpad 9"; ascii[111] = "Numpad /"; ascii[106] = "Numpad *"; ascii[109] = "Numpad -"; ascii[107] = "Numpad +"; ascii[110] = "Numpad ."; ascii[45] = "Insert"; ascii[46] = "Delete"; ascii[33] = "Page Up"; ascii[34] = "Page Down"; ascii[35] = "End"; ascii[36] = "Home"; ascii[112] = "F1"; ascii[113] = "F2"; ascii[114] = "F3"; ascii[115] = "F4"; ascii[116] = "F5"; ascii[117] = "F6"; ascii[118] = "F7"; ascii[119] = "F8"; ascii[188] = ","; ascii[190] = "."; ascii[186] = ";"; ascii[222] = "'"; ascii[219] = "["; ascii[221] = "]"; ascii[189] = "-"; ascii[187] = "+"; ascii[220] = "\\"; ascii[191] = "/"; ascii[9] = "TAB"; ascii[8] = "Backspace"; } public static function getInstance():Input{ if (instance == null){ instance = new (Input); }; return (instance); } } }//package core
Section 147
//Level (core.Level) package core { import flash.display.*; import game.model.*; import core.objects.*; public class Level { public var isCompleted:Boolean; public var coinsTotal:uint; public var def:String; public var completeTime:int; public var coinsCollected:uint; public var timeBonus:uint; public var score:uint; public var id:uint; public var coinsBonus:uint; public var isAvailable:Boolean; public static const coinsMult:uint = 100; public static const timeMult:uint = 10; public static const timeMax:uint = 60; public static var ID:uint = 0; public function Level(def:String):void{ super(); id = ID++; this.def = def; init(); } public function complete(elapsedTime:uint):void{ coinsBonus = (coinsCollected * coinsMult); completeTime = (timeMax - Math.floor((elapsedTime / 40))); if (completeTime < 0){ completeTime = 0; }; timeBonus = (completeTime * timeMult); score = (coinsBonus + timeBonus); } private function init():void{ score = 0; isAvailable = false; isCompleted = false; } private static function getArmoredBoxDef(obj:Sprite):String{ var def = (ArmoredBoxDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(obj.width) + "_")); def = (def + Math.round(obj.height)); return (def); } public static function getLevelDefFromSprite(level:Sprite):String{ var objDef:String; var obj:Sprite; var assets:GameAssets = GameAssets.getInstance(); var objects:Sprite = level; var StaticWallClass:Class = assets.getAssetClass("StaticWallAsset"); var PlayerClass:Class = assets.getAssetClass("PlayerAsset"); var BalloonBotClass:Class = assets.getAssetClass("BalloonBotAsset"); var GroundBotClass:Class = assets.getAssetClass("GroundBotAsset"); var TenonsClass:Class = assets.getAssetClass("TenonsAsset"); var WoodBoxClass:Class = assets.getAssetClass("WoodBoxAsset"); var BrickBoxClass:Class = assets.getAssetClass("BrickBoxAsset"); var ArmoredBoxClass:Class = assets.getAssetClass("ArmoredBoxAsset"); var TenonsSuspClass:Class = assets.getAssetClass("TenonsSuspAsset"); var AmmoBoxClass:Class = assets.getAssetClass("AmmoBoxAsset"); var TenonsBoxClass:Class = assets.getAssetClass("TenonsBoxAsset"); var CoinClass:Class = assets.getAssetClass("CoinAsset"); var TenonsBalloonClass:Class = assets.getAssetClass("TenonsBalloonAsset"); var ExitClass:Class = assets.getAssetClass("ExitAsset"); var TenonsPropClass:Class = assets.getAssetClass("TenonsPropAsset"); var MineBotClass:Class = assets.getAssetClass("MineBotAsset"); var def:String = ""; var i:uint; for (;i < objects.numChildren;i++) { obj = (objects.getChildAt(i) as Sprite); if ((obj is StaticWallClass)){ objDef = getStaticWallDef(obj); } else { if ((obj is PlayerClass)){ objDef = getPlayerDef(obj); } else { if ((obj is BalloonBotClass)){ objDef = getBalloonBotDef(obj); } else { if ((obj is GroundBotClass)){ objDef = getGroundBotDef(obj); } else { if ((obj is TenonsClass)){ objDef = getTenonsDef(obj); } else { if ((obj is TenonsBalloonClass)){ objDef = getTenonsBalloonDef(obj); } else { if ((obj is WoodBoxClass)){ objDef = getWoodBoxDef(obj); } else { if ((obj is BrickBoxClass)){ objDef = getBrickBoxDef(obj); } else { if ((obj is ArmoredBoxClass)){ objDef = getArmoredBoxDef(obj); } else { if ((obj is TenonsSuspClass)){ objDef = getTenonsSuspDef(obj); } else { if ((obj is AmmoBoxClass)){ objDef = getAmmoBoxDef(obj); } else { if ((obj is TenonsBoxClass)){ objDef = getTenonsBoxDef(obj); } else { if ((obj is TenonsPropClass)){ objDef = getTenonsPropDef(obj); } else { if ((obj is CoinClass)){ objDef = getCoinDef(obj); } else { if ((obj is ExitClass)){ objDef = getExitDef(obj); } else { if ((obj is MineBotClass)){ objDef = getMineBotDef(obj); } else { continue; }; }; }; }; }; }; }; }; }; }; }; }; }; }; }; }; def = (def + (objDef + " ")); }; return (def); } private static function getTenonsBoxDef(obj:Sprite):String{ var def = (TenonsBoxDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(obj.width) + "_")); def = (def + Math.round(obj.height)); return (def); } private static function getExitDef(obj:Sprite):String{ var def = (ExitDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + Math.round(obj.y)); return (def); } private static function getBalloonBotDef(obj:Sprite):String{ var boat:Sprite = (obj.getChildByName("boat") as Sprite); var def = (BalloonBotDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(boat.width) + "_")); def = (def + Math.round(boat.height)); return (def); } private static function getTenonsDef(obj:Sprite):String{ var def = (TenonsDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(obj.width) + "_")); def = (def + Math.round(obj.height)); return (def); } private static function getTenonsSuspDef(obj:Sprite):String{ var tenonsSprite:Sprite = (obj.getChildByName("tenons") as Sprite); var anchorSprite:Sprite = (obj.getChildByName("anchor") as Sprite); var def = (TenonsSuspDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(tenonsSprite.width) + "_")); def = (def + (Math.round(tenonsSprite.height) + "_")); def = (def + (Math.round((obj.x + anchorSprite.x)) + "_")); def = (def + Math.round((obj.y + anchorSprite.y))); return (def); } private static function getGroundBotDef(obj:Sprite):String{ var def = (GroundBotDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + Math.round(obj.y)); return (def); } private static function getAmmoBoxDef(obj:Sprite):String{ var def = (AmmoBoxDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(obj.width) + "_")); def = (def + Math.round(obj.height)); return (def); } private static function getTenonsBalloonDef(obj:Sprite):String{ var tenonsSprite:Sprite = (obj.getChildByName("tenons") as Sprite); var def = (TenonsBalloonDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(tenonsSprite.width) + "_")); def = (def + Math.round(tenonsSprite.height)); return (def); } private static function getBrickBoxDef(obj:Sprite):String{ var def = (BrickBoxDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(obj.width) + "_")); def = (def + Math.round(obj.height)); return (def); } private static function getMineBotDef(obj:Sprite):String{ var def = (MineBotDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + Math.round(obj.y)); return (def); } private static function getPlayerDef(obj:Sprite):String{ var boat:Sprite = (obj.getChildByName("boat") as Sprite); var def = (PlayerDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (28 + "_")); def = (def + 64); return (def); } private static function getStaticWallDef(obj:Sprite):String{ var def = (StaticWallDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(obj.width) + "_")); def = (def + Math.round(obj.height)); return (def); } private static function getTenonsPropDef(obj:Sprite):String{ var prop:String; var minus:Boolean; var startIndex:uint; var def = (TenonsPropDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); var x2:Number = Math.round(obj.x); var y2:Number = Math.round(obj.y); var props:Array = obj.name.split("_"); var i:uint; while (i < props.length) { prop = props[i]; minus = false; startIndex = 1; switch (prop.charAt(0)){ case "h": if (prop.charAt(1) == "m"){ minus = true; startIndex = 2; }; x2 = Number(prop.substring(startIndex, prop.length)); if (minus){ x2 = -(x2); }; x2 = (x2 + Math.round(obj.x)); break; case "v": if (prop.charAt(1) == "m"){ minus = true; startIndex = 2; }; y2 = Number(prop.substring(startIndex, prop.length)); if (minus){ y2 = -(y2); }; y2 = (y2 + Math.round(obj.y)); break; }; i++; }; def = (def + (x2 + "_")); def = (def + (y2 + "_")); def = (def + (Math.round(40) + "_")); def = (def + Math.round(22)); return (def); } private static function getWoodBoxDef(obj:Sprite):String{ var def = (WoodBoxDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + (Math.round(obj.y) + "_")); def = (def + (Math.round(obj.width) + "_")); def = (def + Math.round(obj.height)); return (def); } private static function getCoinDef(obj:Sprite):String{ var def = (CoinDef.NAME + "_"); def = (def + (Math.round(obj.x) + "_")); def = (def + Math.round(obj.y)); return (def); } } }//package core
Section 148
//GameAbortCommand (game.controller.GameAbortCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import org.puremvc.as3.patterns.command.*; public class GameAbortCommand extends SimpleCommand implements ICommand { public function GameAbortCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.destroy(); facade.removeProxy(GameProxy.NAME); } } }//package game.controller
Section 149
//GameCompleteCommand (game.controller.GameCompleteCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import game.view.*; import org.puremvc.as3.patterns.command.*; public class GameCompleteCommand extends SimpleCommand implements ICommand { public function GameCompleteCommand(){ super(); } override public function execute(note:INotification):void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var gameCompleteView:GameCompleteView = new GameCompleteView(); appMed.getViewContainer().addChild(gameCompleteView); var gameCompleteMed:GameCompleteMediator = new GameCompleteMediator(gameCompleteView); facade.registerMediator(gameCompleteMed); var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appProxy.clearLevels(); } } }//package game.controller
Section 150
//GameStartCommand (game.controller.GameStartCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import org.puremvc.as3.patterns.command.*; public class GameStartCommand extends SimpleCommand implements ICommand { public function GameStartCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = new GameProxy(); facade.registerProxy(gameProxy); } } }//package game.controller
Section 151
//InitializeCommand (game.controller.InitializeCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.view.*; import org.puremvc.as3.patterns.command.*; public class InitializeCommand extends SimpleCommand implements ICommand { public function InitializeCommand(){ super(); } override public function execute(note:INotification):void{ var appView:AppView = new AppView(); ApplicationFacade.getInstance().viewContainer.addChild(appView); var appMed:AppMediator = new AppMediator(appView); facade.registerMediator(appMed); var mainMenuView:MainMenuView = new MainMenuView(); appMed.getViewContainer().addChild(mainMenuView); var mainMenuMed:MainMenuMediator = new MainMenuMediator(mainMenuView); facade.registerMediator(mainMenuMed); var levelSelectView:LevelSelectView = new LevelSelectView(); appMed.getViewContainer().addChild(levelSelectView); var levelSelectMed:LevelSelectMediator = new LevelSelectMediator(levelSelectView); facade.registerMediator(levelSelectMed); var logoView:LogoView = new LogoView(); appMed.getPopupContainer().addChild(logoView); } } }//package game.controller
Section 152
//LevelAbortCommand (game.controller.LevelAbortCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import game.view.*; import org.puremvc.as3.patterns.command.*; public class LevelAbortCommand extends SimpleCommand implements ICommand { public function LevelAbortCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.levelAbort(); var gameMed:GameMediator = (facade.retrieveMediator(GameMediator.NAME) as GameMediator); gameMed.destroy(); } } }//package game.controller
Section 153
//LevelCompleteCommand (game.controller.LevelCompleteCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import game.view.*; import org.puremvc.as3.patterns.command.*; public class LevelCompleteCommand extends SimpleCommand implements ICommand { public function LevelCompleteCommand(){ super(); } override public function execute(note:INotification):void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var levelCompleteView:LevelCompleteView = new LevelCompleteView(); appMed.getViewContainer().addChild(levelCompleteView); var levelCompleteMed:LevelCompleteMediator = new LevelCompleteMediator(levelCompleteView); facade.registerMediator(levelCompleteMed); var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appProxy.flushLevels(); } } }//package game.controller
Section 154
//LevelNextCommand (game.controller.LevelNextCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import game.view.*; import org.puremvc.as3.patterns.command.*; public class LevelNextCommand extends SimpleCommand implements ICommand { public function LevelNextCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.levelNext(); var gameMed:GameMediator = (facade.retrieveMediator(GameMediator.NAME) as GameMediator); gameMed.destroy(); } } }//package game.controller
Section 155
//LevelRestartCommand (game.controller.LevelRestartCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import game.view.*; import org.puremvc.as3.patterns.command.*; public class LevelRestartCommand extends SimpleCommand implements ICommand { public function LevelRestartCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.levelRestart(); var gameMed:GameMediator = (facade.retrieveMediator(GameMediator.NAME) as GameMediator); gameMed.destroy(); } } }//package game.controller
Section 156
//LevelStartCommand (game.controller.LevelStartCommand) package game.controller { import org.puremvc.as3.interfaces.*; import core.*; import game.view.components.*; import game.model.*; import game.view.*; import org.puremvc.as3.patterns.command.*; public class LevelStartCommand extends SimpleCommand implements ICommand { public function LevelStartCommand(){ super(); } override public function execute(note:INotification):void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var gameView:GameView = new GameView(); appMed.getViewContainer().addChild(gameView); var gameMed:GameMediator = new GameMediator(gameView); facade.registerMediator(gameMed); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.levelStart((note.getBody() as Level)); gameMed.levelStart(); } } }//package game.controller
Section 157
//StartupCommand (game.controller.StartupCommand) package game.controller { import org.puremvc.as3.interfaces.*; import flash.display.*; import game.model.*; import org.puremvc.as3.patterns.command.*; public class StartupCommand extends SimpleCommand implements ICommand { public function StartupCommand(){ super(); } override public function execute(note:INotification):void{ var container:Sprite = note.getBody().container; var appProxy:AppProxy = new AppProxy(); facade.registerProxy(appProxy); appProxy.startApp(); } } }//package game.controller
Section 158
//AppProxy (game.model.AppProxy) package game.model { import flash.events.*; import core.*; import flash.display.*; import core.objects.*; import flash.media.*; import game.view.*; import game.controller.*; import org.puremvc.as3.patterns.proxy.*; import flash.net.*; public class AppProxy extends Proxy { public var sndTransform:SoundTransform; public var unlimAmmo:Boolean; public var musicTransform:SoundTransform; public var playerName:String; public var musicEnabled:Boolean; private var shared:SharedObject; private var music:Sound; private var notesProxy:NotesProxy; public var levels:Array; public var soundEnabled:Boolean; public var graphicsQuality:uint; private var musicChannel:SoundChannel; public static const GAME_ABORT:String = "GameAbort"; public static const QUIT_GAME:String = "QuitGame"; public static const NAME:String = "AppProxy"; public static const GAME_COMPLETE:String = "GameComplete"; public static const INITIALIZE:String = "Initialize"; public static const GAME_START:String = "GameStart"; public static const INSTRUCTIONS_SHOW:String = "InstructionsShow"; public static const MUSIC_TOGGLE:String = "MusicToggle"; public static const INSTRUCTIONS_HIDE:String = "InstructionsHide"; public static const END_GAME:String = "EndGame"; public function AppProxy():void{ super(NAME); init(); } private function createLevels():void{ var LevelClass:Class; var levelSprite:Sprite; var level:Level; var saveLevel:Object; var levelAssets:Array = ["Level4", "Level12", "Level1", "Level13", "Level14", "Level15", "Level5", "Level21", "Level3", "Level2", "Level8", "Level9", "Level7", "Level10", "Level11", "Level16", "Level17", "Level18", "Level20", "Level19"]; var assets:GameAssets = GameAssets.getInstance(); var saveLevels:Array = shared.data.levels; if (saveLevels == null){ saveLevels = []; }; Level.ID = 0; levels = []; var i:uint; while (i < levelAssets.length) { LevelClass = assets.getAssetClass(levelAssets[i]); levelSprite = new (LevelClass); level = createLevel(levelSprite); saveLevel = saveLevels[i]; if (saveLevel != null){ level.coinsCollected = saveLevel.coinsCollected; level.completeTime = saveLevel.completeTime; level.coinsBonus = saveLevel.coinsBonus; level.timeBonus = saveLevel.timeBonus; level.score = saveLevel.score; level.isAvailable = saveLevel.isAvailable; level.isCompleted = saveLevel.isCompleted; }; levels.push(level); i++; }; levels[0].isAvailable = true; } private function init():void{ facade.registerCommand(INITIALIZE, InitializeCommand); facade.registerCommand(GAME_START, GameStartCommand); facade.registerCommand(GAME_ABORT, GameAbortCommand); facade.registerCommand(GAME_COMPLETE, GameCompleteCommand); notesProxy = new NotesProxy(); facade.registerProxy(notesProxy); playerName = "Player"; soundEnabled = true; musicEnabled = true; graphicsQuality = 2; unlimAmmo = false; sndTransform = new SoundTransform(); musicTransform = new SoundTransform(); shared = SharedObject.getLocal("GameData"); if (shared.data.soundEnabled != undefined){ soundEnabled = shared.data.soundEnabled; }; if (shared.data.musicEnabled != undefined){ musicEnabled = shared.data.musicEnabled; }; if (shared.data.graphicsQuality != undefined){ graphicsQuality = shared.data.graphicsQuality; }; } public function flushLevels():void{ var level:Level; var saveLevels:Array = []; var i:uint; while (i < levels.length) { level = levels[i]; saveLevels.push({id:level.id, coinsCollected:level.coinsCollected, completeTime:level.completeTime, coinsBonus:level.coinsBonus, timeBonus:level.timeBonus, score:level.score, isAvailable:level.isAvailable, isCompleted:level.isCompleted}); i++; }; shared.data.levels = saveLevels; shared.flush(); } private function assetsInitHandler(e:Event=null):void{ createLevels(); sndTransform.volume = (soundEnabled) ? 1 : 0; var SndMusicClass:Class = GameAssets.getInstance().getAssetClass("SndMusic"); music = new (SndMusicClass); musicTransform.volume = (musicEnabled) ? 0.5 : 0; musicChannel = music.play(0, 100000, musicTransform); notesProxy.push(INITIALIZE); setGraphicsQuality(graphicsQuality); } public function startApp():void{ var coreAssets:CoreAssets = CoreAssets.getInstance(); coreAssets.addEventListener(Event.INIT, coreAssetsInitHandler); coreAssets.init(); } public function clearLevels():void{ shared.data.levels = []; shared.flush(); } public function toggleSoundEnabled():void{ soundEnabled = !(soundEnabled); sndTransform.volume = (soundEnabled) ? 1 : 0; shared.data.soundEnabled = soundEnabled; shared.flush(); } private function createLevel(sprite:Sprite):Level{ var objDef:String; var props:Array; var name:String; var def:String = Level.getLevelDefFromSprite(sprite); var coinsTotal:uint; var objects:Array = def.split(" "); var i:uint; while (i < objects.length) { objDef = objects[i]; props = objDef.split("_"); name = props[0]; switch (name){ case CoinDef.NAME: coinsTotal++; break; }; i++; }; var level:Level = new Level(def); level.coinsTotal = coinsTotal; return (level); } public function setGraphicsQuality(value:uint):void{ var quality:String; graphicsQuality = value; var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); switch (value){ case 0: quality = StageQuality.LOW; break; case 1: quality = StageQuality.MEDIUM; break; case 2: quality = StageQuality.HIGH; break; }; appMed.getViewContainer().stage.quality = quality; shared.data.graphicsQuality = graphicsQuality; shared.flush(); } public function toggleMusicEnabled():void{ musicEnabled = !(musicEnabled); musicTransform.volume = (musicEnabled) ? 0.5 : 0; musicChannel.soundTransform = musicTransform; shared.data.musicEnabled = musicEnabled; shared.flush(); } private function coreAssetsInitHandler(e:Event):void{ var embedAssets:GameAssets = GameAssets.getInstance(); embedAssets.addEventListener(Event.INIT, assetsInitHandler); embedAssets.init(); } } }//package game.model
Section 159
//GameAssets (game.model.GameAssets) package game.model { import flash.events.*; import flash.display.*; import flash.system.*; public class GameAssets extends EventDispatcher { private var Assets:Class; private var appDomain:ApplicationDomain; private static var instance:GameAssets; public function GameAssets():void{ Assets = GameAssets_Assets; super(); } public function init():void{ var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, assetsInitHandler); loader.loadBytes(new Assets()); } private function assetsInitHandler(e:Event):void{ appDomain = e.target.content.loaderInfo.applicationDomain; dispatchEvent(new Event(Event.INIT)); } public function getAssetClass(name:String):Class{ if (!appDomain.hasDefinition(name)){ trace((("*Error*: There is no definition of class '" + name) + "'")); return (null); }; return ((appDomain.getDefinition(name) as Class)); } public static function getInstance():GameAssets{ if (!instance){ instance = new (GameAssets); }; return (instance); } } }//package game.model
Section 160
//GameAssets_Assets (game.model.GameAssets_Assets) package game.model { import mx.core.*; public class GameAssets_Assets extends ByteArrayAsset { } }//package game.model
Section 161
//GameProxy (game.model.GameProxy) package game.model { import core.*; import flash.display.*; import core.objects.*; import core.events.*; import core.objects.weapons.*; import caurina.transitions.*; import game.view.*; import game.controller.*; import org.puremvc.as3.patterns.proxy.*; public class GameProxy extends Proxy { private var engine:CoreEngine; private var currentLevel:Level; private var hints:Array; private var appProxy:AppProxy; private var notesProxy:NotesProxy; public static const PLAYER_WEAPON_SET:String = "PlayerWeaponSet"; public static const LEVEL_START:String = "LevelStart"; public static const UPDATE:String = "Update"; public static const NAME:String = "GameProxy"; public static const LEVEL_NEXT:String = "LevelNext"; public static const LEVEL_COMPLETE:String = "LevelComplete"; public static const LEVEL_ABORT:String = "LevelAbort"; public static const PLAYER_SHOT:String = "PlayerShot"; public static const LEVEL_FAIL:String = "LevelFail"; public static const LEVEL_RESTART:String = "LevelRestart"; public function GameProxy():void{ super(NAME); init(); } private function updateHandler(e:CoreEvent):void{ var time:int = (e.data as int); notesProxy.push(UPDATE, time); } private function playerWeaponSetHandler(e:CoreEvent):void{ var weapon:AbstractWeapon = (e.data as AbstractWeapon); notesProxy.push(PLAYER_WEAPON_SET, weapon); } public function getCurrentLevel():Level{ return (currentLevel); } public function getLevel(id:uint):Level{ return (appProxy.levels[id]); } private function playerShotHandler(e:CoreEvent):void{ notesProxy.push(PLAYER_SHOT); } private function init():void{ if (!facade.hasCommand(LEVEL_RESTART)){ facade.registerCommand(LEVEL_RESTART, LevelRestartCommand); }; if (!facade.hasCommand(LEVEL_START)){ facade.registerCommand(LEVEL_START, LevelStartCommand); }; if (!facade.hasCommand(LEVEL_ABORT)){ facade.registerCommand(LEVEL_ABORT, LevelAbortCommand); }; if (!facade.hasCommand(LEVEL_COMPLETE)){ facade.registerCommand(LEVEL_COMPLETE, LevelCompleteCommand); }; if (!facade.hasCommand(LEVEL_NEXT)){ facade.registerCommand(LEVEL_NEXT, LevelNextCommand); }; notesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); appProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); hints = ["HintLevel4", "HintLevel12", "HintLevel1", null, null, "HintLevel15"]; engine = CoreEngine.getInstance(); engine.addEventListener(CoreEvent.UPDATE, updateHandler); engine.addEventListener(CoreEngine.LEVEL_COMPLETE, levelCompleteHandler); engine.addEventListener(CoreEngine.LEVEL_FAIL, levelFailHandler); } public function levelAbort():void{ levelDestroy(); } public function levelNext():void{ levelDestroy(); var index:int = appProxy.levels.indexOf(currentLevel); notesProxy.push(LEVEL_START, appProxy.levels[(index + 1)]); } public function getScore():uint{ var level:Level; var score:uint; var i:uint; while (i < appProxy.levels.length) { level = appProxy.levels[i]; score = (score + level.score); i++; }; return (score); } private function levelDestroy():void{ Tweener.removeAllTweens(); engine.player.removeEventListener(CoreEngine.PLAYER_WEAPON_SET, playerWeaponSetHandler); engine.player.removeEventListener(Player.PLAYER_SHOT, playerShotHandler); engine.destroy(); } public function getPlayerWeapon():AbstractWeapon{ return (engine.player.getCurrentWeapon()); } public function getLevels():Array{ return (appProxy.levels); } private function levelFailHandler(e:CoreEvent):void{ notesProxy.push(LEVEL_FAIL); } public function levelRestart():void{ levelDestroy(); notesProxy.push(LEVEL_START, currentLevel); } public function startGame():void{ notesProxy.push(LEVEL_START); } public function destroy():void{ engine.removeEventListener(CoreEvent.UPDATE, updateHandler); engine.removeEventListener(CoreEngine.LEVEL_COMPLETE, levelCompleteHandler); engine.removeEventListener(CoreEngine.LEVEL_FAIL, levelFailHandler); } private function levelCompleteHandler(e:CoreEvent):void{ var nextLevel:Level; engine.pause(); currentLevel.isCompleted = true; var index:int = appProxy.levels.indexOf(currentLevel); if (index < (appProxy.levels.length - 1)){ nextLevel = appProxy.levels[(index + 1)]; nextLevel.isAvailable = true; notesProxy.push(LEVEL_COMPLETE); } else { notesProxy.push(AppProxy.GAME_COMPLETE); }; } public function levelStart(level:Level):void{ var HintClass:Class; var hint:Sprite; var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); var gameMed:GameMediator = (facade.retrieveMediator(GameMediator.NAME) as GameMediator); var appmed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var canvas:CoreCanvas = new CoreCanvas(gameMed.getLevelContainer(), gameMed.getObjectsContainer(), gameMed.getTopObjectsContainer(), gameMed.getBottomObjectsContainer(), appmed.getPopupContainer()); currentLevel = level; engine.gameStart(canvas, appProxy.sndTransform); engine.parseLevel(currentLevel); if (hints[level.id] != null){ HintClass = GameAssets.getInstance().getAssetClass(hints[level.id]); hint = new (HintClass); canvas.bottomObjectsContainer.addChild(hint); }; engine.player.addEventListener(CoreEngine.PLAYER_WEAPON_SET, playerWeaponSetHandler); engine.player.addEventListener(Player.PLAYER_SHOT, playerShotHandler); notesProxy.push(PLAYER_WEAPON_SET, engine.player.getCurrentWeapon()); } } }//package game.model
Section 162
//NotesProxy (game.model.NotesProxy) package game.model { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.proxy.*; public class NotesProxy extends Proxy implements IProxy { private var notes:Array; public static const NAME:String = "NotesProxy"; public function NotesProxy():void{ super(NAME); init(); } private function init():void{ notes = []; } private function sendNote():void{ var note:Object = notes[0]; if (note.name != GameProxy.UPDATE){ trace("note!", note.name); }; sendNotification(note.name, note.body); sendNoteComplete(); } public function push(name:String, body:Object=null):void{ var note:Object = {name:name, body:body}; notes.push(note); if (notes.length == 1){ sendNote(); }; } private function sendNoteComplete():void{ notes.splice(0, 1); if (notes.length > 0){ sendNote(); }; } } }//package game.model
Section 163
//AppView (game.view.components.AppView) package game.view.components { import flash.display.*; import game.model.*; public class AppView extends Sprite { public var container:Sprite; public var back:Sprite; public var logo:SimpleButton; private var window:Sprite; public var popupContainer:Sprite; public var water:Sprite; public function AppView(){ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("AppWindow"); window = new (windowClass); addChild(window); logo = (window.getChildByName("logo") as SimpleButton); container = (window.getChildByName("container") as Sprite); popupContainer = (window.getChildByName("popupContainer") as Sprite); back = (window.getChildByName("back") as Sprite); water = (back.getChildByName("water") as Sprite); } } }//package game.view.components
Section 164
//BalloonUnitBack (game.view.components.BalloonUnitBack) package game.view.components { import flash.events.*; import core.*; import flash.display.*; public class BalloonUnitBack extends Sprite { private var dx:Number; private var dy:Number; public function BalloonUnitBack():void{ super(); init(); } private function init():void{ var SkinClass:Class = CoreAssets.getInstance().getAssetClass("BalloonUnitBackAsset"); var skin:Sprite = new (SkinClass); addChild(skin); x = 320; y = 240; dx = (-0.2 + (Math.random() * 0.4)); dy = (-0.2 + (Math.random() * 0.4)); addEventListener(Event.ENTER_FRAME, updateHandler); } private function updateHandler(e:Event):void{ dx = (dx + (-0.02 + (Math.random() * 0.04))); dy = (dy + (-0.02 + (Math.random() * 0.04))); var limit:Number = 0.2; if (dx < -(limit)){ dx = -(limit); }; if (dx > limit){ dx = limit; }; if (dy < -(limit)){ dy = -(limit); }; if (dy > limit){ dy = limit; }; if (y > 420){ dy = -1; }; if (y < 20){ dy = 1; }; x = (x + dx); y = (y + dy); if (x < (0 - (width / 2))){ x = (640 + (width / 2)); }; if (x > (640 + (width / 2))){ x = (-(width) / 2); }; } } }//package game.view.components
Section 165
//ButtonFloater (game.view.components.ButtonFloater) package game.view.components { import flash.events.*; import flash.display.*; import flash.geom.*; public class ButtonFloater { private var time:Number; private var button:SimpleButton; private var startPos:Point; private var timeScaleX:Number; private var timeScaleY:Number; public function ButtonFloater(button:SimpleButton):void{ super(); this.button = button; init(); } public function stop():void{ button.x = startPos.x; button.y = startPos.y; button.removeEventListener(Event.ENTER_FRAME, efHandler); } private function efHandler(e:Event):void{ button.x = (startPos.x + (5 * Math.cos((time / timeScaleX)))); button.y = (startPos.y + (5 * Math.sin((time / timeScaleY)))); time = (time + 0.05); } private function init():void{ time = 0; startPos = new Point(button.x, button.y); timeScaleX = (0.5 + (Math.random() * 1.5)); timeScaleY = (0.5 + (Math.random() * 1.5)); button.addEventListener(Event.ENTER_FRAME, efHandler); } } }//package game.view.components
Section 166
//CreditsView (game.view.components.CreditsView) package game.view.components { import flash.events.*; import flash.display.*; import flash.net.*; public class CreditsView { private var fgl_bt:SimpleButton; private var egoshin_bt:SimpleButton; private var bubblebox_bt:SimpleButton; private var johnny_bt:SimpleButton; private var box2d_bt:SimpleButton; private var karataev_bt:SimpleButton; private var window:Sprite; private var soundsnap_bt:SimpleButton; private var close_bt:SimpleButton; public function CreditsView(window:Sprite):void{ super(); this.window = window; init(); } private function bubbleboxClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.bubblebox.com/clickreg.php?type=gamestats&id=1164&subid=credits"), "_blank"); } public function hide():void{ window.visible = false; } private function egoshinClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("mailto:muaddib999@rambler.ru"), "_blank"); } private function fglClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.flashgamelicense.com"), "_blank"); } private function init():void{ close_bt = (window.getChildByName("close_bt") as SimpleButton); bubblebox_bt = (window.getChildByName("bubblebox_bt") as SimpleButton); egoshin_bt = (window.getChildByName("egoshin_bt") as SimpleButton); karataev_bt = (window.getChildByName("karataev_bt") as SimpleButton); fgl_bt = (window.getChildByName("fgl_bt") as SimpleButton); box2d_bt = (window.getChildByName("box2d_bt") as SimpleButton); johnny_bt = (window.getChildByName("johnny_bt") as SimpleButton); soundsnap_bt = (window.getChildByName("soundsnap_bt") as SimpleButton); bubblebox_bt.addEventListener(MouseEvent.CLICK, bubbleboxClickHandler); close_bt.addEventListener(MouseEvent.CLICK, closeClickHandler); egoshin_bt.addEventListener(MouseEvent.CLICK, egoshinClickHandler); karataev_bt.addEventListener(MouseEvent.CLICK, karataevClickHandler); fgl_bt.addEventListener(MouseEvent.CLICK, fglClickHandler); box2d_bt.addEventListener(MouseEvent.CLICK, box2dClickHandler); johnny_bt.addEventListener(MouseEvent.CLICK, johnnyClickHandler); soundsnap_bt.addEventListener(MouseEvent.CLICK, soundsnapClickHandler); hide(); } private function johnnyClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("mailto:johnny@johnny-k.ru"), "_blank"); } private function soundsnapClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.soundsnap.com"), "_blank"); } private function karataevClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("mailto:eugene.karataev@gmail.com"), "_blank"); } private function closeClickHandler(e:MouseEvent):void{ hide(); } public function show():void{ window.visible = true; } private function box2dClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.box2d.org"), "_blank"); } } }//package game.view.components
Section 167
//Fish (game.view.components.Fish) package game.view.components { import flash.events.*; import core.*; import flash.display.*; public class Fish extends Sprite { private var delay:uint; private var time:uint; private var isActive:Boolean; private var dx:Number; private var dy:Number; private var startY:Number; private var skin:Sprite; public function Fish():void{ super(); init(); } private function updateHandler(e:Event):void{ if (isActive){ x = (x + dx); y = (startY + (dy * Math.sin((time / 10)))); if (x > 640){ isActive = false; }; } else { if (time >= delay){ time = 0; isActive = true; delay = (400 + Math.round((Math.random() * 1000))); x = -(width); startY = ((433 + 5) + (Math.random() * 32)); y = startY; dx = (1 + (Math.random() * 2)); dy = (Math.random() * 5); }; }; time++; } private function init():void{ var SkinClass:Class = CoreAssets.getInstance().getAssetClass("FishAsset"); skin = new (SkinClass); addChild(skin); delay = (400 + Math.round((Math.random() * 1000))); time = 0; isActive = false; x = -(width); addEventListener(Event.ENTER_FRAME, updateHandler); } } }//package game.view.components
Section 168
//FPSView (game.view.components.FPSView) package game.view.components { import flash.display.*; import flash.text.*; public class FPSView { public var window:Sprite; public var fps_tf:TextField; public function FPSView(window:Sprite):void{ super(); this.window = window; init(); } private function init():void{ fps_tf = (window.getChildByName("fps_tf") as TextField); } } }//package game.view.components
Section 169
//GameCompleteView (game.view.components.GameCompleteView) package game.view.components { import flash.display.*; import game.model.*; public class GameCompleteView extends Sprite { private var window:Sprite; public var bbscore; public var menu_bt:SimpleButton; public function GameCompleteView():void{ super(); init(); } private function init():void{ var WindowClass:Class = GameAssets.getInstance().getAssetClass("GameCompleteWindow"); window = new (WindowClass); addChild(window); menu_bt = (window.getChildByName("menu_bt") as SimpleButton); bbscore = window.getChildByName("bbscore"); } } }//package game.view.components
Section 170
//GameView (game.view.components.GameView) package game.view.components { import flash.display.*; import game.model.*; import flash.text.*; public class GameView extends Sprite { public var topObjectsContainer:Sprite; public var restart_bt:SimpleButton; public var objectsContainer:Sprite; public var sound:MovieClip; public var levelFail:Sprite; public var exit_bt:SimpleButton; public var level_tf:TextField; public var playerWeapon:Sprite; public var bottomObjectsContainer:Sprite; public var levelContainer:Sprite; public var music:MovieClip; public var fps:Sprite; public var sponsorLogo_bt:SimpleButton; public var menu:Sprite; private var window:Sprite; public var weapon_tf:TextField; public var score_tf:TextField; public function GameView():void{ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("GameWindow"); window = new (windowClass); addChild(window); levelContainer = (window.getChildByName("levelContainer") as Sprite); objectsContainer = (levelContainer.getChildByName("objectsContainer") as Sprite); topObjectsContainer = (levelContainer.getChildByName("topObjectsContainer") as Sprite); bottomObjectsContainer = (levelContainer.getChildByName("bottomObjectsContainer") as Sprite); fps = (window.getChildByName("fps") as Sprite); menu = (window.getChildByName("menu") as Sprite); playerWeapon = (menu.getChildByName("playerWeapon") as Sprite); weapon_tf = (playerWeapon.getChildByName("weapon_tf") as TextField); restart_bt = (menu.getChildByName("restart_bt") as SimpleButton); exit_bt = (menu.getChildByName("exit_bt") as SimpleButton); sponsorLogo_bt = (menu.getChildByName("sponsorLogo_bt") as SimpleButton); sound = (menu.getChildByName("sound") as MovieClip); music = (menu.getChildByName("music") as MovieClip); level_tf = (menu.getChildByName("level_tf") as TextField); score_tf = (menu.getChildByName("score_tf") as TextField); levelFail = (window.getChildByName("levelFail") as Sprite); sound.buttonMode = true; music.buttonMode = true; } } }//package game.view.components
Section 171
//LevelBox (game.view.components.LevelBox) package game.view.components { import flash.events.*; import core.*; import flash.display.*; import game.model.*; import game.view.*; import flash.text.*; public class LevelBox extends Sprite { public var level:Level; private var window:MovieClip; private var mediator:LevelSelectMediator; private var title_tf:TextField; public function LevelBox():void{ super(); init(); } private function clickHandler(e:MouseEvent):void{ mediator.selectBox(this); } public function update():void{ if (level.isAvailable){ window.alpha = 1; window.mouseEnabled = true; }; } public function initialize(mediator:LevelSelectMediator, level:Level):void{ this.mediator = mediator; this.level = level; var txt:String = (level.id + 1).toString(); if (txt.length == 1){ txt = ("0" + txt); }; title_tf.text = txt; if (!level.isAvailable){ window.alpha = 0.5; window.mouseEnabled = false; }; window.addEventListener(MouseEvent.CLICK, clickHandler); } public function select():void{ window.gotoAndStop(2); } public function deselect():void{ window.gotoAndStop(1); } private function init():void{ var WindowClass:Class = GameAssets.getInstance().getAssetClass("LevelSelectBox"); window = new (WindowClass); addChild(window); title_tf = (window.getChildByName("title_tf") as TextField); window.stop(); window.buttonMode = true; title_tf.mouseEnabled = false; } } }//package game.view.components
Section 172
//LevelCompleteView (game.view.components.LevelCompleteView) package game.view.components { import flash.display.*; import game.model.*; import flash.text.*; public class LevelCompleteView extends Sprite { public var nextLevel_bt:SimpleButton; public var time_tf:TextField; public var selectLevel_bt:SimpleButton; public var coins_tf:TextField; private var window:Sprite; public var score_tf:TextField; public function LevelCompleteView():void{ super(); init(); } private function init():void{ var WindowClass:Class = GameAssets.getInstance().getAssetClass("LevelCompleteWindow"); window = new (WindowClass); addChild(window); nextLevel_bt = (window.getChildByName("nextLevel_bt") as SimpleButton); selectLevel_bt = (window.getChildByName("selectLevel_bt") as SimpleButton); time_tf = (window.getChildByName("time_tf") as TextField); coins_tf = (window.getChildByName("coins_tf") as TextField); score_tf = (window.getChildByName("score_tf") as TextField); time_tf.autoSize = TextFieldAutoSize.LEFT; coins_tf.autoSize = TextFieldAutoSize.LEFT; score_tf.autoSize = TextFieldAutoSize.LEFT; } } }//package game.view.components
Section 173
//LevelPreview (game.view.components.LevelPreview) package game.view.components { import core.*; import flash.display.*; import core.objects.*; public class LevelPreview { private var window:Sprite; private var container:Sprite; public function LevelPreview(window:Sprite):void{ super(); this.window = window; init(); } private function createStaticWall(def:StaticWallDef):void{ var skin:Sprite = StaticWall.createAsset(def); skin.x = def.x; skin.y = def.y; container.addChild(skin); } private function init():void{ } private function createPlayer(def:BaseObjectDef):void{ var skin:Sprite = Player.createAsset(def); skin.x = def.x; skin.y = def.y; container.addChild(skin); } public function build(level:Level):void{ var objDef:String; var props:Array; var name:String; var levelDef:String = level.def; var objects:Array = levelDef.split(" "); if (container){ container.parent.removeChild(container); }; container = new Sprite(); container.scaleX = (container.scaleY = 0.4); window.addChild(container); var i:uint; while (i < objects.length) { objDef = objects[i]; props = objDef.split("_"); name = props[0]; switch (name){ case StaticWallDef.NAME: createStaticWall(StaticWallDef.parseStringDef(objDef)); break; case PlayerDef.NAME: createPlayer(PlayerDef.parseStringDef(objDef)); break; }; i++; }; } } }//package game.view.components
Section 174
//LevelSelectView (game.view.components.LevelSelectView) package game.view.components { import flash.display.*; import game.model.*; import flash.text.*; public class LevelSelectView extends Sprite { public var level2_bt:SimpleButton; public var boxesHolder:Sprite; public var preview:Sprite; public var unlimAmmo:MovieClip; public var levelDef_tf:TextField; public var start_bt:SimpleButton; public var boxesContainer:Sprite; public var levelButtons:Array; public var level3_bt:SimpleButton; public var levelScore_tf:TextField; public var level1_bt:SimpleButton; private var window:Sprite; public var menu_bt:SimpleButton; public function LevelSelectView():void{ super(); init(); } private function init():void{ var WindowClass:Class = GameAssets.getInstance().getAssetClass("LevelSelectWindow"); window = new (WindowClass); addChild(window); start_bt = (window.getChildByName("start_bt") as SimpleButton); menu_bt = (window.getChildByName("menu_bt") as SimpleButton); levelDef_tf = (window.getChildByName("levelDef_tf") as TextField); level1_bt = (window.getChildByName("level1_bt") as SimpleButton); level2_bt = (window.getChildByName("level2_bt") as SimpleButton); level3_bt = (window.getChildByName("level3_bt") as SimpleButton); unlimAmmo = (window.getChildByName("ammo") as MovieClip); levelButtons = [level1_bt, level2_bt, level3_bt]; boxesHolder = (window.getChildByName("boxesHolder") as Sprite); levelScore_tf = (window.getChildByName("levelScore_tf") as TextField); preview = (window.getChildByName("preview") as Sprite); unlimAmmo.buttonMode = true; } } }//package game.view.components
Section 175
//LogoView (game.view.components.LogoView) package game.view.components { import flash.events.*; import flash.display.*; import game.model.*; import caurina.transitions.*; import flash.net.*; public class LogoView extends Sprite { private var window:Sprite; public var inner:Sprite; public var splash:MovieClip; public function LogoView():void{ super(); init(); } private function splashEfHandler(e:Event):void{ if (splash.currentFrame == 137){ splash.stop(); splash.removeEventListener(Event.ENTER_FRAME, splashEfHandler); Tweener.addTween(splash, {alpha:0, time:0.5, transition:"linear"}); Tweener.addTween(inner, {alpha:1, time:0.7, delay:0.3, transition:"linear"}); Tweener.addTween(window, {alpha:0, time:0.7, transition:"linear", delay:2, onComplete:dissapearComplete}); }; } private function init():void{ var WindowClass:Class = GameAssets.getInstance().getAssetClass("IslandGamesWindow"); window = new (WindowClass); addChild(window); splash = (window.getChildByName("splash") as MovieClip); inner = (window.getChildByName("inner") as Sprite); splash.buttonMode = true; splash.addEventListener(Event.ENTER_FRAME, splashEfHandler); splash.addEventListener(MouseEvent.CLICK, splashClickHandler); inner.alpha = 0; } private function splashClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.bubblebox.com/clickreg.php?type=gamestats&id=1164&subid=splash"), "_blank"); } private function dissapearComplete():void{ splash.removeEventListener(MouseEvent.CLICK, splashClickHandler); window.parent.removeChild(window); } } }//package game.view.components
Section 176
//MainMenuView (game.view.components.MainMenuView) package game.view.components { import flash.display.*; import game.model.*; public class MainMenuView extends Sprite { public var credits:Sprite; public var moreGames_bt:SimpleButton; public var back:Sprite; public var sponsorLogo_bt:SimpleButton; public var options:Sprite; private var window:Sprite; public var options_bt:SimpleButton; public var title:Sprite; public var highscores_bt:SimpleButton; public var startGame_bt:SimpleButton; public var credits_bt:SimpleButton; public function MainMenuView():void{ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("MainMenuWindow"); window = new (windowClass); addChild(window); title = (window.getChildByName("title") as Sprite); back = (window.getChildByName("back") as Sprite); startGame_bt = (window.getChildByName("startGame_bt") as SimpleButton); options_bt = (window.getChildByName("options_bt") as SimpleButton); credits_bt = (window.getChildByName("credits_bt") as SimpleButton); highscores_bt = (window.getChildByName("highscores_bt") as SimpleButton); moreGames_bt = (window.getChildByName("moreGames_bt") as SimpleButton); sponsorLogo_bt = (window.getChildByName("sponsorLogo_bt") as SimpleButton); options = (window.getChildByName("options") as Sprite); credits = (window.getChildByName("credits") as Sprite); } } }//package game.view.components
Section 177
//MenuBalloon (game.view.components.MenuBalloon) package game.view.components { import flash.events.*; import flash.display.*; import game.model.*; public class MenuBalloon extends Sprite { private var skin:Sprite; private var speed:Number; private var frame:uint; public function MenuBalloon():void{ super(); init(); } private function init():void{ var SkinClass:Class = GameAssets.getInstance().getAssetClass("MenuBalloonAsset"); skin = new (SkinClass); addChild(skin); skin.x = Math.floor((Math.random() * 640)); skin.y = Math.floor((Math.random() * 200)); speed = (1 + (Math.random() * 1.5)); frame = 0; activate(); } public function activate():void{ skin.addEventListener(Event.ENTER_FRAME, updateHandler); } private function updateHandler(e:Event):void{ skin.x = (skin.x + speed); skin.y = (skin.y + (Math.cos((((frame * speed) / 180) * Math.PI)) * 0.5)); frame++; if (skin.x > (640 + (skin.width / 2))){ skin.x = (-(skin.width) / 2); skin.y = Math.floor((Math.random() * 200)); frame = 0; speed = (0.5 + (Math.random() * 2)); }; } public function deactivate():void{ skin.removeEventListener(Event.ENTER_FRAME, updateHandler); } } }//package game.view.components
Section 178
//OptionsView (game.view.components.OptionsView) package game.view.components { import flash.events.*; import flash.display.*; import game.model.*; public class OptionsView { private var qualityHigh:MovieClip; private var musicOff:MovieClip; private var appProxy:AppProxy; private var soundOn:MovieClip; private var qualityLow:MovieClip; private var musicOn:MovieClip; private var qualityMed:MovieClip; private var soundOff:MovieClip; private var facade:ApplicationFacade; private var window:Sprite; private var close_bt:SimpleButton; public function OptionsView(window:Sprite):void{ super(); this.window = window; init(); } private function qualityHighClickHandler(e:MouseEvent):void{ setQuality(2); } public function show():void{ window.visible = true; updateOptions(); } private function updateSound():void{ if (appProxy.soundEnabled){ soundOn.gotoAndStop(1); soundOff.gotoAndStop(2); } else { soundOn.gotoAndStop(2); soundOff.gotoAndStop(1); }; } public function hide():void{ window.visible = false; } private function musicOffClickHandler(e:MouseEvent):void{ if (appProxy.musicEnabled){ appProxy.toggleMusicEnabled(); updateMusic(); }; } private function qualityMedClickHandler(e:MouseEvent):void{ setQuality(1); } private function init():void{ facade = ApplicationFacade.getInstance(); appProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); close_bt = (window.getChildByName("close_bt") as SimpleButton); qualityLow = (window.getChildByName("qualityLow") as MovieClip); qualityMed = (window.getChildByName("qualityMed") as MovieClip); qualityHigh = (window.getChildByName("qualityHigh") as MovieClip); soundOn = (window.getChildByName("soundOn") as MovieClip); soundOff = (window.getChildByName("soundOff") as MovieClip); musicOn = (window.getChildByName("musicOn") as MovieClip); musicOff = (window.getChildByName("musicOff") as MovieClip); qualityLow.buttonMode = true; qualityMed.buttonMode = true; qualityHigh.buttonMode = true; soundOn.buttonMode = true; soundOff.buttonMode = true; musicOn.buttonMode = true; musicOff.buttonMode = true; close_bt.addEventListener(MouseEvent.CLICK, closeClickHandler); qualityLow.addEventListener(MouseEvent.CLICK, qualityLowClickHandler); qualityMed.addEventListener(MouseEvent.CLICK, qualityMedClickHandler); qualityHigh.addEventListener(MouseEvent.CLICK, qualityHighClickHandler); soundOn.addEventListener(MouseEvent.CLICK, soundOnClickHandler); soundOff.addEventListener(MouseEvent.CLICK, soundOffClickHandler); musicOn.addEventListener(MouseEvent.CLICK, musicOnClickHandler); musicOff.addEventListener(MouseEvent.CLICK, musicOffClickHandler); updateOptions(); hide(); } private function soundOnClickHandler(e:MouseEvent):void{ if (!appProxy.soundEnabled){ appProxy.toggleSoundEnabled(); updateSound(); }; } private function qualityLowClickHandler(e:MouseEvent):void{ setQuality(0); } private function soundOffClickHandler(e:MouseEvent):void{ if (appProxy.soundEnabled){ appProxy.toggleSoundEnabled(); updateSound(); }; } private function updateMusic():void{ if (appProxy.musicEnabled){ musicOn.gotoAndStop(1); musicOff.gotoAndStop(2); } else { musicOn.gotoAndStop(2); musicOff.gotoAndStop(1); }; } private function musicOnClickHandler(e:MouseEvent):void{ if (!appProxy.musicEnabled){ appProxy.toggleMusicEnabled(); updateMusic(); }; } private function updateOptions():void{ updateSound(); updateMusic(); updateQuality(); } private function updateQuality():void{ qualityLow.gotoAndStop(2); qualityMed.gotoAndStop(2); qualityHigh.gotoAndStop(2); if (appProxy.graphicsQuality == 0){ qualityLow.gotoAndStop(1); } else { if (appProxy.graphicsQuality == 1){ qualityMed.gotoAndStop(1); } else { if (appProxy.graphicsQuality == 2){ qualityHigh.gotoAndStop(1); }; }; }; } private function closeClickHandler(e:MouseEvent):void{ hide(); } private function setQuality(value:uint):void{ appProxy.setGraphicsQuality(value); updateQuality(); } } }//package game.view.components
Section 179
//AppMediator (game.view.AppMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import core.*; import flash.display.*; import game.view.components.*; import game.model.*; import flash.media.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; public class AppMediator extends Mediator implements IMediator { private var _view:AppView; private var music:Sound; private var sndChannel:SoundChannel; public static const NAME:String = "AppMediator"; public function AppMediator(viewComponent:AppView):void{ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([AppProxy.INSTRUCTIONS_SHOW, AppProxy.INSTRUCTIONS_HIDE, AppProxy.MUSIC_TOGGLE, GameProxy.LEVEL_START, GameProxy.LEVEL_ABORT]); } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case AppProxy.INSTRUCTIONS_SHOW: break; case AppProxy.INSTRUCTIONS_HIDE: break; case AppProxy.MUSIC_TOGGLE: musicToggle(); break; case GameProxy.LEVEL_START: levelStart(); break; case GameProxy.LEVEL_ABORT: levelAbort(); break; }; } public function startMusic():void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); sndChannel = music.play(0, 100000, appProxy.musicTransform); } public function getViewContainer():Sprite{ return (_view.container); } public function getPopupContainer():Sprite{ return (_view.popupContainer); } private function levelAbort():void{ _view.water.visible = true; } private function logoClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://rusfund.ru"), "_blank"); } private function init():void{ _view = (getViewComponent() as AppView); _view.tabChildren = false; var balloonUnit:BalloonUnitBack = new BalloonUnitBack(); _view.back.addChild(balloonUnit); var cloudsManager:CloudsManager = new CloudsManager(_view.back); var fish:Fish = new Fish(); _view.popupContainer.addChild(fish); } public function stopMusic():void{ sndChannel.stop(); } private function musicToggle():void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); sndChannel.soundTransform = appProxy.musicTransform; } private function levelStart():void{ _view.water.visible = false; } private function initSound():void{ var MusicClass:Class = GameAssets.getInstance().getAssetClass("SndMusic"); music = new (MusicClass); } } }//package game.view
Section 180
//FPSMediator (game.view.FPSMediator) package game.view { import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import org.puremvc.as3.patterns.mediator.*; import flash.utils.*; public class FPSMediator extends Mediator implements IMediator { private var _view:FPSView; private var frames:uint; private var prevTime:Number; public static const NAME:String = "FPSMediator"; public function FPSMediator(viewComponent:FPSView):void{ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([GameProxy.UPDATE]); } private function update():void{ var time:int = getTimer(); if ((time - 1000) >= prevTime){ _view.fps_tf.text = ("fps " + frames); frames = 0; prevTime = time; } else { frames++; }; } private function init():void{ _view = (getViewComponent() as FPSView); frames = 0; prevTime = getTimer(); } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case GameProxy.UPDATE: update(); break; }; } } }//package game.view
Section 181
//GameCompleteMediator (game.view.GameCompleteMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import caurina.transitions.*; import org.puremvc.as3.patterns.mediator.*; public class GameCompleteMediator extends Mediator implements IMediator { private var _view:GameCompleteView; public static const NAME:String = "GameCompleteMediator"; public function GameCompleteMediator(viewComponent:GameCompleteView):void{ super(NAME, viewComponent); init(); } private function init():void{ _view = (getViewComponent() as GameCompleteView); _view.menu_bt.addEventListener(MouseEvent.CLICK, menuClickHandler); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); _view.bbscore.setScore(gameProxy.getScore(), 1164); _view.bbscore.addEventListener(Event.ENTER_FRAME, scoreEfHandler); _view.alpha = 0; Tweener.addTween(_view, {alpha:1, time:0.4, transition:"linear"}); _view.menu_bt.visible = false; } private function menuClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_ABORT); destroy(); } private function scoreEfHandler(e:Event):void{ if (_view.bbscore.loadingStatus == "completed"){ _view.bbscore.removeEventListener(Event.ENTER_FRAME, scoreEfHandler); _view.menu_bt.visible = true; }; } private function destroy():void{ _view.parent.removeChild(_view); facade.removeMediator(NAME); } override public function handleNotification(note:INotification):void{ } override public function listNotificationInterests():Array{ return ([]); } } }//package game.view
Section 182
//GameMediator (game.view.GameMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import flash.display.*; import game.view.components.*; import game.model.*; import core.objects.weapons.*; import caurina.transitions.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; import flash.ui.*; public class GameMediator extends Mediator implements IMediator { private var _view:GameView; private var crosshair:Sprite; private var gameProxy:GameProxy; public static const NAME:String = "GameMediator"; public function GameMediator(viewComponent:GameView):void{ super(NAME, viewComponent); init(); } private function levelFail():void{ _view.levelFail.visible = true; _view.levelFail.alpha = 0; Tweener.addTween(_view.levelFail, {alpha:1, time:0.5, transition:"linear"}); crosshair.parent.removeChild(crosshair); Mouse.show(); } public function getObjectsContainer():Sprite{ return (_view.objectsContainer); } private function playerWeaponSet(weapon:AbstractWeapon):void{ if ((weapon is Cannon)){ _view.weapon_tf.text = "Пушко"; } else { if ((weapon is ShrapnelWeapon)){ _view.weapon_tf.text = "Шрапнель"; }; }; } private function updateSound():void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); if (appProxy.soundEnabled){ _view.sound.gotoAndStop(1); } else { _view.sound.gotoAndStop(2); }; } private function update(time:int):void{ crosshair.x = _view.stage.mouseX; crosshair.y = _view.stage.mouseY; } public function getTopObjectsContainer():Sprite{ return (_view.topObjectsContainer); } public function getBottomObjectsContainer():Sprite{ return (_view.bottomObjectsContainer); } private function init():void{ _view = (getViewComponent() as GameView); gameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var fpsView:FPSView = new FPSView(_view.fps); var fpsMed:FPSMediator = new FPSMediator(fpsView); facade.registerMediator(fpsMed); _view.playerWeapon.visible = false; _view.score_tf.text = ("score " + gameProxy.getScore()); _view.restart_bt.addEventListener(MouseEvent.CLICK, restartClickHandler); _view.exit_bt.addEventListener(MouseEvent.CLICK, exitClickHandler); _view.sound.addEventListener(MouseEvent.CLICK, soundClickHandler); _view.music.addEventListener(MouseEvent.CLICK, musicClickHandler); _view.sponsorLogo_bt.addEventListener(MouseEvent.CLICK, logoClickHandler); _view.levelFail.visible = false; var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var CrosshairClass:Class = GameAssets.getInstance().getAssetClass("CrosshairAsset"); crosshair = new (CrosshairClass); appMed.getPopupContainer().addChild(crosshair); crosshair.mouseEnabled = false; Mouse.hide(); _view.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); updateSound(); updateMusic(); _view.fps.visible = false; } private function soundClickHandler(e:MouseEvent):void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appProxy.toggleSoundEnabled(); updateSound(); } private function gameComplete():void{ _view.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); crosshair.parent.removeChild(crosshair); Mouse.show(); } public function getLevelContainer():Sprite{ return (_view.levelContainer); } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case GameProxy.UPDATE: update((note.getBody() as int)); break; case AppProxy.END_GAME: break; case GameProxy.PLAYER_WEAPON_SET: playerWeaponSet((note.getBody() as AbstractWeapon)); break; case GameProxy.LEVEL_COMPLETE: levelComplete(); break; case GameProxy.LEVEL_FAIL: levelFail(); break; case GameProxy.PLAYER_SHOT: playerShot(); break; case AppProxy.GAME_COMPLETE: gameComplete(); break; }; } private function restartClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_RESTART); } private function updateMusic():void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); if (appProxy.musicEnabled){ _view.music.gotoAndStop(1); } else { _view.music.gotoAndStop(2); }; } private function levelComplete():void{ _view.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); _view.score_tf.text = ("score " + gameProxy.getScore()); crosshair.parent.removeChild(crosshair); Mouse.show(); } private function exitClickHandler(e:MouseEvent):void{ _view.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_ABORT); } private function musicClickHandler(e:MouseEvent):void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appProxy.toggleMusicEnabled(); updateMusic(); } private function keyDownHandler(e:KeyboardEvent):void{ var notesProxy:NotesProxy; if (e.keyCode == Keyboard.ESCAPE){ notesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_ABORT); } else { if (e.keyCode == 82){ notesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_RESTART); }; }; } private function logoClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.bubblebox.com/clickreg.php?type=gamestats&id=1164&subid=ingame"), "_blank"); } override public function listNotificationInterests():Array{ return ([GameProxy.UPDATE, AppProxy.END_GAME, GameProxy.PLAYER_WEAPON_SET, GameProxy.LEVEL_COMPLETE, GameProxy.LEVEL_FAIL, GameProxy.PLAYER_SHOT, AppProxy.GAME_COMPLETE]); } public function destroy():void{ if (crosshair.parent){ crosshair.parent.removeChild(crosshair); }; Mouse.show(); _view.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); _view.parent.removeChild(_view); facade.removeMediator(NAME); } private function playerShot():void{ crosshair.scaleX = (crosshair.scaleY = 0.8); Tweener.addTween(crosshair, {scaleX:1, scaleY:1, time:0.5, transition:"linear"}); } public function levelStart():void{ var txt:String = (gameProxy.getCurrentLevel().id + 1).toString(); if (txt.length == 1){ txt = ("0" + txt); }; _view.level_tf.text = ("level " + txt); } } }//package game.view
Section 183
//LevelCompleteMediator (game.view.LevelCompleteMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import core.*; import game.view.components.*; import game.model.*; import caurina.transitions.*; import org.puremvc.as3.patterns.mediator.*; public class LevelCompleteMediator extends Mediator implements IMediator { private var selectLevelFloater:ButtonFloater; private var _view:LevelCompleteView; private var nextLevelFloater:ButtonFloater; public static const NAME:String = "LevelCompleteMediator"; public function LevelCompleteMediator(viewComponent:LevelCompleteView){ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([]); } private function destroy():void{ _view.parent.removeChild(_view); nextLevelFloater.stop(); selectLevelFloater.stop(); facade.removeMediator(NAME); } private function selectLevelClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_ABORT); destroy(); } override public function handleNotification(note:INotification):void{ } private function init():void{ _view = (getViewComponent() as LevelCompleteView); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var level:Level = gameProxy.getCurrentLevel(); var timeBonus:int = (60 - Math.floor((level.completeTime / 40))); if (timeBonus < 0){ timeBonus = 0; }; _view.time_tf.text = ((((level.completeTime + " * ") + Level.timeMult) + " = ") + level.timeBonus); _view.coins_tf.text = ((((level.coinsCollected + " * ") + Level.coinsMult) + " = ") + level.coinsBonus); _view.score_tf.text = Number((level.timeBonus + level.coinsBonus)).toString(); _view.nextLevel_bt.addEventListener(MouseEvent.CLICK, nextLevelClickHandler); _view.selectLevel_bt.addEventListener(MouseEvent.CLICK, selectLevelClickHandler); _view.alpha = 0; Tweener.addTween(_view, {alpha:1, time:0.4, transition:"linear"}); nextLevelFloater = new ButtonFloater(_view.nextLevel_bt); selectLevelFloater = new ButtonFloater(_view.selectLevel_bt); } private function nextLevelClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_NEXT); destroy(); } } }//package game.view
Section 184
//LevelSelectMediator (game.view.LevelSelectMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import core.*; import flash.display.*; import game.view.components.*; import game.model.*; import org.puremvc.as3.patterns.mediator.*; public class LevelSelectMediator extends Mediator implements IMediator { private var _view:LevelSelectView; private var startFloater:ButtonFloater; private var preview:LevelPreview; private var menuFloater:ButtonFloater; private var levels:Array; private var selectedBox:LevelBox; private var boxes:Array; public static const NAME:String = "LevelSelectMediator"; public function LevelSelectMediator(viewComponent:LevelSelectView):void{ super(NAME, viewComponent); init(); } private function levelAbort():void{ _view.visible = true; menuFloater = new ButtonFloater(_view.menu_bt); startFloater = new ButtonFloater(_view.start_bt); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); selectBox(boxes[gameProxy.getCurrentLevel().id]); } private function unlimAmmoClickHandler(e:MouseEvent):void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appProxy.unlimAmmo = !(appProxy.unlimAmmo); if (appProxy.unlimAmmo){ _view.unlimAmmo.gotoAndStop(1); } else { _view.unlimAmmo.gotoAndStop(2); }; } private function gameStart():void{ var i:uint; var level:Level; var levelBox:LevelBox; _view.visible = true; var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var levels:Array = gameProxy.getLevels(); if (_view.boxesContainer){ _view.boxesContainer.parent.removeChild(_view.boxesContainer); }; _view.boxesContainer = new Sprite(); _view.boxesHolder.addChild(_view.boxesContainer); var boxY:Number = 0; var boxX:Number = 0; boxes = []; i = 0; while (i < levels.length) { if ((((i > 0)) && (((i % 5) == 0)))){ boxY = (boxY + 50); boxX = 0; }; level = levels[i]; levelBox = new LevelBox(); levelBox.x = boxX; levelBox.y = boxY; _view.boxesContainer.addChild(levelBox); levelBox.initialize(this, level); if (i == 0){ selectBox(levelBox); }; boxX = (boxX + 50); boxes.push(levelBox); i++; }; menuFloater = new ButtonFloater(_view.menu_bt); startFloater = new ButtonFloater(_view.start_bt); } private function levelNext():void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); selectBox(boxes[gameProxy.getCurrentLevel().id]); } private function levelComplete():void{ var box:LevelBox; var i:uint; while (i < boxes.length) { box = boxes[i]; box.update(); i++; }; var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); selectBox(boxes[gameProxy.getCurrentLevel().id]); } private function init():void{ _view = (getViewComponent() as LevelSelectView); _view.start_bt.addEventListener(MouseEvent.CLICK, startClickHandler); _view.menu_bt.addEventListener(MouseEvent.CLICK, menuClickHandler); _view.visible = false; _view.levelDef_tf.visible = false; var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); if (appProxy.unlimAmmo){ _view.unlimAmmo.gotoAndStop(1); } else { _view.unlimAmmo.gotoAndStop(2); }; _view.unlimAmmo.addEventListener(MouseEvent.CLICK, unlimAmmoClickHandler); _view.preview.visible = false; } private function menuClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.GAME_ABORT); } private function startClickHandler(e:MouseEvent):void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_START, selectedBox.level); } private function gameAbort():void{ _view.visible = false; menuFloater.stop(); startFloater.stop(); } override public function listNotificationInterests():Array{ return ([AppProxy.GAME_START, GameProxy.LEVEL_START, GameProxy.LEVEL_ABORT, GameProxy.LEVEL_COMPLETE, AppProxy.GAME_ABORT]); } public function selectBox(box:LevelBox):void{ if (selectedBox){ selectedBox.deselect(); }; selectedBox = box; selectedBox.select(); _view.levelDef_tf.text = box.level.def; _view.levelScore_tf.text = box.level.score.toString(); } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case AppProxy.GAME_START: gameStart(); break; case GameProxy.LEVEL_START: levelStart(); break; case GameProxy.LEVEL_ABORT: levelAbort(); break; case GameProxy.LEVEL_COMPLETE: levelComplete(); break; case AppProxy.GAME_ABORT: gameAbort(); break; }; } private function levelStart():void{ _view.visible = false; menuFloater.stop(); startFloater.stop(); } } }//package game.view
Section 185
//MainMenuMediator (game.view.MainMenuMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; public class MainMenuMediator extends Mediator implements IMediator { private var balloons:Array; private var _view:MainMenuView; private var credits:CreditsView; private var options:OptionsView; public static const NAME:String = "MainMenuMediator"; public function MainMenuMediator(viewComponent:MainMenuView):void{ super(NAME, viewComponent); init(); } private function optionsClickHandler(e:MouseEvent):void{ credits.hide(); options.show(); } private function destroy():void{ _view.parent.removeChild(_view); facade.removeMediator(NAME); } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case AppProxy.GAME_START: gameStart(); break; case AppProxy.GAME_ABORT: gameAbort(); break; }; } private function creditsClickHandler(e:MouseEvent):void{ options.hide(); credits.show(); } private function highscoresClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.bubblebox.com/clickreg.php?type=gamestats&id=1164&subid=scores&action=viewscores"), "_blank"); } override public function listNotificationInterests():Array{ return ([AppProxy.GAME_START, AppProxy.GAME_ABORT]); } private function sponsorClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.bubblebox.com/clickreg.php?type=gamestats&id=1164&subid=mainmenu"), "_blank"); } private function gameAbort():void{ var balloon:MenuBalloon; _view.visible = true; var i:uint; while (i < balloons.length) { balloon = balloons[i]; balloon.activate(); i++; }; } private function moreGamesClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.bubblebox.com/clickreg.php?type=gamestats&id=1164&subid=moregames"), "_blank"); } private function init():void{ var balloon:MenuBalloon; _view = (getViewComponent() as MainMenuView); balloons = []; var i:uint; while (i < 3) { balloon = new MenuBalloon(); _view.back.addChild(balloon); balloons.push(balloon); i++; }; options = new OptionsView(_view.options); credits = new CreditsView(_view.credits); _view.startGame_bt.addEventListener(MouseEvent.CLICK, startGameClickHandler); _view.options_bt.addEventListener(MouseEvent.CLICK, optionsClickHandler); _view.credits_bt.addEventListener(MouseEvent.CLICK, creditsClickHandler); _view.highscores_bt.addEventListener(MouseEvent.CLICK, highscoresClickHandler); _view.moreGames_bt.addEventListener(MouseEvent.CLICK, moreGamesClickHandler); _view.sponsorLogo_bt.addEventListener(MouseEvent.CLICK, sponsorClickHandler); } private function startGameClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.GAME_START); } private function gameStart():void{ var balloon:MenuBalloon; _view.visible = false; var i:uint; while (i < balloons.length) { balloon = balloons[i]; balloon.deactivate(); i++; }; options.hide(); credits.hide(); } } }//package game.view
Section 186
//ByteArrayAsset (mx.core.ByteArrayAsset) package mx.core { import flash.utils.*; public class ByteArrayAsset extends ByteArray implements IFlexAsset { mx_internal static const VERSION:String = "3.0.0.0"; public function ByteArrayAsset(){ super(); } } }//package mx.core
Section 187
//EdgeMetrics (mx.core.EdgeMetrics) package mx.core { public class EdgeMetrics { public var top:Number; public var left:Number; public var bottom:Number; public var right:Number; mx_internal static const VERSION:String = "3.0.0.0"; public static const EMPTY:EdgeMetrics = new EdgeMetrics(0, 0, 0, 0); ; public function EdgeMetrics(left:Number=0, top:Number=0, right:Number=0, bottom:Number=0){ super(); this.left = left; this.top = top; this.right = right; this.bottom = bottom; } public function clone():EdgeMetrics{ return (new EdgeMetrics(left, top, right, bottom)); } } }//package mx.core
Section 188
//FlexSprite (mx.core.FlexSprite) package mx.core { import flash.display.*; import mx.utils.*; public class FlexSprite extends Sprite { mx_internal static const VERSION:String = "3.0.0.0"; public function FlexSprite(){ super(); name = NameUtil.createUniqueName(this); //unresolved jump var _slot1 = e; } override public function toString():String{ return (NameUtil.displayObjectToString(this)); } } }//package mx.core
Section 189
//IBorder (mx.core.IBorder) package mx.core { public interface IBorder { function get borderMetrics():EdgeMetrics; } }//package mx.core
Section 190
//IFlexAsset (mx.core.IFlexAsset) package mx.core { public interface IFlexAsset { } }//package mx.core
Section 191
//IFlexDisplayObject (mx.core.IFlexDisplayObject) package mx.core { import flash.events.*; import flash.display.*; import flash.geom.*; import flash.accessibility.*; public interface IFlexDisplayObject extends IBitmapDrawable, IEventDispatcher { function get visible():Boolean; function get rotation():Number; function localToGlobal(void:Point):Point; function get name():String; function set width(flash.display:Number):void; function get measuredHeight():Number; function get blendMode():String; function get scale9Grid():Rectangle; function set name(flash.display:String):void; function set scaleX(flash.display:Number):void; function set scaleY(flash.display:Number):void; function get measuredWidth():Number; function get accessibilityProperties():AccessibilityProperties; function set scrollRect(flash.display:Rectangle):void; function get cacheAsBitmap():Boolean; function globalToLocal(void:Point):Point; function get height():Number; function set blendMode(flash.display:String):void; function get parent():DisplayObjectContainer; function getBounds(String:DisplayObject):Rectangle; function get opaqueBackground():Object; function set scale9Grid(flash.display:Rectangle):void; function setActualSize(_arg1:Number, _arg2:Number):void; function set alpha(flash.display:Number):void; function set accessibilityProperties(flash.display:AccessibilityProperties):void; function get width():Number; function hitTestPoint(_arg1:Number, _arg2:Number, _arg3:Boolean=false):Boolean; function set cacheAsBitmap(flash.display:Boolean):void; function get scaleX():Number; function get scaleY():Number; function get scrollRect():Rectangle; function get mouseX():Number; function get mouseY():Number; function set height(flash.display:Number):void; function set mask(flash.display:DisplayObject):void; function getRect(String:DisplayObject):Rectangle; function get alpha():Number; function set transform(flash.display:Transform):void; function move(_arg1:Number, _arg2:Number):void; function get loaderInfo():LoaderInfo; function get root():DisplayObject; function hitTestObject(mx.core:IFlexDisplayObject/mx.core:IFlexDisplayObject:stage/get:DisplayObject):Boolean; function set opaqueBackground(flash.display:Object):void; function set visible(flash.display:Boolean):void; function get mask():DisplayObject; function set x(flash.display:Number):void; function set y(flash.display:Number):void; function get transform():Transform; function set filters(flash.display:Array):void; function get x():Number; function get y():Number; function get filters():Array; function set rotation(flash.display:Number):void; function get stage():Stage; } }//package mx.core
Section 192
//IRepeaterClient (mx.core.IRepeaterClient) package mx.core { public interface IRepeaterClient { function get instanceIndices():Array; function set instanceIndices(E:\dev\3.0.x\frameworks\projects\framework\src;mx\core;IRepeaterClient.as:Array):void; function get isDocument():Boolean; function set repeaters(E:\dev\3.0.x\frameworks\projects\framework\src;mx\core;IRepeaterClient.as:Array):void; function initializeRepeaterArrays(E:\dev\3.0.x\frameworks\projects\framework\src;mx\core;IRepeaterClient.as:IRepeaterClient):void; function get repeaters():Array; function set repeaterIndices(E:\dev\3.0.x\frameworks\projects\framework\src;mx\core;IRepeaterClient.as:Array):void; function get repeaterIndices():Array; } }//package mx.core
Section 193
//mx_internal (mx.core.mx_internal) package mx.core { public namespace mx_internal = "http://www.adobe.com/2006/flex/mx/internal"; }//package mx.core
Section 194
//SpriteAsset (mx.core.SpriteAsset) package mx.core { public class SpriteAsset extends FlexSprite implements IFlexAsset, IFlexDisplayObject, IBorder { private var _measuredHeight:Number; private var _measuredWidth:Number; mx_internal static const VERSION:String = "3.0.0.0"; public function SpriteAsset(){ super(); _measuredWidth = width; _measuredHeight = height; } public function get measuredWidth():Number{ return (_measuredWidth); } public function get measuredHeight():Number{ return (_measuredHeight); } public function setActualSize(newWidth:Number, newHeight:Number):void{ width = newWidth; height = newHeight; } public function move(x:Number, y:Number):void{ this.x = x; this.y = y; } public function get borderMetrics():EdgeMetrics{ if (scale9Grid == null){ return (EdgeMetrics.EMPTY); }; return (new EdgeMetrics(scale9Grid.left, scale9Grid.top, Math.ceil((measuredWidth - scale9Grid.right)), Math.ceil((measuredHeight - scale9Grid.bottom)))); } } }//package mx.core
Section 195
//NameUtil (mx.utils.NameUtil) package mx.utils { import flash.display.*; import mx.core.*; import flash.utils.*; public class NameUtil { mx_internal static const VERSION:String = "3.0.0.0"; private static var counter:int = 0; public function NameUtil(){ super(); } public static function displayObjectToString(displayObject:DisplayObject):String{ var result:String; var s:String; var indices:Array; var o:DisplayObject = displayObject; while (o != null) { if (((((o.parent) && (o.stage))) && ((o.parent == o.stage)))){ break; }; s = o.name; if ((o is IRepeaterClient)){ indices = IRepeaterClient(o).instanceIndices; if (indices){ s = (s + (("[" + indices.join("][")) + "]")); }; }; result = ((result == null)) ? s : ((s + ".") + result); o = o.parent; }; return (result); } public static function createUniqueName(object:Object):String{ if (!object){ return (null); }; var name:String = getQualifiedClassName(object); var index:int = name.indexOf("::"); if (index != -1){ name = name.substr((index + 2)); }; var charCode:int = name.charCodeAt((name.length - 1)); if ((((charCode >= 48)) && ((charCode <= 57)))){ name = (name + "_"); }; return ((name + counter++)); } } }//package mx.utils
Section 196
//Controller (org.puremvc.as3.core.controller.Controller) package org.puremvc.as3.core.controller { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.core.view.*; import org.puremvc.as3.patterns.observer.*; public class Controller implements IController { protected const SINGLETON_MSG:String = "Controller Singleton already constructed!"; protected var commandMap:Array; protected var view:IView; protected static var instance:IController; public function Controller(){ super(); if (instance != null){ throw (Error(SINGLETON_MSG)); }; instance = this; commandMap = new Array(); initializeController(); } public function removeCommand(notificationName:String):void{ commandMap[notificationName] = null; } public function registerCommand(notificationName:String, commandClassRef:Class):void{ if (commandMap[notificationName] == null){ view.registerObserver(notificationName, new Observer(executeCommand, this)); }; commandMap[notificationName] = commandClassRef; } protected function initializeController():void{ view = View.getInstance(); } public function hasCommand(notificationName:String):Boolean{ return (!((commandMap[notificationName] == null))); } public function executeCommand(note:INotification):void{ var commandClassRef:Class = commandMap[note.getName()]; if (commandClassRef == null){ return; }; var commandInstance:ICommand = new (commandClassRef); commandInstance.execute(note); } public static function getInstance():IController{ if (instance == null){ instance = new (Controller); }; return (instance); } } }//package org.puremvc.as3.core.controller
Section 197
//Model (org.puremvc.as3.core.model.Model) package org.puremvc.as3.core.model { import org.puremvc.as3.interfaces.*; public class Model implements IModel { protected const SINGLETON_MSG:String = "Model Singleton already constructed!"; protected var proxyMap:Array; protected static var instance:IModel; public function Model(){ super(); if (instance != null){ throw (Error(SINGLETON_MSG)); }; instance = this; proxyMap = new Array(); initializeModel(); } protected function initializeModel():void{ } public function removeProxy(proxyName:String):IProxy{ var proxy:IProxy = (proxyMap[proxyName] as IProxy); proxyMap[proxyName] = null; return (proxy); } public function hasProxy(proxyName:String):Boolean{ return (!((proxyMap[proxyName] == null))); } public function retrieveProxy(proxyName:String):IProxy{ return (proxyMap[proxyName]); } public function registerProxy(proxy:IProxy):void{ proxyMap[proxy.getProxyName()] = proxy; } public static function getInstance():IModel{ if (instance == null){ instance = new (Model); }; return (instance); } } }//package org.puremvc.as3.core.model
Section 198
//View (org.puremvc.as3.core.view.View) package org.puremvc.as3.core.view { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; public class View implements IView { protected const SINGLETON_MSG:String = "View Singleton already constructed!"; protected var observerMap:Array; protected var mediatorMap:Array; protected static var instance:IView; public function View(){ super(); if (instance != null){ throw (Error(SINGLETON_MSG)); }; instance = this; mediatorMap = new Array(); observerMap = new Array(); initializeView(); } public function retrieveMediator(mediatorName:String):IMediator{ return (mediatorMap[mediatorName]); } public function hasMediator(mediatorName:String):Boolean{ return (!((mediatorMap[mediatorName] == null))); } public function notifyObservers(notification:INotification):void{ var observers:Array; var i:Number; var observer:IObserver; if (observerMap[notification.getName()] != null){ observers = (observerMap[notification.getName()] as Array); i = 0; while (i < observers.length) { observer = (observers[i] as IObserver); observer.notifyObserver(notification); i++; }; }; } protected function initializeView():void{ } public function registerMediator(mediator:IMediator):void{ var observer:Observer; var i:Number; mediatorMap[mediator.getMediatorName()] = mediator; var interests:Array = mediator.listNotificationInterests(); if (interests.length > 0){ observer = new Observer(mediator.handleNotification, mediator); i = 0; while (i < interests.length) { registerObserver(interests[i], observer); i++; }; }; mediator.onRegister(); } public function removeMediator(mediatorName:String):IMediator{ var notificationName:String; var mediator:IMediator; var observers:Array; var removalTargets:Array; var i:int; var target:int; for (notificationName in observerMap) { observers = observerMap[notificationName]; removalTargets = new Array(); i = 0; while (i < observers.length) { if (Observer(observers[i]).compareNotifyContext(retrieveMediator(mediatorName)) == true){ removalTargets.push(i); }; i++; }; while (removalTargets.length > 0) { target = removalTargets.pop(); observers.splice(target, 1); }; if (observers.length == 0){ delete observerMap[notificationName]; }; }; mediator = (mediatorMap[mediatorName] as IMediator); delete mediatorMap[mediatorName]; if (mediator){ mediator.onRemove(); }; return (mediator); } public function registerObserver(notificationName:String, observer:IObserver):void{ if (observerMap[notificationName] != null){ observerMap[notificationName].push(observer); } else { observerMap[notificationName] = [observer]; }; } public static function getInstance():IView{ if (instance == null){ instance = new (View); }; return (instance); } } }//package org.puremvc.as3.core.view
Section 199
//ICommand (org.puremvc.as3.interfaces.ICommand) package org.puremvc.as3.interfaces { public interface ICommand { function execute(:INotification):void; } }//package org.puremvc.as3.interfaces
Section 200
//IController (org.puremvc.as3.interfaces.IController) package org.puremvc.as3.interfaces { public interface IController { function registerCommand(_arg1:String, _arg2:Class):void; function hasCommand(org.puremvc.as3.interfaces:IController/org.puremvc.as3.interfaces:IController:registerCommand:String):Boolean; function executeCommand(:INotification):void; function removeCommand(:String):void; } }//package org.puremvc.as3.interfaces
Section 201
//IFacade (org.puremvc.as3.interfaces.IFacade) package org.puremvc.as3.interfaces { public interface IFacade extends INotifier { function removeCommand(:String):void; function registerCommand(_arg1:String, _arg2:Class):void; function removeProxy(F:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IFacade.as:String):IProxy; function registerProxy(:IProxy):void; function hasMediator(org.puremvc.as3.interfaces:IFacade/org.puremvc.as3.interfaces:IFacade:registerProxy:String):Boolean; function retrieveMediator(org.puremvc.as3.interfaces:String):IMediator; function hasCommand(org.puremvc.as3.interfaces:IFacade/org.puremvc.as3.interfaces:IFacade:registerProxy:String):Boolean; function retrieveProxy(F:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IFacade.as:String):IProxy; function hasProxy(org.puremvc.as3.interfaces:IFacade/org.puremvc.as3.interfaces:IFacade:registerProxy:String):Boolean; function registerMediator(:IMediator):void; function removeMediator(org.puremvc.as3.interfaces:String):IMediator; } }//package org.puremvc.as3.interfaces
Section 202
//IMediator (org.puremvc.as3.interfaces.IMediator) package org.puremvc.as3.interfaces { public interface IMediator { function listNotificationInterests():Array; function onRegister():void; function handleNotification(org.puremvc.as3.interfaces:IMediator/org.puremvc.as3.interfaces:IMediator:getMediatorName:INotification):void; function getMediatorName():String; function setViewComponent(org.puremvc.as3.interfaces:IMediator/org.puremvc.as3.interfaces:IMediator:getMediatorName:Object):void; function getViewComponent():Object; function onRemove():void; } }//package org.puremvc.as3.interfaces
Section 203
//IModel (org.puremvc.as3.interfaces.IModel) package org.puremvc.as3.interfaces { public interface IModel { function removeProxy(F:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IModel.as:String):IProxy; function retrieveProxy(F:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IModel.as:String):IProxy; function registerProxy(:IProxy):void; function hasProxy(org.puremvc.as3.interfaces:IModel/org.puremvc.as3.interfaces:IModel:registerProxy:String):Boolean; } }//package org.puremvc.as3.interfaces
Section 204
//INotification (org.puremvc.as3.interfaces.INotification) package org.puremvc.as3.interfaces { public interface INotification { function getType():String; function getName():String; function toString():String; function setBody(F:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;INotification.as:Object):void; function getBody():Object; function setType(F:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;INotification.as:String):void; } }//package org.puremvc.as3.interfaces
Section 205
//INotifier (org.puremvc.as3.interfaces.INotifier) package org.puremvc.as3.interfaces { public interface INotifier { function sendNotification(_arg1:String, _arg2:Object=null, _arg3:String=null):void; } }//package org.puremvc.as3.interfaces
Section 206
//IObserver (org.puremvc.as3.interfaces.IObserver) package org.puremvc.as3.interfaces { public interface IObserver { function compareNotifyContext(void:Object):Boolean; function setNotifyContext(:Object):void; function setNotifyMethod(:Function):void; function notifyObserver(:INotification):void; } }//package org.puremvc.as3.interfaces
Section 207
//IProxy (org.puremvc.as3.interfaces.IProxy) package org.puremvc.as3.interfaces { public interface IProxy { function getData():Object; function getProxyName():String; function setData(F:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IProxy.as:Object):void; } }//package org.puremvc.as3.interfaces
Section 208
//IView (org.puremvc.as3.interfaces.IView) package org.puremvc.as3.interfaces { public interface IView { function notifyObservers(:INotification):void; function registerMediator(:IMediator):void; function removeMediator(org.puremvc.as3.interfaces:IView/org.puremvc.as3.interfaces:IView:registerObserver:String):IMediator; function registerObserver(_arg1:String, _arg2:IObserver):void; function hasMediator(void:String):Boolean; function retrieveMediator(org.puremvc.as3.interfaces:IView/org.puremvc.as3.interfaces:IView:registerObserver:String):IMediator; } }//package org.puremvc.as3.interfaces
Section 209
//SimpleCommand (org.puremvc.as3.patterns.command.SimpleCommand) package org.puremvc.as3.patterns.command { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; public class SimpleCommand extends Notifier implements ICommand, INotifier { public function SimpleCommand(){ super(); } public function execute(notification:INotification):void{ } } }//package org.puremvc.as3.patterns.command
Section 210
//Facade (org.puremvc.as3.patterns.facade.Facade) package org.puremvc.as3.patterns.facade { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.core.view.*; import org.puremvc.as3.core.controller.*; import org.puremvc.as3.core.model.*; import org.puremvc.as3.patterns.observer.*; public class Facade implements IFacade { protected const SINGLETON_MSG:String = "Facade Singleton already constructed!"; protected var controller:IController; protected var view:IView; protected var model:IModel; protected static var instance:IFacade; public function Facade(){ super(); if (instance != null){ throw (Error(SINGLETON_MSG)); }; instance = this; initializeFacade(); } public function removeProxy(proxyName:String):IProxy{ var proxy:IProxy; if (model != null){ proxy = model.removeProxy(proxyName); }; return (proxy); } public function registerProxy(proxy:IProxy):void{ model.registerProxy(proxy); } protected function initializeController():void{ if (controller != null){ return; }; controller = Controller.getInstance(); } protected function initializeFacade():void{ initializeModel(); initializeController(); initializeView(); } public function retrieveProxy(proxyName:String):IProxy{ return (model.retrieveProxy(proxyName)); } public function sendNotification(notificationName:String, body:Object=null, type:String=null):void{ notifyObservers(new Notification(notificationName, body, type)); } public function notifyObservers(notification:INotification):void{ if (view != null){ view.notifyObservers(notification); }; } protected function initializeView():void{ if (view != null){ return; }; view = View.getInstance(); } public function retrieveMediator(mediatorName:String):IMediator{ return ((view.retrieveMediator(mediatorName) as IMediator)); } public function removeMediator(mediatorName:String):IMediator{ var mediator:IMediator; if (view != null){ mediator = view.removeMediator(mediatorName); }; return (mediator); } public function hasCommand(notificationName:String):Boolean{ return (controller.hasCommand(notificationName)); } public function removeCommand(notificationName:String):void{ controller.removeCommand(notificationName); } public function registerCommand(notificationName:String, commandClassRef:Class):void{ controller.registerCommand(notificationName, commandClassRef); } public function hasMediator(mediatorName:String):Boolean{ return (view.hasMediator(mediatorName)); } public function registerMediator(mediator:IMediator):void{ if (view != null){ view.registerMediator(mediator); }; } protected function initializeModel():void{ if (model != null){ return; }; model = Model.getInstance(); } public function hasProxy(proxyName:String):Boolean{ return (model.hasProxy(proxyName)); } public static function getInstance():IFacade{ if (instance == null){ instance = new (Facade); }; return (instance); } } }//package org.puremvc.as3.patterns.facade
Section 211
//Mediator (org.puremvc.as3.patterns.mediator.Mediator) package org.puremvc.as3.patterns.mediator { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; public class Mediator extends Notifier implements IMediator, INotifier { protected var viewComponent:Object; protected var mediatorName:String; public static const NAME:String = "Mediator"; public function Mediator(mediatorName:String=null, viewComponent:Object=null){ super(); this.mediatorName = ((mediatorName)!=null) ? mediatorName : NAME; this.viewComponent = viewComponent; } public function listNotificationInterests():Array{ return ([]); } public function onRegister():void{ } public function onRemove():void{ } public function getViewComponent():Object{ return (viewComponent); } public function handleNotification(notification:INotification):void{ } public function getMediatorName():String{ return (mediatorName); } public function setViewComponent(viewComponent:Object):void{ this.viewComponent = viewComponent; } } }//package org.puremvc.as3.patterns.mediator
Section 212
//Notification (org.puremvc.as3.patterns.observer.Notification) package org.puremvc.as3.patterns.observer { import org.puremvc.as3.interfaces.*; public class Notification implements INotification { private var body:Object; private var name:String; private var type:String; public function Notification(name:String, body:Object=null, type:String=null){ super(); this.name = name; this.body = body; this.type = type; } public function setBody(body:Object):void{ this.body = body; } public function getName():String{ return (name); } public function toString():String{ var msg:String = ("Notification Name: " + getName()); msg = (msg + ("\nBody:" + ((body)==null) ? "null" : body.toString())); msg = (msg + ("\nType:" + ((type)==null) ? "null" : type)); return (msg); } public function getType():String{ return (type); } public function setType(type:String):void{ this.type = type; } public function getBody():Object{ return (body); } } }//package org.puremvc.as3.patterns.observer
Section 213
//Notifier (org.puremvc.as3.patterns.observer.Notifier) package org.puremvc.as3.patterns.observer { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.facade.*; public class Notifier implements INotifier { protected var facade:IFacade; public function Notifier(){ facade = Facade.getInstance(); super(); } public function sendNotification(notificationName:String, body:Object=null, type:String=null):void{ facade.sendNotification(notificationName, body, type); } } }//package org.puremvc.as3.patterns.observer
Section 214
//Observer (org.puremvc.as3.patterns.observer.Observer) package org.puremvc.as3.patterns.observer { import org.puremvc.as3.interfaces.*; public class Observer implements IObserver { private var notify:Function; private var context:Object; public function Observer(notifyMethod:Function, notifyContext:Object){ super(); setNotifyMethod(notifyMethod); setNotifyContext(notifyContext); } private function getNotifyMethod():Function{ return (notify); } public function compareNotifyContext(object:Object):Boolean{ return ((object === this.context)); } public function setNotifyContext(notifyContext:Object):void{ context = notifyContext; } private function getNotifyContext():Object{ return (context); } public function setNotifyMethod(notifyMethod:Function):void{ notify = notifyMethod; } public function notifyObserver(notification:INotification):void{ this.getNotifyMethod().apply(this.getNotifyContext(), [notification]); } } }//package org.puremvc.as3.patterns.observer
Section 215
//Proxy (org.puremvc.as3.patterns.proxy.Proxy) package org.puremvc.as3.patterns.proxy { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; public class Proxy extends Notifier implements IProxy, INotifier { protected var proxyName:String; protected var data:Object; public static var NAME:String = "Proxy"; public function Proxy(proxyName:String=null, data:Object=null){ super(); this.proxyName = ((proxyName)!=null) ? proxyName : NAME; if (data != null){ setData(data); }; } public function getData():Object{ return (data); } public function getProxyName():String{ return (proxyName); } public function setData(data:Object):void{ this.data = data; } } }//package org.puremvc.as3.patterns.proxy
Section 216
//ApplicationFacade (ApplicationFacade) package { import org.puremvc.as3.interfaces.*; import flash.display.*; import org.puremvc.as3.patterns.facade.*; import org.puremvc.as3.patterns.observer.*; import game.controller.*; public class ApplicationFacade extends Facade implements IFacade { public var viewContainer:Sprite; public static const STARTUP:String = "Startup"; public function ApplicationFacade(){ super(); } override protected function initializeController():void{ super.initializeController(); registerCommand(STARTUP, StartupCommand); } public function startup(startupObj:Object):void{ var container:Sprite = startupObj.container; viewContainer = new Sprite(); container.addChild(viewContainer); notifyObservers(new Notification(STARTUP, startupObj)); } public static function getInstance():ApplicationFacade{ if (instance == null){ instance = new (ApplicationFacade); }; return ((instance as _slot1)); } } }//package
Section 217
//BalloonFighter (BalloonFighter) package { import flash.events.*; import flash.display.*; public class BalloonFighter extends Sprite { public function BalloonFighter(){ super(); addEventListener(Event.ADDED_TO_STAGE, addedHandler); } private function addedHandler(e:Event):void{ ApplicationFacade.getInstance().startup({container:this}); } } }//package
Section 218
//Factory (Factory) package { import flash.events.*; import flash.display.*; import flash.ui.*; import flash.utils.*; public dynamic class Factory extends MovieClip { private var preloader:Preloader; public function Factory(){ super(); init(); } private function init():void{ stop(); MochiBot.track(this, "dba8b01a"); var myContextMenu:ContextMenu = new ContextMenu(); myContextMenu.hideBuiltInItems(); contextMenu = myContextMenu; MochiAd.showPreGameAd({clip:this, id:"5898966f00162c45", res:"640x480", no_bg:true, ad_finished:function (){ mochiCompleteHander(); }}); } private function initApp():void{ var app:Object; var mainClass:Class = (getDefinitionByName("BalloonFighter") as Class); if (mainClass){ app = new (mainClass); addChild((app as DisplayObject)); }; } private function checkDomain():Boolean{ var url:String = stage.loaderInfo.url; var urlStart:Number = (url.indexOf("://") + 3); var urlEnd:Number = url.indexOf("/", urlStart); var domain:String = url.substring(urlStart, urlEnd); var LastDot:Number = (domain.lastIndexOf(".") - 1); var domEnd:Number = (domain.lastIndexOf(".", LastDot) + 1); domain = domain.substring(domEnd, domain.length); if ((((((((domain == "")) || ((domain == "isfland.com")))) || ((domain == "flashgamelicense.com")))) || ((domain == "bubblebox.com")))){ return (true); }; return (false); } private function mochiCompleteHander():void{ preloaderCompleteHandler(null); } private function preloaderCompleteHandler(e:Event):void{ nextFrame(); initApp(); } } }//package
Section 219
//MochiAd (MochiAd) package { import flash.events.*; import flash.display.*; import flash.utils.*; import flash.system.*; import flash.net.*; public class MochiAd { public function MochiAd(){ super(); } public static function getVersion():String{ return ("2.6"); } public static function showClickAwayAd(options:Object):void{ var clip:Object; var mc:MovieClip; var chk:MovieClip; var options = options; var DEFAULTS:Object = {ad_timeout:2000, regpt:"o", method:"showClickAwayAd", res:"300x250", no_bg:true, ad_started:function ():void{ }, ad_finished:function ():void{ }, ad_loaded:function (width:Number, height:Number):void{ }, ad_failed:function ():void{ trace("[MochiAd] Couldn't load an ad, make sure your game's local security sandbox is configured for Access Network Only and that you are not using ad blocking software"); }, ad_skipped:function ():void{ }}; options = _slot1._parseOptions(options, DEFAULTS); clip = options.clip; var ad_timeout:Number = options.ad_timeout; delete options.ad_timeout; if (!_slot1.load(options)){ options.ad_failed(); options.ad_finished(); return; }; options.ad_started(); mc = clip._mochiad; mc["onUnload"] = function ():void{ _slot1._cleanup(mc); options.ad_finished(); }; var wh:Array = _slot1._getRes(options, clip); var w:Number = wh[0]; var h:Number = wh[1]; mc.x = (w * 0.5); mc.y = (h * 0.5); chk = createEmptyMovieClip(mc, "_mochiad_wait", 3); chk.ad_timeout = ad_timeout; chk.started = getTimer(); chk.showing = false; mc.unloadAd = function ():void{ _slot1.unload(clip); }; mc.adLoaded = options.ad_loaded; mc.adSkipped = options.ad_skipped; mc.rpc = function (callbackID:Number, arg:Object):void{ _slot1.rpc(clip, callbackID, arg); }; var sendHostProgress:Boolean; mc.regContLC = function (lc_name:String):void{ mc._containerLCName = lc_name; }; chk["onEnterFrame"] = function ():void{ var total:Number; if (!this.parent){ delete this.onEnterFrame; return; }; var ad_clip:Object = this.parent._mochiad_ctr; var elapsed:Number = (getTimer() - this.started); var finished:Boolean; if (!chk.showing){ total = this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal; if (total > 0){ chk.showing = true; finished = true; chk.started = getTimer(); } else { if (elapsed > chk.ad_timeout){ options.ad_failed(); finished = true; }; }; }; if (this.root == null){ finished = true; }; if (finished){ delete this.onEnterFrame; }; }; doOnEnterFrame(chk); } public static function _isNetworkAvailable():Boolean{ return (!((Security.sandboxType == "localWithFile"))); } public static function _allowDomains(server:String):String{ var hostname:String = server.split("/")[2].split(":")[0]; Security.allowDomain("*"); Security.allowDomain(hostname); Security.allowInsecureDomain("*"); Security.allowInsecureDomain(hostname); return (hostname); } public static function unload(clip:Object):Boolean{ if (((clip.clip) && (clip.clip._mochiad))){ clip = clip.clip; }; if (clip.origFrameRate != undefined){ clip.stage.frameRate = clip.origFrameRate; }; if (!clip._mochiad){ return (false); }; if (clip._mochiad._containerLCName != undefined){ clip._mochiad.lc.send(clip._mochiad._containerLCName, "notify", {id:"unload"}); }; if (clip._mochiad.onUnload){ clip._mochiad.onUnload(); }; delete clip._mochiad_loaded; delete clip._mochiad; return (true); } public static function showInterLevelAd(options:Object):void{ var clip:Object; var mc:MovieClip; var chk:MovieClip; var options = options; var DEFAULTS:Object = {ad_timeout:2000, fadeout_time:250, regpt:"o", method:"showTimedAd", ad_started:function ():void{ if ((this.clip is MovieClip)){ this.clip.stop(); } else { throw (new Error("MochiAd.showInterLevelAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers.")); }; }, ad_finished:function ():void{ if ((this.clip is MovieClip)){ this.clip.play(); } else { throw (new Error("MochiAd.showInterLevelAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers.")); }; }, ad_loaded:function (width:Number, height:Number):void{ }, ad_failed:function ():void{ trace("[MochiAd] Couldn't load an ad, make sure your game's local security sandbox is configured for Access Network Only and that you are not using ad blocking software"); }, ad_skipped:function ():void{ }}; options = _slot1._parseOptions(options, DEFAULTS); clip = options.clip; var ad_msec:Number = 11000; var ad_timeout:Number = options.ad_timeout; delete options.ad_timeout; var fadeout_time:Number = options.fadeout_time; delete options.fadeout_time; if (!_slot1.load(options)){ options.ad_failed(); options.ad_finished(); return; }; options.ad_started(); mc = clip._mochiad; mc["onUnload"] = function ():void{ _slot1._cleanup(mc); options.ad_finished(); }; var wh:Array = _slot1._getRes(options, clip); var w:Number = wh[0]; var h:Number = wh[1]; mc.x = (w * 0.5); mc.y = (h * 0.5); chk = createEmptyMovieClip(mc, "_mochiad_wait", 3); chk.ad_msec = ad_msec; chk.ad_timeout = ad_timeout; chk.started = getTimer(); chk.showing = false; chk.fadeout_time = fadeout_time; chk.fadeFunction = function ():void{ if (!this.parent){ delete this.onEnterFrame; delete this.fadeFunction; return; }; var p:Number = (100 * (1 - ((getTimer() - this.fadeout_start) / this.fadeout_time))); if (p > 0){ this.parent.alpha = (p * 0.01); } else { _slot1.unload(clip); delete this["onEnterFrame"]; }; }; mc.unloadAd = function ():void{ _slot1.unload(clip); }; mc.adLoaded = options.ad_loaded; mc.adSkipped = options.ad_skipped; mc.adjustProgress = function (msec:Number):void{ var _chk:Object = mc._mochiad_wait; _chk.server_control = true; _chk.showing = true; _chk.started = getTimer(); _chk.ad_msec = (msec - 250); }; mc.rpc = function (callbackID:Number, arg:Object):void{ _slot1.rpc(clip, callbackID, arg); }; chk["onEnterFrame"] = function ():void{ var total:Number; if (!this.parent){ delete this.onEnterFrame; delete this.fadeFunction; return; }; var ad_clip:Object = this.parent._mochiad_ctr; var elapsed:Number = (getTimer() - this.started); var finished:Boolean; if (!chk.showing){ total = this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal; if (total > 0){ chk.showing = true; chk.started = getTimer(); _slot1.adShowing(clip); } else { if (elapsed > chk.ad_timeout){ options.ad_failed(); finished = true; }; }; }; if (elapsed > chk.ad_msec){ finished = true; }; if (finished){ if (this.server_control){ delete this.onEnterFrame; } else { this.fadeout_start = getTimer(); this.onEnterFrame = this.fadeFunction; }; }; }; doOnEnterFrame(chk); } public static function _parseOptions(options:Object, defaults:Object):Object{ var k:String; var pairs:Array; var i:Number; var kv:Array; var optcopy:Object = {}; for (k in defaults) { optcopy[k] = defaults[k]; }; if (options){ for (k in options) { optcopy[k] = options[k]; }; }; if (optcopy.clip == undefined){ throw (new Error("MochiAd is missing the 'clip' parameter. This should be a MovieClip, Sprite or an instance of a class that extends MovieClip or Sprite.")); }; options = optcopy.clip.loaderInfo.parameters.mochiad_options; if (options){ pairs = options.split("&"); i = 0; while (i < pairs.length) { kv = pairs[i].split("="); optcopy[unescape(kv[0])] = unescape(kv[1]); i++; }; }; if (optcopy.id == "test"){ trace("[MochiAd] WARNING: Using the MochiAds test identifier, make sure to use the code from your dashboard, not this example!"); }; return (optcopy); } public static function _cleanup(mc:Object):void{ var k:String; var lc:LocalConnection; var f:Function; var mc = mc; if (("lc" in mc)){ lc = mc.lc; f = function ():void{ lc.client = null; lc.close(); //unresolved jump var _slot1 = e; }; setTimeout(f, 0); }; var idx:Number = DisplayObjectContainer(mc).numChildren; while (idx > 0) { idx = (idx - 1); DisplayObjectContainer(mc).removeChildAt(idx); }; for (k in mc) { delete mc[k]; }; } public static function load(options:Object):MovieClip{ var clip:Object; var k:String; var server:String; var hostname:String; var lc:LocalConnection; var name:String; var loader:Loader; var g:Function; var req:URLRequest; var v:Object; var options = options; var DEFAULTS:Object = {server:"http://x.mochiads.com/srv/1/", method:"load", depth:10333, id:"_UNKNOWN_"}; options = _slot1._parseOptions(options, DEFAULTS); options.swfv = 9; options.mav = _slot1.getVersion(); clip = options.clip; if (!_slot1._isNetworkAvailable()){ return (null); }; if (clip._mochiad_loaded){ return (null); }; //unresolved jump var _slot1 = e; throw (new Error("MochiAd requires a clip that is an instance of a dynamic class. If your class extends Sprite or MovieClip, you must make it dynamic.")); var depth:Number = options.depth; delete options.depth; var mc:MovieClip = createEmptyMovieClip(clip, "_mochiad", depth); var wh:Array = _slot1._getRes(options, clip); options.res = ((wh[0] + "x") + wh[1]); options.server = (options.server + options.id); delete options.id; clip._mochiad_loaded = true; if (clip.loaderInfo.loaderURL.indexOf("http") == 0){ options.as3_swf = clip.loaderInfo.loaderURL; }; var lv:URLVariables = new URLVariables(); for (k in options) { v = options[k]; if (!(v is Function)){ lv[k] = v; }; }; server = lv.server; delete lv.server; hostname = _allowDomains(server); lc = new LocalConnection(); lc.client = mc; name = ["", Math.floor(new Date().getTime()), Math.floor((Math.random() * 999999))].join("_"); lc.allowDomain("*", "localhost"); lc.allowInsecureDomain("*", "localhost"); lc.connect(name); mc.lc = lc; mc.lcName = name; lv.lc = name; lv.st = getTimer(); loader = new Loader(); g = function (ev:Object):void{ ev.target.removeEventListener(ev.type, arguments.callee); _slot1.unload(clip); }; loader.contentLoaderInfo.addEventListener(Event.UNLOAD, g); req = new URLRequest((server + ".swf")); req.contentType = "application/x-www-form-urlencoded"; req.method = URLRequestMethod.POST; req.data = lv; loader.load(req); mc.addChild(loader); mc._mochiad_ctr = loader; return (mc); } public static function runMethod(base:Object, methodName:String, argsArray:Array):Object{ var nameArray:Array = methodName.split("."); var i:Number = 0; while (i < (nameArray.length - 1)) { if ((((base[nameArray[i]] == undefined)) || ((base[nameArray[i]] == null)))){ return (undefined); }; base = base[nameArray[i]]; i++; }; if (typeof(base[nameArray[i]]) == "function"){ return (base[nameArray[i]].apply(base, argsArray)); }; return (undefined); } public static function createEmptyMovieClip(parent:Object, name:String, depth:Number):MovieClip{ var mc:MovieClip = new MovieClip(); if (((false) && (depth))){ parent.addChildAt(mc, depth); } else { parent.addChild(mc); }; parent[name] = mc; mc["_name"] = name; return (mc); } public static function _getRes(options:Object, clip:Object):Array{ var xy:Array; var b:Object = clip.getBounds(clip.root); var w:Number = 0; var h:Number = 0; if (typeof(options.res) != "undefined"){ xy = options.res.split("x"); w = parseFloat(xy[0]); h = parseFloat(xy[1]); } else { w = (b.xMax - b.xMin); h = (b.yMax - b.yMin); }; if ((((w == 0)) || ((h == 0)))){ w = clip.stage.stageWidth; h = clip.stage.stageHeight; }; return ([w, h]); } public static function adShowing(mc:Object):void{ mc.origFrameRate = mc.stage.frameRate; mc.stage.frameRate = 30; } public static function getValue(base:Object, objectName:String):Object{ var nameArray:Array = objectName.split("."); var i:Number = 0; while (i < (nameArray.length - 1)) { if ((((base[nameArray[i]] == undefined)) || ((base[nameArray[i]] == null)))){ return (undefined); }; base = base[nameArray[i]]; i++; }; return (base[nameArray[i]]); } public static function rpc(clip:Object, callbackID:Number, arg:Object):void{ var _local4:Object; var _local5:Object; switch (arg.id){ case "setValue": _slot1.setValue(clip, arg.objectName, arg.value); break; case "getValue": _local4 = _slot1.getValue(clip, arg.objectName); clip._mochiad.lc.send(clip._mochiad._containerLCName, "rpcResult", callbackID, _local4); break; case "runMethod": _local5 = _slot1.runMethod(clip, arg.method, arg.args); clip._mochiad.lc.send(clip._mochiad._containerLCName, "rpcResult", callbackID, _local5); break; default: trace(("[mochiads rpc] unknown rpc id: " + arg.id)); }; } public static function setValue(base:Object, objectName:String, value:Object):void{ var nameArray:Array = objectName.split("."); var i:Number = 0; while (i < (nameArray.length - 1)) { if ((((base[nameArray[i]] == undefined)) || ((base[nameArray[i]] == null)))){ return; }; base = base[nameArray[i]]; i++; }; base[nameArray[i]] = value; } public static function showPreGameAd(options:Object):void{ var clip:Object; var mc:MovieClip; var chk:MovieClip; var complete:Boolean; var unloaded:Boolean; var sendHostProgress:Boolean; var fn:Function; var r:MovieClip; var options = options; var DEFAULTS:Object = {ad_timeout:3000, fadeout_time:250, regpt:"o", method:"showPreloaderAd", color:0xFF8A00, background:16777161, outline:13994812, no_progress_bar:false, ad_started:function ():void{ if ((this.clip is MovieClip)){ this.clip.stop(); } else { throw (new Error("MochiAd.showPreGameAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers.")); }; }, ad_finished:function ():void{ if ((this.clip is MovieClip)){ this.clip.play(); } else { throw (new Error("MochiAd.showPreGameAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers.")); }; }, ad_loaded:function (width:Number, height:Number):void{ }, ad_failed:function ():void{ trace("[MochiAd] Couldn't load an ad, make sure your game's local security sandbox is configured for Access Network Only and that you are not using ad blocking software"); }, ad_skipped:function ():void{ }, ad_progress:function (percent:Number):void{ }}; options = _slot1._parseOptions(options, DEFAULTS); if ("c862232051e0a94e1c3609b3916ddb17".substr(0) == "dfeada81ac97cde83665f81c12da7def"){ options.ad_started(); fn = function ():void{ options.ad_finished(); }; setTimeout(fn, 100); return; }; clip = options.clip; var ad_msec:Number = 11000; var ad_timeout:Number = options.ad_timeout; delete options.ad_timeout; var fadeout_time:Number = options.fadeout_time; delete options.fadeout_time; if (!_slot1.load(options)){ options.ad_failed(); options.ad_finished(); return; }; options.ad_started(); mc = clip._mochiad; mc["onUnload"] = function ():void{ _slot1._cleanup(mc); var fn:Function = function ():void{ options.ad_finished(); }; setTimeout(fn, 100); }; var wh:Array = _slot1._getRes(options, clip); var w:Number = wh[0]; var h:Number = wh[1]; mc.x = (w * 0.5); mc.y = (h * 0.5); chk = createEmptyMovieClip(mc, "_mochiad_wait", 3); chk.x = (w * -0.5); chk.y = (h * -0.5); var bar:MovieClip = createEmptyMovieClip(chk, "_mochiad_bar", 4); if (options.no_progress_bar){ bar.visible = false; delete options.no_progress_bar; } else { bar.x = 10; bar.y = (h - 20); }; var bar_color:Number = options.color; delete options.color; var bar_background:Number = options.background; delete options.background; var bar_outline:Number = options.outline; delete options.outline; var backing_mc:MovieClip = createEmptyMovieClip(bar, "_outline", 1); var backing:Object = backing_mc.graphics; backing.beginFill(bar_background); backing.moveTo(0, 0); backing.lineTo((w - 20), 0); backing.lineTo((w - 20), 10); backing.lineTo(0, 10); backing.lineTo(0, 0); backing.endFill(); var inside_mc:MovieClip = createEmptyMovieClip(bar, "_inside", 2); var inside:Object = inside_mc.graphics; inside.beginFill(bar_color); inside.moveTo(0, 0); inside.lineTo((w - 20), 0); inside.lineTo((w - 20), 10); inside.lineTo(0, 10); inside.lineTo(0, 0); inside.endFill(); inside_mc.scaleX = 0; var outline_mc:MovieClip = createEmptyMovieClip(bar, "_outline", 3); var outline:Object = outline_mc.graphics; outline.lineStyle(0, bar_outline, 100); outline.moveTo(0, 0); outline.lineTo((w - 20), 0); outline.lineTo((w - 20), 10); outline.lineTo(0, 10); outline.lineTo(0, 0); chk.ad_msec = ad_msec; chk.ad_timeout = ad_timeout; chk.started = getTimer(); chk.showing = false; chk.last_pcnt = 0; chk.fadeout_time = fadeout_time; chk.fadeFunction = function ():void{ var p:Number = (100 * (1 - ((getTimer() - this.fadeout_start) / this.fadeout_time))); if (p > 0){ this.parent.alpha = (p * 0.01); } else { _slot1.unload(clip); delete this["onEnterFrame"]; }; }; complete = false; unloaded = false; var f:Function = function (ev:Event):void{ ev.target.removeEventListener(ev.type, arguments.callee); complete = true; if (unloaded){ _slot1.unload(clip); }; }; clip.loaderInfo.addEventListener(Event.COMPLETE, f); if ((clip.root is MovieClip)){ r = (clip.root as MovieClip); if (r.framesLoaded >= r.totalFrames){ complete = true; }; }; mc.unloadAd = function ():void{ unloaded = true; if (complete){ _slot1.unload(clip); }; }; mc.adLoaded = options.ad_loaded; mc.adSkipped = options.ad_skipped; mc.adjustProgress = function (msec:Number):void{ var _chk:Object = mc._mochiad_wait; _chk.server_control = true; _chk.showing = true; _chk.started = getTimer(); _chk.ad_msec = msec; }; mc.rpc = function (callbackID:Number, arg:Object):void{ _slot1.rpc(clip, callbackID, arg); }; mc.rpcTestFn = function (s:String):Object{ trace(("[MOCHIAD rpcTestFn] " + s)); return (s); }; mc.regContLC = function (lc_name:String):void{ mc._containerLCName = lc_name; }; sendHostProgress = false; mc.sendHostLoadProgress = function (lc_name:String):void{ sendHostProgress = true; }; chk["onEnterFrame"] = function ():void{ var total:Number; if (((!(this.parent)) || (!(this.parent.parent)))){ delete this["onEnterFrame"]; return; }; var _clip:Object = this.parent.parent.root; var ad_clip:Object = this.parent._mochiad_ctr; var elapsed:Number = (getTimer() - this.started); var finished:Boolean; var clip_total:Number = _clip.loaderInfo.bytesTotal; var clip_loaded:Number = _clip.loaderInfo.bytesLoaded; if (complete){ clip_loaded = Math.max(1, clip_loaded); clip_total = clip_loaded; }; var clip_pcnt:Number = ((100 * clip_loaded) / clip_total); var ad_pcnt:Number = ((100 * elapsed) / chk.ad_msec); var _inside:Object = this._mochiad_bar._inside; var pcnt:Number = Math.min(100, Math.min(((clip_pcnt) || (0)), ad_pcnt)); pcnt = Math.max(this.last_pcnt, pcnt); this.last_pcnt = pcnt; _inside.scaleX = (pcnt * 0.01); options.ad_progress(pcnt); if (sendHostProgress){ clip._mochiad.lc.send(clip._mochiad._containerLCName, "notify", {id:"hostLoadPcnt", pcnt:clip_pcnt}); if (clip_pcnt == 100){ sendHostProgress = false; }; }; if (!chk.showing){ total = this.parent._mochiad_ctr.contentLoaderInfo.bytesTotal; if (total > 0){ chk.showing = true; chk.started = getTimer(); _slot1.adShowing(clip); } else { if ((((elapsed > chk.ad_timeout)) && ((clip_pcnt == 100)))){ options.ad_failed(); finished = true; }; }; }; if (elapsed > chk.ad_msec){ finished = true; }; if (((complete) && (finished))){ if (this.server_control){ delete this.onEnterFrame; } else { this.fadeout_start = getTimer(); this.onEnterFrame = chk.fadeFunction; }; }; }; doOnEnterFrame(chk); } public static function showPreloaderAd(options:Object):void{ trace("[MochiAd] DEPRECATED: showPreloaderAd was renamed to showPreGameAd in 2.0"); _slot1.showPreGameAd(options); } public static function showTimedAd(options:Object):void{ trace("[MochiAd] DEPRECATED: showTimedAd was renamed to showInterLevelAd in 2.0"); _slot1.showInterLevelAd(options); } public static function doOnEnterFrame(mc:MovieClip):void{ var mc = mc; var f:Function = function (ev:Object):void{ if (((("onEnterFrame" in mc)) && (mc.onEnterFrame))){ mc.onEnterFrame(); } else { ev.target.removeEventListener(ev.type, arguments.callee); }; }; mc.addEventListener(Event.ENTER_FRAME, f); } } }//package
Section 220
//MochiBot (MochiBot) package { import flash.display.*; import flash.system.*; import flash.net.*; public dynamic class MochiBot extends Sprite { public function MochiBot(){ super(); } public static function track(parent:Sprite, tag:String):MochiBot{ if (Security.sandboxType == "localWithFile"){ return (null); }; var self:MochiBot = new (MochiBot); parent.addChild(self); Security.allowDomain("*"); Security.allowInsecureDomain("*"); var server:String = "http://core.mochibot.com/my/core.swf"; var lv:URLVariables = new URLVariables(); lv["sb"] = Security.sandboxType; lv["v"] = Capabilities.version; lv["swfid"] = tag; lv["mv"] = "8"; lv["fv"] = "9"; var url:String = self.root.loaderInfo.loaderURL; if (url.indexOf("http") == 0){ lv["url"] = url; } else { lv["url"] = "local"; }; var req:URLRequest = new URLRequest(server); req.contentType = "application/x-www-form-urlencoded"; req.method = URLRequestMethod.POST; req.data = lv; var loader:Loader = new Loader(); self.addChild(loader); loader.load(req); return (self); } } }//package
Section 221
//Preloader (Preloader) package { import flash.events.*; import flash.display.*; import flash.net.*; public class Preloader extends Sprite { private var WindowClass:Class; private var factory:Factory; private var sponsorLogo_bt:SimpleButton; private var progress:Sprite; private var window:Sprite; private var bar:Sprite; public function Preloader(factory:Factory):void{ WindowClass = Preloader_WindowClass; super(); this.factory = factory; init(); } private function efHandler(e:Event):void{ var percent:Number; if (factory.framesLoaded == factory.totalFrames){ progress.scaleX = 1; removeEventListener(Event.ENTER_FRAME, efHandler); } else { percent = (root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal); progress.scaleX = percent; }; } private function addedHandler(e:Event):void{ var e = e; MochiAd.showPreGameAd({clip:factory, id:"5898966f00162c45", res:"640x480", no_bg:true, ad_finished:function (){ trace("l"); }}); } private function hideComplete():void{ window.parent.removeChild(window); dispatchEvent(new Event(Event.COMPLETE)); } private function sponsorClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.bubblebox.com/clickreg.php?type=gamestats&id=1164&subid=preloader"), "_blank"); } private function init():void{ window = new WindowClass(); addChild(window); bar = (window.getChildByName("bar") as Sprite); progress = (bar.getChildByName("progress") as Sprite); progress.scaleX = 0; sponsorLogo_bt = (window.getChildByName("sponsorLogo_bt") as SimpleButton); sponsorLogo_bt.addEventListener(MouseEvent.CLICK, sponsorClickHandler); addEventListener(Event.ADDED_TO_STAGE, addedHandler); addEventListener(Event.ENTER_FRAME, efHandler); } } }//package
Section 222
//Preloader_WindowClass (Preloader_WindowClass) package { import flash.display.*; import mx.core.*; public class Preloader_WindowClass extends SpriteAsset { public var bar:DisplayObject; public var sponsorLogo_bt:DisplayObject; public var progress:DisplayObject; } }//package

Library Items

Symbol 1 BitmapUsed by:2
Symbol 2 GraphicUses:1Used by:22
Symbol 3 GraphicUsed by:7
Symbol 4 BitmapUsed by:5 6
Symbol 5 GraphicUses:4Used by:7
Symbol 6 GraphicUses:4Used by:7
Symbol 7 ButtonUses:3 5 6Used by:8
Symbol 8 ButtonUses:7Used by:22
Symbol 9 BitmapUsed by:10
Symbol 10 GraphicUses:9Used by:11
Symbol 11 MovieClipUses:10Used by:22
Symbol 12 BitmapUsed by:13
Symbol 13 GraphicUses:12Used by:14
Symbol 14 MovieClipUses:13Used by:21
Symbol 15 BitmapUsed by:16
Symbol 16 GraphicUses:15Used by:21
Symbol 17 FontUsed by:18
Symbol 18 TextUses:17Used by:21
Symbol 19 BitmapUsed by:20
Symbol 20 GraphicUses:19Used by:21
Symbol 21 MovieClipUses:14 16 18 20Used by:22
Symbol 22 MovieClip {Preloader_WindowClass} [PreloaderWindow]Uses:2 8 11 21
Symbol 23 BinaryData {core.CoreAssets_Assets} [core.CoreAssets_Assets]
Symbol 24 BinaryData {game.model.GameAssets_Assets} [game.model.GameAssets_Assets]

Instance Names

"progress"Symbol 21 MovieClip Frame 1Symbol 14 MovieClip
"sponsorLogo_bt"Symbol 22 MovieClip {Preloader_WindowClass} [PreloaderWindow] Frame 1Symbol 8 Button
"bar"Symbol 22 MovieClip {Preloader_WindowClass} [PreloaderWindow] Frame 1Symbol 21 MovieClip

Special Tags

FileAttributes (69)Timeline Frame 1Access network only, Metadata present, AS3.
SWFMetaData (77)Timeline Frame 1457 bytes "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'><rdf:Description rdf:about='' xmlns ..."
ScriptLimits (65)Timeline Frame 1MaxRecursionDepth: 1000, ScriptTimeout: 60 seconds
ExportAssets (56)Timeline Frame 1Symbol 22 as "PreloaderWindow"
ExportAssets (56)Timeline Frame 2Symbol 23 as "core.CoreAssets_Assets"
ExportAssets (56)Timeline Frame 2Symbol 24 as "game.model.GameAssets_Assets"
EnableDebugger2 (64)Timeline Frame 131 bytes "u.$1$jr$bTdGBxHRboOVdAcelhUko/."
DebugMX1 (63)Timeline Frame 1
SerialNumber (41)Timeline Frame 1

Labels

"Factory"Frame 1
"BalloonFighter"Frame 2




http://swfchan.com/10/48516/info.shtml
Created: 29/4 -2019 19:37:44 Last modified: 29/4 -2019 19:37:44 Server time: 25/04 -2024 19:36:31