/* * Copyright (c) 2013-2016 Chukong Technologies Inc. * Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ // // cocos2d constants // // CCConfig.js // cc.ENGINE_VERSION = "Cocos2d-JS v3.17"; cc.FIX_ARTIFACTS_BY_STRECHING_TEXEL = 0; cc.DIRECTOR_STATS_POSITION = {x: 0, y: 0}; cc.DIRECTOR_FPS_INTERVAL = 0.5; cc.COCOSNODE_RENDER_SUBPIXEL = 1; cc.SPRITEBATCHNODE_RENDER_SUBPIXEL = 1; cc.OPTIMIZE_BLEND_FUNC_FOR_PREMULTIPLIED_ALPHA = 0; cc.TEXTURE_ATLAS_USE_TRIANGLE_STRIP = 0; cc.TEXTURE_ATLAS_USE_VAO = 0; cc.TEXTURE_NPOT_SUPPORT = 0; cc.RETINA_DISPLAY_SUPPORT = 1; cc.RETINA_DISPLAY_FILENAME_SUFFIX = "-hd"; cc.USE_LA88_LABELS = 1; cc.SPRITE_DEBUG_DRAW = 0; cc.SPRITEBATCHNODE_DEBUG_DRAW = 0; cc.LABELBMFONT_DEBUG_DRAW = 0; cc.LABELATLAS_DEBUG_DRAW = 0; cc.IS_RETINA_DISPLAY_SUPPORTED = 1; cc.DEFAULT_ENGINE = cc.ENGINE_VERSION + "-native"; cc.ENABLE_STACKABLE_ACTIONS = 1; cc.ENABLE_GL_STATE_CACHE = 1; // Resolution policies cc.ResolutionPolicy = { // The entire application is visible in the specified area without trying to preserve the original aspect ratio. // Distortion can occur, and the application may appear stretched or compressed. EXACT_FIT:0, // The entire application fills the specified area, without distortion but possibly with some cropping, // while maintaining the original aspect ratio of the application. NO_BORDER:1, // The entire application is visible in the specified area without distortion while maintaining the original // aspect ratio of the application. Borders can appear on two sides of the application. SHOW_ALL:2, // The application takes the height of the design resolution size and modifies the width of the internal // canvas so that it fits the aspect ratio of the device // no distortion will occur however you must make sure your application works on different // aspect ratios FIXED_HEIGHT:3, // The application takes the width of the design resolution size and modifies the height of the internal // canvas so that it fits the aspect ratio of the device // no distortion will occur however you must make sure your application works on different // aspect ratios FIXED_WIDTH:4, UNKNOWN:5 }; cc.LANGUAGE_ENGLISH = 0; cc.LANGUAGE_CHINESE = 1; cc.LANGUAGE_FRENCH = 2; cc.LANGUAGE_ITALIAN = 3; cc.LANGUAGE_GERMAN = 4; cc.LANGUAGE_SPANISH = 5; cc.LANGUAGE_RUSSIAN = 6; cc.LANGUAGE_KOREAN = 7; cc.LANGUAGE_JAPANESE = 8; cc.LANGUAGE_HUNGARIAN = 9; cc.LANGUAGE_PORTUGUESE = 10; cc.LANGUAGE_ARABIC = 11; cc.Director.PROJECTION_2D = 0; cc.Director.PROJECTION_3D = 1; cc.Director.PROJECTION_CUSTOM = 3; cc.Director.PROJECTION_DEFAULT = cc.Director.PROJECTION_3D; cc.DEVICE_ORIENTATION_PORTRAIT = 0; cc.DEVICE_ORIENTATION_LANDSCAPE_LEFT = 1; cc.DEVICE_ORIENTATION_PORTRAIT_UPSIDE_DOWN = 2; cc.DEVICE_ORIENTATION_LANDSCAPE_RIGHT = 3; cc.DEVICE_MAX_ORIENTATIONS = 2; cc.IMAGE_FORMAT_JPEG = 0; cc.IMAGE_FORMAT_PNG = 1; cc.IMAGE_FORMAT_RAWDATA = 9; cc.TOUCH_ALL_AT_ONCE = 0; cc.TOUCH_ONE_BY_ONE = 1; cc.TRANSITION_ORIENTATION_LEFT_OVER = 0; cc.TRANSITION_ORIENTATION_RIGHT_OVER = 1; cc.TRANSITION_ORIENTATION_UP_OVER = 0; cc.TRANSITION_ORIENTATION_DOWN_OVER = 1; cc.RED = {r:255, g:0, b:0}; cc.GREEN = {r:0, g:255, b:0}; cc.BLUE = {r:0, g:0, b:255}; cc.BLACK = {r:0, g:0, b:0}; cc.WHITE = {r:255, g:255, b:255}; cc.YELLOW = {r:255, g:255, b:0}; cc.POINT_ZERO = {x:0, y:0}; cc.PARTICLE_DEFAULT_CAPACITY = 500; cc.MENU_STATE_WAITING = 0; cc.MENU_STATE_TRACKING_TOUCH = 1; cc.MENU_HANDLER_PRIORITY = -128; cc.DEFAULT_PADDING = 5; cc.Scheduler.PRIORITY_SYSTEM = -2147483648; cc.Scheduler.PRIORITY_NON_SYSTEM = cc.Scheduler.PRIORITY_SYSTEM + 1; var _Class = cc.Texture2D; _Class.PIXEL_FORMAT_NONE = -1; _Class.PIXEL_FORMAT_AUTO = 0; _Class.PIXEL_FORMAT_BGRA8888 = 1; _Class.PIXEL_FORMAT_RGBA8888 = 2; _Class.PIXEL_FORMAT_RGB888 = 3; _Class.PIXEL_FORMAT_RGB565 = 4; _Class.PIXEL_FORMAT_A8 = 5; _Class.PIXEL_FORMAT_I8 = 6; _Class.PIXEL_FORMAT_AI88 = 7; _Class.PIXEL_FORMAT_RGBA4444 = 8; _Class.PIXEL_FORMAT_RGB5A1 = 9; _Class.PIXEL_FORMAT_PVRTC4 = 10; _Class.PIXEL_FORMAT_PVRTC4A = 11; _Class.PIXEL_FORMAT_PVRTC2 = 11; _Class.PIXEL_FORMAT_PVRTC2A = 13; _Class.PIXEL_FORMAT_ETC = 14; _Class.PIXEL_FORMAT_S3TC_DXT1 = 15; _Class.PIXEL_FORMAT_S3TC_DXT3 = 16; _Class.PIXEL_FORMAT_S3TC_DXT5 = 17; _Class.PIXEL_FORMAT_ATC_RGB = 18; _Class.PIXEL_FORMAT_ATC_EXPLICIT_ALPHA = 19; _Class.PIXEL_FORMAT_ATC_INTERPOLATED_ALPHA = 20; _Class.PIXEL_FORMAT_DEFAULT = _Class.PIXEL_FORMAT_AUTO; _Class.defaultPixelFormat = _Class.PIXEL_FORMAT_DEFAULT; // For blend cc.ONE = 1; cc.ZERO = 0; cc.SRC_ALPHA = 0x0302; cc.SRC_ALPHA_SATURATE = 0x308; cc.SRC_COLOR = 0x300; cc.DST_ALPHA = 0x304; cc.DST_COLOR = 0x306; cc.ONE_MINUS_SRC_ALPHA = 0x0303; cc.ONE_MINUS_SRC_COLOR = 0x301; cc.ONE_MINUS_DST_ALPHA = 0x305; cc.ONE_MINUS_DST_COLOR = 0x0307; cc.ONE_MINUS_CONSTANT_ALPHA = 0x8004; cc.ONE_MINUS_CONSTANT_COLOR = 0x8002; //texture parameters cc.LINEAR = 0x2601; cc.REPEAT = 0x2901; cc.CLAMP_TO_EDGE = 0x812f; cc.MIRRORED_REPEAT = 0x8370; cc.VERTEX_ATTRIB_FLAG_NONE = 0; cc.VERTEX_ATTRIB_FLAG_POSITION = 1 << 0; cc.VERTEX_ATTRIB_FLAG_COLOR = 1 << 1; cc.VERTEX_ATTRIB_FLAG_TEX_COORDS = 1 << 2; cc.VERTEX_ATTRIB_FLAG_POS_COLOR_TEX = ( cc.VERTEX_ATTRIB_FLAG_POSITION | cc.VERTEX_ATTRIB_FLAG_COLOR | cc.VERTEX_ATTRIB_FLAG_TEX_COORDS ); cc.GL_ALL = 0; cc.VERTEX_ATTRIB_POSITION = 0; cc.VERTEX_ATTRIB_COLOR = 1; cc.VERTEX_ATTRIB_TEX_COORDS = 2; cc.VERTEX_ATTRIB_MAX = 3; cc.UNIFORM_PMATRIX = 0; cc.UNIFORM_MVMATRIX = 1; cc.UNIFORM_MVPMATRIX = 2; cc.UNIFORM_TIME = 3; cc.UNIFORM_SINTIME = 4; cc.UNIFORM_COSTIME = 5; cc.UNIFORM_RANDOM01 = 6; cc.UNIFORM_SAMPLER = 7; cc.UNIFORM_MAX = 8; // Shaders cc.UNIFORM_TIME_S = "CC_Time"; cc.UNIFORM_COS_TIME_S = 'CC_CosTime'; cc.UNIFORM_COSTIME_S = "CC_CosTime"; cc.UNIFORM_SIN_TIME_S = 'CC_SinTime'; cc.UNIFORM_SINTIME_S = "CC_SinTime"; cc.UNIFORM_PMATRIX_S = "CC_PMatrix"; cc.UNIFORM_MVMATRIX_S = "CC_MVMatrix"; cc.UNIFORM_MVPMATRIX_S = "CC_MVPMatrix"; cc.UNIFORM_P_MATRIX_S = 'CC_PMatrix'; cc.UNIFORM_MV_MATRIX_S = 'CC_MVMatrix'; cc.UNIFORM_MVP_MATRIX_S = 'CC_MVPMatrix'; cc.UNIFORM_RANDOM01_S = 'CC_Random01'; cc.UNIFORM_SAMPLER_S = 'CC_Texture0'; cc.UNIFORM_ALPHA_TEST_VALUE_S = "CC_AlphaValue"; cc.ITEM_SIZE = 32; cc.CURRENT_ITEM = 0xc0c05001; cc.ZOOM_ACTION_TAG = 0xc0c05002; cc.NORMAL_TAG = 8801; cc.SELECTED_TAG = 8802; cc.DISABLE_TAG = 8803; cc.stencilBits = -1; //CCClippingNode.js cc.g_NumberOfDraws = 0; //CCDirector.js cc.s_globalOrderOfArrival = 1; cc.Event.TOUCH = 0; //CCEvent.js cc.Event.KEYBOARD = 1; cc.Event.ACCELERATION = 2; cc.Event.MOUSE = 3; cc.Event.FOCUS = 4 //game controller 5 cc.Event.CUSTOM = 6; cc.EventMouse.NONE = 0; cc.EventMouse.DOWN = 1; cc.EventMouse.UP = 2; cc.EventMouse.MOVE = 3; cc.EventMouse.SCROLL = 4; cc.EventMouse.BUTTON_LEFT = 0; cc.EventMouse.BUTTON_RIGHT = 1; cc.EventMouse.BUTTON_MIDDLE = 2; cc.EventMouse.BUTTON_4 = 3; cc.EventMouse.BUTTON_5 = 4; cc.EventMouse.BUTTON_6 = 5; cc.EventMouse.BUTTON_7 = 6; cc.EventMouse.BUTTON_8 = 7; cc.EventTouch.MAX_TOUCHES = 5; cc.EventTouch.EventCode = {BEGAN: 0, MOVED: 1, ENDED: 2, CANCELLED: 3}; cc.SpriteBatchNode.DEFAULT_CAPACITY = 29; //CCSpriteBatchNode.js cc.ParticleSystem.SHAPE_MODE = 0; //CCParticleSystem.js cc.ParticleSystem.TEXTURE_MODE = 1; cc.ParticleSystem.STAR_SHAPE = 0; cc.ParticleSystem.BALL_SHAPE = 1; cc.ProgressTimer.TEXTURE_COORDS_COUNT = 4; //CCProgressTimer.js cc.ProgressTimer.TEXTURE_COORDS = 0x4b; cc.IMAGE_FORMAT_RAWDATA = 2; //CCRenderTexture.js cc.TMXLayerInfo.ATTRIB_NONE = 1 << 0; //CCTMXXMLParser.js cc.TMXLayerInfo.ATTRIB_BASE64 = 1 << 1; cc.TMXLayerInfo.ATTRIB_GZIP = 1 << 2; cc.TMXLayerInfo.ATTRIB_ZLIB = 1 << 3; cc.TMX_PROPERTY_NONE = 0; cc.TMX_PROPERTY_MAP = 1; cc.TMX_PROPERTY_LAYER = 2; cc.TMX_PROPERTY_OBJECTGROUP = 3; cc.TMX_PROPERTY_OBJECT = 4; cc.TMX_PROPERTY_TILE = 5; cc.SCENE_FADE = 4208917214; //CCTransition.js cc.SCENE_RADIAL = 0xc001; //CCTransitionProgress.js // // CCMacro.js export // /** * @constant * @type Number */ cc.INVALID_INDEX = -1; /** * PI is the ratio of a circle's circumference to its diameter. * @constant * @type Number */ cc.PI = Math.PI; /** * @constant * @type Number */ cc.FLT_MAX = parseFloat('3.402823466e+38F'); /** * @constant * @type Number */ cc.RAD = cc.PI / 180; /** * @constant * @type Number */ cc.DEG = 180 / cc.PI; /** * maximum unsigned int value * @constant * @type Number */ cc.UINT_MAX = 0xffffffff; /** *

* simple macro that swaps 2 variables
* modified from c++ macro, you need to pass in the x and y variables names in string,
* and then a reference to the whole object as third variable *

* @param x * @param y * @param ref * @function * @deprecated */ cc.swap = function (x, y, ref) { if ((typeof ref) == 'object' && (typeof ref.x) != 'undefined' && (typeof ref.y) != 'undefined') { var tmp = ref[x]; ref[x] = ref[y]; ref[y] = tmp; } else cc.log("cc.swap is being modified from original macro, please check usage"); }; /** *

* Linear interpolation between 2 numbers, the ratio sets how much it is biased to each end *

* @param {Number} a number A * @param {Number} b number B * @param {Number} r ratio between 0 and 1 * @function * @example * cc.lerp(2,10,0.5)//returns 6
* cc.lerp(2,10,0.2)//returns 3.6 */ cc.lerp = function (a, b, r) { return a + (b - a) * r; }; /** * get a random number from 0 to 0xffffff * @function * @returns {number} */ cc.rand = function () { return Math.random() * 0xffffff; }; /** * returns a random float between -1 and 1 * @return {Number} * @function */ cc.randomMinus1To1 = function () { return (Math.random() - 0.5) * 2; }; /** * returns a random float between 0 and 1 * @return {Number} * @function */ cc.random0To1 = Math.random; /** * converts degrees to radians * @param {Number} angle * @return {Number} * @function */ cc.degreesToRadians = function (angle) { return angle * cc.RAD; }; /** * converts radians to degrees * @param {Number} angle * @return {Number} * @function */ cc.radiansToDegrees = function (angle) { return angle * cc.DEG; }; /** * @constant * @type Number */ cc.REPEAT_FOREVER = 0xffffffff; /** * default gl blend src function. Compatible with premultiplied alpha images. * @constant * @type Number */ cc.BLEND_SRC = cc.OPTIMIZE_BLEND_FUNC_FOR_PREMULTIPLIED_ALPHA ? 1 : 0x0302; /** * default gl blend dst function. Compatible with premultiplied alpha images. * @constant * @type Number */ cc.BLEND_DST = 0x0303; /** * Helpful macro that setups the GL server state, the correct GL program and sets the Model View Projection matrix * @param {cc.Node} node setup node * @function */ cc.nodeDrawSetup = function (node) { //cc.glEnable(node._glServerState); if (node._shaderProgram) { //cc._renderContext.useProgram(node._shaderProgram._programObj); node._shaderProgram.use(); node._shaderProgram.setUniformForModelViewAndProjectionMatrixWithMat4(); } }; /** *

* GL states that are enabled:
* - GL_TEXTURE_2D
* - GL_VERTEX_ARRAY
* - GL_TEXTURE_COORD_ARRAY
* - GL_COLOR_ARRAY
*

* @function */ cc.enableDefaultGLStates = function () { //TODO OPENGL STUFF /* glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D);*/ }; /** *

* Disable default GL states:
* - GL_TEXTURE_2D
* - GL_TEXTURE_COORD_ARRAY
* - GL_COLOR_ARRAY
*

* @function */ cc.disableDefaultGLStates = function () { //TODO OPENGL /* glDisable(GL_TEXTURE_2D); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); */ }; /** *

* Increments the GL Draws counts by one.
* The number of calls per frame are displayed on the screen when the CCDirector's stats are enabled.
*

* @param {Number} addNumber * @function */ cc.incrementGLDraws = function (addNumber) { cc.g_NumberOfDraws += addNumber; }; /** * @constant * @type Number */ cc.FLT_EPSILON = 0.0000001192092896; /** *

* On Mac it returns 1;
* On iPhone it returns 2 if RetinaDisplay is On. Otherwise it returns 1 *

* @function */ cc.contentScaleFactor = cc.IS_RETINA_DISPLAY_SUPPORTED ? function () { return cc.director.getContentScaleFactor(); } : function () { return 1; }; /** * Converts a Point in points to pixels * @param {cc.Point} points * @return {cc.Point} * @function */ cc.pointPointsToPixels = function (points) { var scale = cc.contentScaleFactor(); return cc.p(points.x * scale, points.y * scale); }; /** * Converts a Point in pixels to points * @param {Point} pixels * @function */ cc.pointPixelsToPoints = function (pixels) { var scale = cc.contentScaleFactor(); return cc.p(pixels.x / scale, pixels.y / scale); }; cc._pointPixelsToPointsOut = function(pixels, outPoint){ var scale = cc.contentScaleFactor(); outPoint.x = pixels.x / scale; outPoint.y = pixels.y / scale; }; /** * Converts a Size in points to pixels * @param {cc.Size} sizeInPoints * @return {cc.Size} * @function */ cc.sizePointsToPixels = function (sizeInPoints) { var scale = cc.contentScaleFactor(); return cc.size(sizeInPoints.width * scale, sizeInPoints.height * scale); }; /** * Converts a size in pixels to points * @param {cc.Size} sizeInPixels * @return {cc.Size} * @function */ cc.sizePixelsToPoints = function (sizeInPixels) { var scale = cc.contentScaleFactor(); return cc.size(sizeInPixels.width / scale, sizeInPixels.height / scale); }; cc._sizePixelsToPointsOut = function (sizeInPixels, outSize) { var scale = cc.contentScaleFactor(); outSize.width = sizeInPixels.width / scale; outSize.height = sizeInPixels.height / scale; }; /** * Converts a rect in pixels to points * @param {cc.Rect} pixel * @function */ cc.rectPixelsToPoints = cc.IS_RETINA_DISPLAY_SUPPORTED ? function (pixel) { var scale = cc.contentScaleFactor(); return cc.rect(pixel.x / scale, pixel.y / scale, pixel.width / scale, pixel.height / scale); } : function (p) { return p; }; /** * Converts a rect in points to pixels * @param {cc.Rect} point * @function */ cc.rectPointsToPixels = cc.IS_RETINA_DISPLAY_SUPPORTED ? function (point) { var scale = cc.contentScaleFactor(); return cc.rect(point.x * scale, point.y * scale, point.width * scale, point.height * scale); } : function (p) { return p; }; cc.checkGLErrorDebug = function () { if (cc.renderMode == cc._RENDER_TYPE_WEBGL) { var _error = cc._renderContext.getError(); if (_error) { cc.log(CC._localZOrder.checkGLErrorDebug, _error); } } }; // // Reusable objects // cc._reuse_p = [ {x:0, y:0}, {x:0,y:0}, {x:0,y:0}, {x:0,y:0} ]; cc._reuse_p_index = 0; cc._reuse_size = {width:0, height:0}; cc._reuse_rect = {x:0, y:0, width:0, height:0}; cc._reuse_color3b = {r:255, g:255, b:255 }; cc._reuse_color4b = {r:255, g:255, b:255, a:255 }; // // Basic structure : Point // cc.p = function( x, y ) { if (x == undefined) return {x: 0, y: 0}; if (y == undefined) return {x: x.x, y: x.y}; return {x:x, y:y}; }; cc._p = function( x, y ) { if( cc._reuse_p_index == cc._reuse_p.length ) cc._reuse_p_index = 0; var p = cc._reuse_p[ cc._reuse_p_index]; cc._reuse_p_index++; p.x = x; p.y = y; return p; }; cc.pointEqualToPoint = function (point1, point2) { return ((point1.x == point2.x) && (point1.y == point2.y)); }; cc.PointZero = function () { return cc.p(0, 0); }; /** * Unrotates two points. * @param {cc.Point} v1 * @param {cc.Point} v2 * @return {cc.Point} */ cc.pUnrotate = function (v1, v2) { return cc.p(v1.x * v2.x + v1.y * v2.y, v1.y * v2.x - v1.x * v2.y); }; /** * Converts radians to a normalized vector. * @param {Number} a * @return {cc.Point} */ cc.pForAngle = function (a) { return cc.p(Math.cos(a), Math.sin(a)); }; /** * Converts a vector to radians. * @param {cc.Point} v * @return {Number} */ cc.pToAngle = function (v) { return Math.atan2(v.y, v.x); }; /** * Clamp a value between from and to. * @param {Number} value * @param {Number} min_inclusive * @param {Number} max_inclusive * @return {Number} */ cc.clampf = function (value, min_inclusive, max_inclusive) { if (min_inclusive > max_inclusive) { var temp = min_inclusive; min_inclusive = max_inclusive; max_inclusive = temp; } return value < min_inclusive ? min_inclusive : value < max_inclusive ? value : max_inclusive; }; /** * Quickly convert cc.Size to a cc.Point * @param {cc.Size} s * @return {cc.Point} */ cc.pFromSize = function (s) { return cc.p(s.width, s.height); }; /** * Run a math operation function on each point component
* Math.abs, Math.fllor, Math.ceil, Math.round. * @param {cc.Point} p * @param {Function} opFunc * @return {cc.Point} * @example * //For example: let's try to take the floor of x,y * var p = cc.pCompOp(cc.p(10,10),Math.abs); */ cc.pCompOp = function (p, opFunc) { return cc.p(opFunc(p.x), opFunc(p.y)); }; /** * Linear Interpolation between two points a and b * alpha == 0 ? a * alpha == 1 ? b * otherwise a value between a..b * @param {cc.Point} a * @param {cc.Point} b * @param {Number} alpha * @return {cc.pAdd} */ cc.pLerp = function (a, b, alpha) { return cc.pAdd(cc.pMult(a, 1 - alpha), cc.pMult(b, alpha)); }; /** * @param {cc.Point} a * @param {cc.Point} b * @param {Number} variance * @return {Boolean} if points have fuzzy equality which means equal with some degree of variance. */ cc.pFuzzyEqual = function (a, b, variance) { if (a.x - variance <= b.x && b.x <= a.x + variance) { if (a.y - variance <= b.y && b.y <= a.y + variance) return true; } return false; }; /** * Multiplies a nd b components, a.x*b.x, a.y*b.y * @param {cc.Point} a * @param {cc.Point} b * @return {cc.Point} */ cc.pCompMult = function (a, b) { return cc.p(a.x * b.x, a.y * b.y); }; /** * @param {cc.Point} a * @param {cc.Point} b * @return {Number} the signed angle in radians between two vector directions */ cc.pAngleSigned = function (a, b) { var a2 = cc.pNormalize(a); var b2 = cc.pNormalize(b); var angle = Math.atan2(a2.x * b2.y - a2.y * b2.x, cc.pDot(a2, b2)); if (Math.abs(angle) < cc.POINT_EPSILON) return 0.0; return angle; }; /** * @param {cc.Point} a * @param {cc.Point} b * @return {Number} the angle in radians between two vector directions */ cc.pAngle = function (a, b) { var angle = Math.acos(cc.pDot(cc.pNormalize(a), cc.pNormalize(b))); if (Math.abs(angle) < cc.POINT_EPSILON) return 0.0; return angle; }; /** * Rotates a point counter clockwise by the angle around a pivot * @param {cc.Point} v v is the point to rotate * @param {cc.Point} pivot pivot is the pivot, naturally * @param {Number} angle angle is the angle of rotation cw in radians * @return {cc.Point} the rotated point */ cc.pRotateByAngle = function (v, pivot, angle) { var r = cc.pSub(v, pivot); var cosa = Math.cos(angle), sina = Math.sin(angle); var t = r.x; r.x = t * cosa - r.y * sina + pivot.x; r.y = t * sina + r.y * cosa + pivot.y; return r; }; /** * A general line-line intersection test * @param {cc.Point} A A is the startpoint for the first line P1 = (p1 - p2). * @param {cc.Point} B B is the endpoint for the first line P1 = (p1 - p2). * @param {cc.Point} C C is the startpoint for the second line P2 = (p3 - p4). * @param {cc.Point} D D is the endpoint for the second line P2 = (p3 - p4). * @param {cc.Point} retP retP.x is the range for a hitpoint in P1 (pa = p1 + s*(p2 - p1)),
* retP.y is the range for a hitpoint in P3 (pa = p2 + t*(p4 - p3)). * @return {Boolean} * indicating successful intersection of a line
* note that to truly test intersection for segments we have to make
* sure that s & t lie within [0..1] and for rays, make sure s & t > 0
* the hit point is p3 + t * (p4 - p3);
* the hit point also is p1 + s * (p2 - p1); */ cc.pLineIntersect = function (A, B, C, D, retP) { if ((A.x == B.x && A.y == B.y) || (C.x == D.x && C.y == D.y)) { return false; } var BAx = B.x - A.x; var BAy = B.y - A.y; var DCx = D.x - C.x; var DCy = D.y - C.y; var ACx = A.x - C.x; var ACy = A.y - C.y; var denom = DCy * BAx - DCx * BAy; retP.x = DCx * ACy - DCy * ACx; retP.y = BAx * ACy - BAy * ACx; if (denom == 0) { if (retP.x == 0 || retP.y == 0) { // Lines incident return true; } // Lines parallel and not incident return false; } retP.x = retP.x / denom; retP.y = retP.y / denom; return true; }; /** * ccpSegmentIntersect return YES if Segment A-B intersects with segment C-D. * @param {cc.Point} A * @param {cc.Point} B * @param {cc.Point} C * @param {cc.Point} D * @return {Boolean} */ cc.pSegmentIntersect = function (A, B, C, D) { var retP = cc.p(0, 0); if (cc.pLineIntersect(A, B, C, D, retP)) if (retP.x >= 0.0 && retP.x <= 1.0 && retP.y >= 0.0 && retP.y <= 1.0) return true; return false; }; /** * ccpIntersectPoint return the intersection point of line A-B, C-D * @param {cc.Point} A * @param {cc.Point} B * @param {cc.Point} C * @param {cc.Point} D * @return {cc.Point} */ cc.pIntersectPoint = function (A, B, C, D) { var retP = cc.p(0, 0); if (cc.pLineIntersect(A, B, C, D, retP)) { // Point of intersection var P = cc.p(0, 0); P.x = A.x + retP.x * (B.x - A.x); P.y = A.y + retP.x * (B.y - A.y); return P; } return cc.p(0,0); }; /** * check to see if both points are equal * @param {cc.Point} A A ccp a * @param {cc.Point} B B ccp b to be compared * @return {Boolean} the true if both ccp are same */ cc.pSameAs = function (A, B) { if ((A != null) && (B != null)) { return (A.x == B.x && A.y == B.y); } return false; }; /** * sets the position of the point to 0 */ cc.pZeroIn = function(v) { v.x = 0; v.y = 0; }; /** * copies the position of one point to another */ cc.pIn = function(v1, v2) { v1.x = v2.x; v1.y = v2.y; }; /** * multiplies the point with the given factor (inplace) */ cc.pMultIn = function(point, floatVar) { point.x *= floatVar; point.y *= floatVar; }; /** * subtracts one point from another (inplace) */ cc.pSubIn = function(v1, v2) { v1.x -= v2.x; v1.y -= v2.y; }; /** * adds one point to another (inplace) */ cc.pAddIn = function(v1, v2) { v1.x += v2.x; v1.y += v2.y; }; /** * normalizes the point (inplace) */ cc.pNormalizeIn = function(v) { cc.pMultIn(v, 1.0 / Math.sqrt(v.x * v.x + v.y * v.y)); }; // // Grid // cc._g = function( x, y ) { cc._reuse_grid.x = x; cc._reuse_grid.y = y; return cc._reuse_grid; }; // // Basic structure : Size // cc.size = function(w,h) { return {width:w, height:h}; }; cc._size = function(w,h) { cc._reuse_size.width = w; cc._reuse_size.height = h; return cc._reuse_size; }; cc.sizeEqualToSize = function (size1, size2) { return ((size1.width == size2.width) && (size1.height == size2.height)); }; cc.SizeZero = function () { return cc.size(0, 0); }; /** * create a cc.rect object * @param {Number|cc.point|cc.rect} [x] a Number value as x or a cc.point object as origin or a cc.rect clone object * @param {Number|cc.size} [y] x1 a Number value as y or a cc.size object as size * @param {Number} [w] * @param {Number} [h] * @return {Object} a cc.rect object */ cc.rect = function(x,y,w,h) { var argLen = arguments.length; if (argLen === 0) return { x: 0, y: 0, width: 0, height: 0 }; if (argLen === 1) return { x: x.x, y: x.y, width: x.width, height: x.height }; if (argLen === 2) return { x: x.x, y: x.y, width: y.width, height: y.height }; if (argLen === 4) return { x: x, y: y, width: w, height: h }; throw "unknown argument type"; }; cc._rect = function(x,y,w,h) { cc._reuse_rect.x = x; cc._reuse_rect.y = y; cc._reuse_rect.width = w; cc._reuse_rect.height = h; return cc._reuse_rect; }; cc.rectEqualToRect = function (rect1, rect2) { return ( rect1.x==rect2.x && rect1.y==rect2.y && rect1.width==rect2.width && rect1.height==rect2.height); }; cc.rectContainsRect = function (rect1, rect2) { if ((rect1.x >= rect2.x) || (rect1.y >= rect2.y) || ( rect1.x + rect1.width <= rect2.x + rect2.width) || ( rect1.y + rect1.height <= rect2.y + rect2.height)) return false; return true; }; cc.rectGetMaxX = function (rect) { return (rect.x + rect.width); }; cc.rectGetMidX = function (rect) { return (rect.x + rect.width / 2.0); }; cc.rectGetMinX = function (rect) { return rect.x; }; cc.rectGetMaxY = function (rect) { return(rect.y + rect.height); }; cc.rectGetMidY = function (rect) { return rect.y + rect.height / 2.0; }; cc.rectGetMinY = function (rect) { return rect.y; }; cc.rectContainsPoint = function (rect, point) { var ret = false; if (point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height) { ret = true; } return ret; }; cc.rectIntersectsRect = function( rectA, rectB ) { var bool = ! ( rectA.x > rectB.x + rectB.width || rectA.x + rectA.width < rectB.x || rectA.y > rectB.y +rectB.height || rectA.y + rectA.height < rectB.y ); return bool; }; cc.rectOverlapsRect = function (rectA, rectB) { return !((rectA.x + rectA.width < rectB.x) || (rectB.x + rectB.width < rectA.x) || (rectA.y + rectA.height < rectB.y) || (rectB.y + rectB.height < rectA.y)); }; cc.rectUnion = function (rectA, rectB) { var rect = cc.rect(0, 0, 0, 0); rect.x = Math.min(rectA.x, rectB.x); rect.y = Math.min(rectA.y, rectB.y); rect.width = Math.max(rectA.x + rectA.width, rectB.x + rectB.width) - rect.x; rect.height = Math.max(rectA.y + rectA.height, rectB.y + rectB.height) - rect.y; return rect; }; cc.rectIntersection = function (rectA, rectB) { var intersection = cc.rect( Math.max(rectA.x, rectB.x), Math.max(rectA.y, rectB.y), 0, 0); intersection.width = Math.min(rectA.x+rectA.width, rectB.x+rectB.width) - intersection.x; intersection.height = Math.min(rectA.y+rectA.height, rectB.y+rectB.height) - intersection.y; return intersection; }; cc.RectZero = function () { return cc.rect(0, 0, 0, 0); }; // Basic structure : Color cc.Color = function (r, g, b, a) { this.r = r || 0; this.g = g || 0; this.b = b || 0; this.a = (a === undefined) ? 255 : a; }; /** * Generate a color object based on multiple forms of parameters * @example * * // 1. All channels separately as parameters * var color1 = cc.color(255, 255, 255, 255); * * // 2. Convert a hex string to a color * var color2 = cc.color("#000000"); * * // 3. An color object as parameter * var color3 = cc.color({r: 255, g: 255, b: 255, a: 255}); * * Alpha channel is optional. Default value is 255 * * @param {Number|String|cc.Color} r * @param {Number} g * @param {Number} b * @param {Number} [a=255] * @returns {cc.Color} */ cc.color = function (r, g, b, a) { if (r === undefined) return {r: 0, g: 0, b: 0, a: 255}; if (typeof r === "string") return cc.hexToColor(r); if (typeof r === "object") return {r: r.r, g: r.g, b: r.b, a: (r.a === undefined) ? 255 : r.a}; return {r: r, g: g, b: b, a: (a === undefined ? 255 : a)}; }; /** * returns true if both ccColor3B are equal. Otherwise it returns false. * @param {cc.Color} color1 * @param {cc.Color} color2 * @return {Boolean} true if both ccColor3B are equal. Otherwise it returns false. */ cc.colorEqual = function(color1, color2){ return color1.r === color2.r && color1.g === color2.g && color1.b === color2.b; }; /** * convert a string of color for style to Color. * e.g. "#ff06ff" to : cc.color(255,6,255) * @param {String} hex * @return {cc.Color} */ cc.hexToColor = function (hex) { hex = hex.replace(/^#?/, "0x"); var c = parseInt(hex); var r = c >> 16; var g = (c >> 8) % 256; var b = c % 256; return cc.color(r, g, b); }; /** * convert Color to a string of color for style. * e.g. cc.color(255,6,255) to : "#ff06ff" * @param {cc.Color} color * @return {String} */ cc.colorToHex = function (color) { var hR = color.r.toString(16); var hG = color.g.toString(16); var hB = color.b.toString(16); var hex = "#" + (color.r < 16 ? ("0" + hR) : hR) + (color.g < 16 ? ("0" + hG) : hG) + (color.b < 16 ? ("0" + hB) : hB); return hex; }; /** * White color (255, 255, 255, 255) * @returns {cc.Color} * @private */ cc.color._getWhite = function(){ return cc.color(255, 255, 255, 255); }; /** * Yellow color (255, 255, 0, 255) * @returns {cc.Color} * @private */ cc.color._getYellow = function () { return cc.color(255, 255, 0, 255); }; /** * Blue color (0, 0, 255, 255) * @type {cc.Color} * @private */ cc.color._getBlue = function () { return cc.color(0, 0, 255, 255); }; /** * Green Color (0, 255, 0, 255) * @type {cc.Color} * @private */ cc.color._getGreen = function () { return cc.color(0, 255, 0, 255); }; /** * Red Color (255, 0, 0, 255) * @type {cc.Color} * @private */ cc.color._getRed = function () { return cc.color(255, 0, 0, 255); }; /** * Magenta Color (255, 0, 255, 255) * @type {cc.Color} * @private */ cc.color._getMagenta = function () { return cc.color(255, 0, 255, 255); }; /** * Black Color (0, 0, 0, 255) * @type {cc.Color} * @private */ cc.color._getBlack = function () { return cc.color(0, 0, 0, 255); }; /** * Orange Color (255, 127, 0, 255) * @type {cc.Color} * @private */ cc.color._getOrange = function () { return cc.color(255, 127, 0, 255); }; /** * Gray Color (166, 166, 166, 255) * @type {cc.Color} * @private */ cc.color._getGray = function () { return cc.color(166, 166, 166, 255); }; var _proto = cc.color; /** @expose */ _proto.WHITE; cc.defineGetterSetter(_proto, "WHITE", _proto._getWhite); /** @expose */ _proto.YELLOW; cc.defineGetterSetter(_proto, "YELLOW", _proto._getYellow); /** @expose */ _proto.BLUE; cc.defineGetterSetter(_proto, "BLUE", _proto._getBlue); /** @expose */ _proto.GREEN; cc.defineGetterSetter(_proto, "GREEN", _proto._getGreen); /** @expose */ _proto.RED; cc.defineGetterSetter(_proto, "RED", _proto._getRed); /** @expose */ _proto.MAGENTA; cc.defineGetterSetter(_proto, "MAGENTA", _proto._getMagenta); /** @expose */ _proto.BLACK; cc.defineGetterSetter(_proto, "BLACK", _proto._getBlack); /** @expose */ _proto.ORANGE; cc.defineGetterSetter(_proto, "ORANGE", _proto._getOrange); /** @expose */ _proto.GRAY; cc.defineGetterSetter(_proto, "GRAY", _proto._getGray); // Cocos2d-html5 supports multi scene resources preloading. // This is a compatible function for JSB. cc.Loader = cc.Class.extend({ initWith:function (resources, selector, target) { if (selector) { this._selector = selector; this._target = target; } this._selector.call(this._target); } }); cc.Loader.preload = function (resources, selector, target) { if (!this._instance) { this._instance = new cc.Loader(); } this._instance.initWith(resources, selector, target); return this._instance; }; cc.LoaderScene = cc.Loader; var ConfigType = { NONE: 0, COCOSTUDIO: 1 }; var __onParseConfig = function(type, str) { if (type === ConfigType.COCOSTUDIO) { ccs.triggerManager.parse(JSON.parse(str)); } }; var _windowTimeIntervalId = 0; var _windowTimeFunHash = {}; var WindowTimeFun = cc.Class.extend({ _code: null, _intervalId: 0, ctor: function (code) { this._intervalId = _windowTimeIntervalId++; this._code = code; }, fun: function () { if (!this._code) return; var code = this._code; if (typeof code == "string") { Function(code)(); } else if (typeof code == "function") { code.apply(null, this._args); } } }); /** * overwrite window's setTimeout @param {String|Function} code @param {number} delay @return {number} */ var setTimeout = function (code, delay) { var target = new WindowTimeFun(code); if (arguments.length > 2) target._args = Array.prototype.slice.call(arguments, 2); var original = target.fun; target.fun = function () { original.apply(this, arguments); clearTimeout(target._intervalId); } cc.director.getScheduler().schedule(target.fun, target, delay / 1000, 0, 0, false, target._intervalId+""); _windowTimeFunHash[target._intervalId] = target; return target._intervalId; }; /** * overwrite window's setInterval @param {String|Function} code @param {number} delay @return {number} */ var setInterval = function (code, delay) { var target = new WindowTimeFun(code); if (arguments.length > 2) target._args = Array.prototype.slice.call(arguments, 2); cc.director.getScheduler().schedule(target.fun, target, delay / 1000, cc.REPEAT_FOREVER, 0, false, target._intervalId+""); _windowTimeFunHash[target._intervalId] = target; return target._intervalId; }; /** * overwrite window's clearInterval @param {number} intervalId */ var clearInterval = function (intervalId) { var target = _windowTimeFunHash[intervalId]; if (target) { cc.director.getScheduler().unschedule(target._intervalId+"", target); delete _windowTimeFunHash[intervalId]; } }; var clearTimeout = clearInterval; // event listener type cc.EventListener.UNKNOWN = 0; cc.EventListener.TOUCH_ONE_BY_ONE = 1; cc.EventListener.TOUCH_ALL_AT_ONCE = 2; cc.EventListener.KEYBOARD = 3; cc.EventListener.MOUSE = 4; cc.EventListener.ACCELERATION = 5; cc.EventListener.FOCUS = 6; //game controller 7 cc.EventListener.CUSTOM = 8; cc.EventListener.create = function(argObj){ if(!argObj || !argObj.event){ throw "Invalid parameter."; } var listenerType = argObj.event; delete argObj.event; var listener = null; if(listenerType === cc.EventListener.TOUCH_ONE_BY_ONE) { listener = cc.EventListenerTouchOneByOne.create(); if (argObj.swallowTouches) { listener.setSwallowTouches(argObj.swallowTouches); } } else if(listenerType === cc.EventListener.TOUCH_ALL_AT_ONCE) listener = cc.EventListenerTouchAllAtOnce.create(); else if(listenerType === cc.EventListener.MOUSE) listener = cc.EventListenerMouse.create(); else if(listenerType === cc.EventListener.CUSTOM){ listener = cc.EventListenerCustom.create(argObj.eventName, argObj.callback); delete argObj.eventName; delete argObj.callback; } else if(listenerType === cc.EventListener.KEYBOARD) listener = cc.EventListenerKeyboard.create(); else if(listenerType === cc.EventListener.ACCELERATION){ listener = cc.EventListenerAcceleration.create(argObj.callback); delete argObj.callback; }else if(listenerType === cc.EventListener.FOCUS){ listener = cc.EventListenerFocus.create(); } else { cc.log("Error: Invalid listener type."); } for(var key in argObj) { // Temporary fix for EventMouse to support getDelta functions (doesn't exist in Cocos2d-x) if (key == "onMouseDown" || key == "onMouseMove") listener["_" + key] = argObj[key]; else listener[key] = argObj[key]; } return listener; }; // Event manager cc.eventManager.addListener = function(listener, nodeOrPriority) { if(!(listener instanceof cc.EventListener)) { listener = cc.EventListener.create(listener); } if (typeof nodeOrPriority == "number") { if (nodeOrPriority == 0) { cc.log("0 priority is forbidden for fixed priority since it's used for scene graph based priority."); return; } cc.eventManager.addEventListenerWithFixedPriority(listener, nodeOrPriority); } else { cc.eventManager.addEventListenerWithSceneGraphPriority(listener, nodeOrPriority); } return listener; }; cc.eventManager.dispatchCustomEvent = function (eventName, optionalUserData) { var ev = new cc.EventCustom(eventName); ev.setUserData(optionalUserData); this.dispatchEvent(ev); }; cc.EventCustom.prototype.setUserData = function(userData) { this._userData = userData; }; cc.EventCustom.prototype.getUserData = function() { return this._userData; }; cc.inputManager = { setAccelerometerEnabled: cc.Device.setAccelerometerEnabled, setAccelerometerInterval: cc.Device.setAccelerometerInterval, getDPI: cc.Device.getDPI }; cc.EventListenerTouchOneByOne.prototype.clone = function() { var ret = cc.EventListenerTouchOneByOne.create(); ret.onTouchBegan = this.onTouchBegan; ret.onTouchMoved = this.onTouchMoved; ret.onTouchEnded = this.onTouchEnded; ret.onTouchCancelled = this.onTouchCancelled; ret.setSwallowTouches(this.isSwallowTouches()); return ret; }; cc.EventListenerTouchAllAtOnce.prototype.clone = function() { var ret = cc.EventListenerTouchAllAtOnce.create(); ret.onTouchesBegan = this.onTouchesBegan; ret.onTouchesMoved = this.onTouchesMoved; ret.onTouchesEnded = this.onTouchesEnded; ret.onTouchesCancelled = this.onTouchesCancelled; return ret; }; cc.EventListenerKeyboard.prototype.clone = function() { var ret = cc.EventListenerKeyboard.create(); ret.onKeyPressed = this.onKeyPressed; ret.onKeyReleased = this.onKeyReleased; return ret; }; cc.EventListenerFocus.prototype.clone = function() { var ret = cc.EventListenerFocus.create(); ret.onFocusChanged = this.onFocusChanged; return ret; }; cc.EventListenerMouse.prototype.clone = function() { var ret = cc.EventListenerMouse.create(); ret._onMouseDown = this._onMouseDown; ret._onMouseMove = this._onMouseMove; ret.onMouseUp = this.onMouseUp; ret.onMouseScroll = this.onMouseScroll; return ret; }; cc.EventListenerMouse.prototype.onMouseMove = function(event) { if (!this._onMouseMove) return; event._listener = this; this._onMouseMove(event); this._previousX = event.getLocationX(); this._previousY = event.getLocationY(); }; cc.EventListenerMouse.prototype.onMouseDown = function(event) { if (!this._onMouseDown) return; event._listener = this; this._previousX = event.getLocationX(); this._previousY = event.getLocationY(); this._onMouseDown(event); }; cc.EventListenerKeyboard.prototype._onKeyPressed = function(keyCode, event) { if (!this.onKeyPressed) return; this.onKeyPressed(jsbKeyArr[keyCode], event); }; cc.EventListenerKeyboard.prototype._onKeyReleased = function(keyCode, event) { if (!this.onKeyReleased) return; this.onKeyReleased(jsbKeyArr[keyCode], event); }; cc.EventMouse.prototype.getLocation = function(){ return { x: this.getLocationX(), y: this.getLocationY() }; }; cc.EventMouse.prototype.getLocationInView = function() { return {x: this.getLocationX(), y: cc.view.getDesignResolutionSize().height - this.getLocationY()}; }; // Temporary fix for EventMouse to support getDelta functions (doesn't exist in Cocos2d-x) cc.EventMouse.prototype.getDelta = function(){ if (isNaN(this._listener._previousX)) { this._listener._previousX = this.getLocationX(); this._listener._previousY = this.getLocationY(); } return { x: this.getLocationX() - this._listener._previousX, y: this.getLocationY() - this._listener._previousY }; }; cc.EventMouse.prototype.getDeltaX = function(){ if (isNaN(this._listener._previousX)) { this._listener._previousX = this.getLocationX(); this._listener._previousY = this.getLocationY(); } return this.getLocationX() - this._listener._previousX; }; cc.EventMouse.prototype.getDeltaY = function(){ if (isNaN(this._listener._previousX)) { this._listener._previousX = this.getLocationX(); this._listener._previousY = this.getLocationY(); } return this.getLocationY() - this._listener._previousY; }; cc.Touch.prototype.getLocationX = function(){ return this.getLocation().x; }; cc.Touch.prototype.getLocationY = function(){ return this.getLocation().y; }; cc.Director.EVENT_PROJECTION_CHANGED = "director_projection_changed"; cc.Director.EVENT_AFTER_DRAW = "director_after_draw"; cc.Director.EVENT_AFTER_VISIT = "director_after_visit"; cc.Director.EVENT_BEFORE_UPDATE = "director_before_update"; cc.Director.EVENT_AFTER_UPDATE = "director_after_update"; cc.Director.EVENT_BEFORE_SCENE_LAUNCH = "director_before_scene_launch"; cc.Director.prototype.runScene = cc.Director.prototype.replaceScene; cc.visibleRect = { topLeft:cc.p(0,0), topRight:cc.p(0,0), top:cc.p(0,0), bottomLeft:cc.p(0,0), bottomRight:cc.p(0,0), bottom:cc.p(0,0), center:cc.p(0,0), left:cc.p(0,0), right:cc.p(0,0), width:0, height:0, init:function(){ var origin = cc.director.getVisibleOrigin(); var size = cc.director.getVisibleSize(); var w = this.width = size.width; var h = this.height = size.height; var l = origin.x, b = origin.y, t = b + h, r = l + w; //top this.topLeft.x = l; this.topLeft.y = t; this.topRight.x = r; this.topRight.y = t; this.top.x = l + w/2; this.top.y = t; //bottom this.bottomLeft.x = l; this.bottomLeft.y = b; this.bottomRight.x = r; this.bottomRight.y = b; this.bottom.x = l + w/2; this.bottom.y = b; //center this.center.x = l + w/2; this.center.y = b + h/2; //left this.left.x = l; this.left.y = b + h/2; //right this.right.x = r; this.right.y = b + h/2; } }; cc.visibleRect.init(); // Predefined font definition cc.FontDefinition = function () { this.fontName = "Arial"; this.fontSize = 12; this.textAlign = cc.TEXT_ALIGNMENT_CENTER; this.verticalAlign = cc.VERTICAL_TEXT_ALIGNMENT_TOP; this.fillStyle = cc.color(255, 255, 255, 255); this.boundingWidth = 0; this.boundingHeight = 0; this.strokeEnabled = false; this.strokeStyle = cc.color(255, 255, 255, 255); this.lineWidth = 1; this.shadowEnabled = false; this.shadowOffsetX = 0; this.shadowOffsetY = 0; this.shadowBlur = 0; this.shadowOpacity = 1.0; }; // Array utils /** * Verify Array's Type * @param {Array} arr * @param {function} type * @return {Boolean} * @function */ cc.arrayVerifyType = function (arr, type) { if (arr && arr.length > 0) { for (var i = 0; i < arr.length; i++) { if (!(arr[i] instanceof type)) { cc.log("element type is wrong!"); return false; } } } return true; }; /** * Searches for the first occurrence of object and removes it. If object is not found the function has no effect. * @function * @param {Array} arr Source Array * @param {*} delObj remove object */ cc.arrayRemoveObject = function (arr, delObj) { for (var i = 0, l = arr.length; i < l; i++) { if (arr[i] == delObj) { arr.splice(i, 1); break; } } }; /** * Removes from arr all values in minusArr. For each Value in minusArr, the first matching instance in arr will be removed. * @function * @param {Array} arr Source Array * @param {Array} minusArr minus Array */ cc.arrayRemoveArray = function (arr, minusArr) { for (var i = 0, l = minusArr.length; i < l; i++) { cc.arrayRemoveObject(arr, minusArr[i]); } }; /** * Inserts some objects at index * @function * @param {Array} arr * @param {Array} addObjs * @param {Number} index * @return {Array} */ cc.arrayAppendObjectsToIndex = function(arr, addObjs,index){ arr.splice.apply(arr, [index, 0].concat(addObjs)); return arr; }; /** * Copy an array's item to a new array (its performance is better than Array.slice) * @param {Array} arr * @returns {Array} */ cc.copyArray = function(arr){ var i, len = arr.length, arr_clone = new Array(len); for (i = 0; i < len; i += 1) arr_clone[i] = arr[i]; return arr_clone; }; // // DrawNode JS API Wrapper // cc.cardinalSplineAt = function (p0, p1, p2, p3, tension, t) { var t2 = t * t; var t3 = t2 * t; var s = (1 - tension) / 2; var b1 = s * ((-t3 + (2 * t2)) - t); // s(-t3 + 2 t2 - t)P1 var b2 = s * (-t3 + t2) + (2 * t3 - 3 * t2 + 1); // s(-t3 + t2)P2 + (2 t3 - 3 t2 + 1)P2 var b3 = s * (t3 - 2 * t2 + t) + (-2 * t3 + 3 * t2); // s(t3 - 2 t2 + t)P3 + (-2 t3 + 3 t2)P3 var b4 = s * (t3 - t2); // s(t3 - t2)P4 var x = (p0.x * b1 + p1.x * b2 + p2.x * b3 + p3.x * b4); var y = (p0.y * b1 + p1.y * b2 + p2.y * b3 + p3.y * b4); return cc.p(x, y); }; cc._DrawNode = cc.DrawNode; cc._DrawNode.prototype.drawPoly = function (verts, fillColor, borderWidth, borderColor) { cc._DrawNode.prototype.drawPolygon.call(this, verts, verts.length, fillColor, borderWidth, borderColor); } cc.DrawNode = cc._DrawNode.extend({ _drawColor: cc.color(255, 255, 255, 255), _lineWidth: 1, release: function () {}, setLineWidth: function (width) { this._lineWidth = width; }, getLineWidth: function () { return this._lineWidth; }, setDrawColor: function(color) { var locDrawColor = this._drawColor; locDrawColor.r = color.r; locDrawColor.g = color.g; locDrawColor.b = color.b; locDrawColor.a = (color.a == null) ? 255 : color.a; }, getDrawColor: function () { return cc.color(this._drawColor.r, this._drawColor.g, this._drawColor.b, this._drawColor.a); }, drawRect: function (origin, destination, fillColor, lineWidth, lineColor) { lineWidth = lineWidth || this._lineWidth; lineColor = lineColor || this._drawColor; var points = [origin, cc.p(origin.x, destination.y), destination, cc.p(destination.x, origin.y)]; if (fillColor) cc._DrawNode.prototype.drawPoly.call(this, points, fillColor, lineWidth, lineColor); else { points.push(origin); var drawSeg = cc._DrawNode.prototype.drawSegment; for (var i = 0, len = points.length; i < len - 1; i++) drawSeg.call(this, points[i], points[i + 1], lineWidth, lineColor); } }, drawCircle: function (center, radius, angle, segments, drawLineToCenter, lineWidth, color) { lineWidth = lineWidth || this._lineWidth; color = color || this._drawColor; if (color.a == null) color.a = 255; var coef = 2.0 * Math.PI / segments, vertices = [], i, len; for (i = 0; i <= segments; i++) { var rads = i * coef; var j = radius * Math.cos(rads + angle) + center.x; var k = radius * Math.sin(rads + angle) + center.y; vertices.push(cc.p(j, k)); } if (drawLineToCenter) vertices.push(cc.p(center.x, center.y)); lineWidth *= 0.5; var drawSeg = cc._DrawNode.prototype.drawSegment; for (i = 0, len = vertices.length; i < len - 1; i++) drawSeg.call(this, vertices[i], vertices[i + 1], lineWidth, color); }, drawQuadBezier: function (origin, control, destination, segments, lineWidth, color) { lineWidth = lineWidth || this._lineWidth; color = color || this._drawColor; cc._DrawNode.prototype.drawQuadBezier.call(this, origin, control, destination, segments, color); }, drawCubicBezier: function (origin, control1, control2, destination, segments, lineWidth, color) { lineWidth = lineWidth || this._lineWidth; color = color || this._drawColor; cc._DrawNode.prototype.drawCubicBezier.call(this, origin, control1, control2, destination, segments, color); }, drawCatmullRom: function (points, segments, lineWidth, color) { this.drawCardinalSpline(points, 0.5, segments, lineWidth, color); }, drawCardinalSpline: function (config, tension, segments, lineWidth, color) { lineWidth = lineWidth || this._lineWidth; color = color || this._drawColor; if (color.a == null) color.a = 255; var vertices = [], p, lt, deltaT = 1.0 / config.length, m1len = config.length - 1; for (var i = 0; i < segments + 1; i++) { var dt = i / segments; // border if (dt == 1) { p = m1len; lt = 1; } else { p = 0 | (dt / deltaT); lt = (dt - deltaT * p) / deltaT; } // Interpolate var newPos = cc.cardinalSplineAt( config[Math.min(m1len, Math.max(p - 1, 0))], config[Math.min(m1len, Math.max(p + 0, 0))], config[Math.min(m1len, Math.max(p + 1, 0))], config[Math.min(m1len, Math.max(p + 2, 0))], tension, lt); vertices.push(newPos); } lineWidth *= 0.5; var drawSeg = cc._DrawNode.prototype.drawSegment; for (var j = 0, len = vertices.length; j < len - 1; j++) drawSeg.call(this, vertices[j], vertices[j + 1], lineWidth, color); }, drawDot:function (pos, radius, color) { color = color || this._drawColor; cc._DrawNode.prototype.drawDot.call(this, pos, radius, color); }, drawSegment:function (from, to, lineWidth = this._lineWidth, color = this._drawColor) { cc._DrawNode.prototype.drawSegment.call(this, from, to, lineWidth, color); }, drawPoly:function (verts, fillColor, borderWidth, borderColor) { borderColor = borderColor || this._drawColor; if (fillColor) cc._DrawNode.prototype.drawPoly.call(this, verts, fillColor, borderWidth, borderColor); else { verts.push(verts[0]); var drawSeg = cc._DrawNode.prototype.drawSegment; for (var i = 0, len = verts.length; i < len - 1; i++) drawSeg.call(this, verts[i], verts[i + 1], borderWidth, borderColor); } } }); cc.DrawNode.create = function () { return new cc.DrawNode(); }; // // TMX classes JS API Wrapper // cc.TMXTiledMap.prototype.allLayers = function(){ var retArr = [], locChildren = this.getChildren(), length = locChildren.length; for(var i = 0; i< length; i++){ var layer = locChildren[i]; if(layer && layer instanceof cc.TMXLayer) retArr.push(layer); } return retArr; }; cc.TMXLayer.prototype._getTileAt = cc.TMXLayer.prototype.getTileAt; cc.TMXLayer.prototype.getTileAt = function(x, y){ var pos = y !== undefined ? cc.p(x, y) : x; return this._getTileAt(pos); }; cc.TMXLayer.prototype._getTileGIDAt = cc.TMXLayer.prototype.getTileGIDAt; cc.TMXLayer.prototype.getTileGIDAt = function(x, y){ var pos = y !== undefined ? cc.p(x, y) : x; return this._getTileGIDAt(pos); }; cc.TMXLayer.prototype._setTileGID = cc.TMXLayer.prototype.setTileGID; cc.TMXLayer.prototype.setTileGID = function(gid, posOrX, flagsOrY, flags){ var pos; if (flags !== undefined) { pos = cc.p(posOrX, flagsOrY); this._setTileGID(gid, pos, flags); } else if(flagsOrY != undefined){ pos = posOrX; flags = flagsOrY; this._setTileGID(gid, pos, flags); } else { this._setTileGID(gid, posOrX); } }; cc.TMXLayer.prototype._removeTileAt = cc.TMXLayer.prototype.removeTileAt; cc.TMXLayer.prototype.removeTileAt = function(x, y){ var pos = y !== undefined ? cc.p(x, y) : x; this._removeTileAt(pos); }; cc.TMXLayer.prototype._getPositionAt = cc.TMXLayer.prototype.getPositonAt; cc.TMXLayer.prototype.getPositonAt = function(x, y){ var pos = y !== undefined ? cc.p(x, y) : x; return this._getPositionAt(pos); }; // // setBlendFunc JS API Wrapper // var protoHasBlend = [cc.AtlasNode.prototype, cc.DrawNode.prototype, cc.LabelTTF.prototype, cc.SpriteBatchNode.prototype, cc.LabelBMFont.prototype, cc.LayerColor.prototype, cc.MotionStreak.prototype, cc.Sprite.prototype, cc.ParticleBatchNode.prototype, cc.ParticleSystem.prototype]; var templateSetBlendFunc = function(src, dst) { var blendf; if (dst === undefined) blendf = src; else blendf = {src: src, dst: dst}; this._setBlendFunc(blendf); }; for (var i = 0, l = protoHasBlend.length; i < l; i++) { var proto = protoHasBlend[i]; proto._setBlendFunc = proto.setBlendFunc; proto.setBlendFunc = templateSetBlendFunc; } // // Ease actions JS API Wrapper // var easeActions = { easeIn : 0, easeOut : 1, easeInOut : 2, easeExponentialIn : 3, easeExponentialOut : 4, easeExponentialInOut : 5, easeSineIn : 6, easeSineOut : 7, easeSineInOut : 8, easeElasticIn : 9, easeElasticOut : 10, easeElasticInOut : 11, easeBounceIn : 12, easeBounceOut : 13, easeBounceInOut : 14, easeBackIn : 15, easeBackOut : 16, easeBackInOut : 17, easeBezierAction : 18, easeQuadraticActionIn : 19, easeQuadraticActionOut : 20, easeQuadraticActionInOut : 21, easeQuarticActionIn : 22, easeQuarticActionOut : 23, easeQuarticActionInOut : 24, easeQuinticActionIn : 25, easeQuinticActionOut : 26, easeQuinticActionInOut : 27, easeCircleActionIn : 28, easeCircleActionOut : 29, easeCircleActionInOut : 30, easeCubicActionIn : 31, easeCubicActionOut : 32, easeCubicActionInOut : 33 }; function templateEaseActions(actionTag) { return function(param, param2, param3, param4) { return {tag: actionTag, param: param, param2: param2, param3: param3, param4: param4}; } } for (var a in easeActions) { var actionTag = easeActions[a]; cc[a] = templateEaseActions(actionTag); } // Action2d cc.action = cc.Action.create; cc.speed = cc.Speed.create; cc.follow = cc.Follow.create; cc.orbitCamera = cc.OrbitCamera.create; cc.cardinalSplineTo = cc.CardinalSplineTo.create; cc.cardinalSplineBy = cc.CardinalSplineBy.create; cc.catmullRomTo = cc.CatmullRomTo.create; cc.catmullRomBy = cc.CatmullRomBy.create; cc.show = cc.Show.create; cc.hide = cc.Hide.create; cc.toggleVisibility = cc.ToggleVisibility.create; cc.removeSelf = cc.RemoveSelf.create; cc.flipX = cc.FlipX.create; cc.flipY = cc.FlipY.create; // cc.place = cc.Place.create; cc.callFunc = cc.CallFunc.create; cc.actionInterval = cc.ActionInterval.create; cc.sequence = cc.Sequence.create; cc.repeat = cc.Repeat.create; cc.repeatForever = cc.RepeatForever.create; cc.spawn = cc.Spawn.create; cc.rotateTo = cc.RotateTo.create; cc.rotateBy = cc.RotateBy.create; //cc.moveBy = cc.MoveBy.create; //cc.moveTo = cc.MoveTo.create; cc.skewTo = cc.SkewTo.create; cc.skewBy = cc.SkewBy.create; //cc.jumpBy = cc.JumpBy.create; //cc.jumpTo = cc.JumpTo.create; cc.bezierBy = cc.BezierBy.create; cc.bezierTo = cc.BezierTo.create; cc.scaleTo = cc.ScaleTo.create; cc.scaleBy = cc.ScaleBy.create; cc.blink = cc.Blink.create; cc.fadeTo = cc.FadeTo.create; cc.fadeIn = cc.FadeIn.create; cc.fadeOut = cc.FadeOut.create; cc.tintTo = cc.TintTo.create; cc.tintBy = cc.TintBy.create; cc.delayTime = cc.DelayTime.create; cc.reverseTime = cc.ReverseTime.create; cc.animate = cc.Animate.create; cc.targetedAction = cc.TargetedAction.create; cc.actionTween = cc.ActionTween.create; cc.Place._create = cc.Place.create; cc.place = cc.Place.create = function(posOrX, y){ if (undefined === y){ return cc.Place._create(posOrX); }else{ return cc.Place._create(cc.p(posOrX, y)); } }; cc.MoveTo._create = cc.MoveTo.create; cc.moveTo = cc.MoveTo.create = function(duration, posOrX, y){ if (undefined === y){ return cc.MoveTo._create(duration, posOrX); }else{ return cc.MoveTo._create(duration, cc.p(posOrX, y)); } }; cc.MoveBy._create = cc.MoveBy.create; cc.moveBy = cc.MoveBy.create = function(duration, posOrX, y){ if (undefined === y){ return cc.MoveBy._create(duration, posOrX); }else{ return cc.MoveBy._create(duration, cc.p(posOrX, y)); } }; cc.JumpTo._create = cc.JumpTo.create; cc.jumpTo = cc.JumpTo.create = function(duration, position, y, height, jumps){ if (undefined === jumps){ jumps = height; height = y; return cc.JumpTo._create(duration, position, height, jumps); }else{ return cc.JumpTo._create(duration, cc.p(position, y), height, jumps); } }; cc.JumpBy._create = cc.JumpBy.create; cc.jumpBy = cc.JumpBy.create = function(duration, position, y, height, jumps){ if (undefined === jumps){ jumps = height; height = y; return cc.JumpBy._create(duration, position, height, jumps); }else{ return cc.JumpBy._create(duration, cc.p(position, y), height, jumps); } }; // Actions3d cc.gridAction = cc.GridAction.create; cc.grid3DAction = cc.Grid3DAction.create; cc.tiledGrid3DAction = cc.TiledGrid3DAction.create; cc.stopGrid = cc.StopGrid.create; cc.reuseGrid = cc.ReuseGrid.create; cc.waves3D = cc.Waves3D.create; cc.flipX3D = cc.FlipX3D.create; cc.flipY3D = cc.FlipY3D.create; cc.lens3D = cc.Lens3D.create; cc.ripple3D = cc.Ripple3D.create; cc.shaky3D = cc.Shaky3D.create; cc.liquid = cc.Liquid.create; cc.waves = cc.Waves.create; cc.twirl = cc.Twirl.create; cc.pageTurn3D = cc.PageTurn3D.create; cc.shakyTiles3D = cc.ShakyTiles3D.create; cc.shatteredTiles3D = cc.ShatteredTiles3D.create; cc.shuffleTiles = cc.ShuffleTiles.create; cc.fadeOutTRTiles = cc.FadeOutTRTiles.create; cc.fadeOutBLTiles = cc.FadeOutBLTiles.create; cc.fadeOutUpTiles = cc.FadeOutUpTiles.create; cc.fadeOutDownTiles = cc.FadeOutDownTiles.create; cc.turnOffTiles = cc.TurnOffTiles.create; cc.wavesTiles3D = cc.WavesTiles3D.create; cc.jumpTiles3D = cc.JumpTiles3D.create; cc.splitRows = cc.SplitRows.create; cc.splitCols = cc.SplitCols.create; cc.progressTo = cc.ProgressTo.create; cc.progressFromTo = cc.ProgressFromTo.create; // Speed functions cc.Speed.prototype.speed = cc.ActionInterval.prototype.speed = function(speed) { // if (speed < 0) { // cc.warn("cc.ActionInterval#speed : Speed must not be negative"); // return; // } var action = this, found = false; while (action.getInnerAction && !found) { if (action instanceof cc.Speed) { found = true; } else { action = action.getInnerAction(); } } if (found) { speed = speed * action._getSpeed(); action._setSpeed(speed); } else { this._speed(speed); } return this; }; cc.Speed.prototype.setSpeed = cc.ActionInterval.prototype.setSpeed = function(speed) { // if (speed < 0) { // cc.warn("cc.ActionInterval#setSpeed : Speed must not be negative"); // return; // } var action = this, found = false; while (action.getInnerAction && !found) { if (action instanceof cc.Speed) { found = true; } else { action = action.getInnerAction(); } } if (found) { action._setSpeed(speed); } else { this._speed(speed); } }; cc.Speed.prototype.getSpeed = cc.ActionInterval.prototype.getSpeed = function() { var action = this, found = false; while (action.getInnerAction && !found) { if (action instanceof cc.Speed) { found = true; } else { action = action.getInnerAction(); } } if (found) { return action._getSpeed(); } else { return 1; } }; // //AffineTransform API // /** * @memberOf cc * @function * @param {Number} a * @param {Number} b * @param {Number} c * @param {Number} d * @param {Number} tx * @param {Number} ty */ cc.AffineTransform = function (a, b, c, d, tx, ty) { this.a = a; this.b = b; this.c = c; this.d = d; this.tx = tx; this.ty = ty; }; /** * @memberOf cc * @function * @param {Number} a * @param {Number} b * @param {Number} c * @param {Number} d * @param {Number} tx * @param {Number} ty * @return {cc.AffineTransform} * Constructor */ cc.affineTransformMake = function (a, b, c, d, tx, ty) { return {a: a, b: b, c: c, d: d, tx: tx, ty: ty}; }; /** * @memberOf cc * @function * @param {cc.Point} point * @param {cc.AffineTransform} t * @return {cc.Point} * Constructor */ cc.pointApplyAffineTransform = function (point, t) { return {x: t.a * point.x + t.c * point.y + t.tx, y: t.b * point.x + t.d * point.y + t.ty}; }; cc._pointApplyAffineTransform = function (x, y, t) { return {x: t.a * x + t.c * y + t.tx, y: t.b * x + t.d * y + t.ty}; }; /** * @memberOf cc * @function * @param {cc.Size} size * @param {cc.AffineTransform} t * @return {cc.Size} * Constructor */ cc.sizeApplyAffineTransform = function (size, t) { return {width: t.a * size.width + t.c * size.height, height: t.b * size.width + t.d * size.height}; }; /** * @memberOf cc * @function * @return {cc.AffineTransform} * Constructor */ cc.affineTransformMakeIdentity = function () { return {a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0}; }; /** * @memberOf cc * @function * @return {cc.AffineTransform} * Constructor */ cc.affineTransformIdentity = function () { return {a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0}; }; /** * @memberOf cc * @function * @param {cc.Rect} rect * @param {cc.AffineTransform} anAffineTransform * @return {cc.Rect} * Constructor */ cc.rectApplyAffineTransform = function (rect, anAffineTransform) { var top = cc.rectGetMinY(rect); var left = cc.rectGetMinX(rect); var right = cc.rectGetMaxX(rect); var bottom = cc.rectGetMaxY(rect); var topLeft = cc._pointApplyAffineTransform(left, top, anAffineTransform); var topRight = cc._pointApplyAffineTransform(right, top, anAffineTransform); var bottomLeft = cc._pointApplyAffineTransform(left, bottom, anAffineTransform); var bottomRight = cc._pointApplyAffineTransform(right, bottom, anAffineTransform); var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x); var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x); var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y); var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y); return cc.rect(minX, minY, (maxX - minX), (maxY - minY)); }; cc._rectApplyAffineTransformIn = function(rect, anAffineTransform){ var top = cc.rectGetMinY(rect); var left = cc.rectGetMinX(rect); var right = cc.rectGetMaxX(rect); var bottom = cc.rectGetMaxY(rect); var topLeft = cc._pointApplyAffineTransform(left, top, anAffineTransform); var topRight = cc._pointApplyAffineTransform(right, top, anAffineTransform); var bottomLeft = cc._pointApplyAffineTransform(left, bottom, anAffineTransform); var bottomRight = cc._pointApplyAffineTransform(right, bottom, anAffineTransform); var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x); var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x); var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y); var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y); rect.x = minX; rect.y = minY; rect.width = maxX - minX; rect.height = maxY - minY; return rect; }; /** * @memberOf cc * @function * @param {cc.AffineTransform} t * @param {Number} tx * @param {Number}ty * @return {cc.AffineTransform} * Constructor */ cc.affineTransformTranslate = function (t, tx, ty) { return { a: t.a, b: t.b, c: t.c, d: t.d, tx: t.tx + t.a * tx + t.c * ty, ty: t.ty + t.b * tx + t.d * ty }; }; /** * @memberOf cc * @function * @param {cc.AffineTransform} t * @param {Number} sx * @param {Number} sy * @return {cc.AffineTransform} * Constructor */ cc.affineTransformScale = function (t, sx, sy) { return {a: t.a * sx, b: t.b * sx, c: t.c * sy, d: t.d * sy, tx: t.tx, ty: t.ty}; }; /** * @memberOf cc * @function * @param {cc.AffineTransform} aTransform * @param {Number} anAngle * @return {cc.AffineTransform} * Constructor */ cc.affineTransformRotate = function (aTransform, anAngle) { var fSin = Math.sin(anAngle); var fCos = Math.cos(anAngle); return {a: aTransform.a * fCos + aTransform.c * fSin, b: aTransform.b * fCos + aTransform.d * fSin, c: aTransform.c * fCos - aTransform.a * fSin, d: aTransform.d * fCos - aTransform.b * fSin, tx: aTransform.tx, ty: aTransform.ty}; }; /** * Concatenate `t2' to `t1' and return the result:
* t' = t1 * t2 * @memberOf cc * @function * @param {cc.AffineTransform} t1 * @param {cc.AffineTransform} t2 * @return {cc.AffineTransform} * Constructor */ cc.affineTransformConcat = function (t1, t2) { return {a: t1.a * t2.a + t1.b * t2.c, //a b: t1.a * t2.b + t1.b * t2.d, //b c: t1.c * t2.a + t1.d * t2.c, //c d: t1.c * t2.b + t1.d * t2.d, //d tx: t1.tx * t2.a + t1.ty * t2.c + t2.tx, //tx ty: t1.tx * t2.b + t1.ty * t2.d + t2.ty}; //ty }; /** * Concatenate a transform matrix to another
* The results are reflected in the first matrix.
* t' = t1 * t2 * @function * @param {cc.AffineTransform} t1 The first transform object * @param {cc.AffineTransform} t2 The transform object to concatenate * @return {cc.AffineTransform} The result of concatenation */ cc.affineTransformConcatIn = function (t1, t2) { var a = t1.a, b = t1.b, c = t1.c, d = t1.d, tx = t1.tx, ty = t1.ty; t1.a = a * t2.a + b * t2.c; t1.b = a * t2.b + b * t2.d; t1.c = c * t2.a + d * t2.c; t1.d = c * t2.b + d * t2.d; t1.tx = tx * t2.a + ty * t2.c + t2.tx; t1.ty = tx * t2.b + ty * t2.d + t2.ty; return t1; }; /** * Return true if `t1' and `t2' are equal, false otherwise. * @memberOf cc * @function * @param {cc.AffineTransform} t1 * @param {cc.AffineTransform} t2 * @return {Boolean} * Constructor */ cc.affineTransformEqualToTransform = function (t1, t2) { return ((t1.a === t2.a) && (t1.b === t2.b) && (t1.c === t2.c) && (t1.d === t2.d) && (t1.tx === t2.tx) && (t1.ty === t2.ty)); }; /** * Get the invert value of an AffineTransform object * @memberOf cc * @function * @param {cc.AffineTransform} t * @return {cc.AffineTransform} * Constructor */ cc.affineTransformInvert = function (t) { var determinant = 1 / (t.a * t.d - t.b * t.c); return {a: determinant * t.d, b: -determinant * t.b, c: -determinant * t.c, d: determinant * t.a, tx: determinant * (t.c * t.ty - t.d * t.tx), ty: determinant * (t.b * t.tx - t.a * t.ty)}; }; // // Node API // cc.Node.prototype.setUserData = function (data) { this.userData = data; }; cc.Node.prototype.getUserData = function () { return this.userData; }; //for compatibility with html5 cc.Node.prototype._setNormalizedPosition = cc.Node.prototype.setNormalizedPosition; cc.Node.prototype.setNormalizedPosition = function(pos, y){ if(y === undefined) cc.Node.prototype._setNormalizedPosition.call(this, pos); else cc.Node.prototype._setNormalizedPosition.call(this, cc.p(pos, y)); }; /** returns a "world" axis aligned bounding box of the node.
* @return {cc.Rect} */ cc.Node.prototype.getBoundingBoxToWorld = function () { var contentSize = this.getContentSize(); var rect = cc.rect(0, 0, contentSize.width, contentSize.height); var trans = this.getNodeToWorldTransform(); rect = cc.rectApplyAffineTransform(rect, trans); //query child's BoundingBox if (!this.getChildren()) return rect; var locChildren = this.getChildren(); for (var i = 0; i < locChildren.length; i++) { var child = locChildren[i]; if (child && child.isVisible()) { var childRect = child._getBoundingBoxToCurrentNode(trans); if (childRect) rect = cc.rectUnion(rect, childRect); } } return rect; }; cc.Node.prototype._getBoundingBoxToCurrentNode = function (parentTransform) { var contentSize = this.getContentSize(); var rect = cc.rect(0, 0, contentSize.width, contentSize.height); var _trans = this.getNodeToParentTransform(); var trans = (parentTransform == null) ? _trans : cc.affineTransformConcat(_trans, parentTransform); rect = cc.rectApplyAffineTransform(rect, trans); //query child's BoundingBox if (!this.getChildren()) return rect; var locChildren = this.getChildren(); for (var i = 0; i < locChildren.length; i++) { var child = locChildren[i]; if (child && child.isVisible()) { var childRect = child._getBoundingBoxToCurrentNode(trans); if (childRect) rect = cc.rectUnion(rect, childRect); } } return rect; }; // // cc.Layer bake/unbake/isBaked // cc.Layer.prototype.bake = cc.Layer.prototype.unbake = function() {}; cc.Layer.prototype.isBaked = function() {return false;}; // // RenderTexture beginWithClear // cc.RenderTexture.prototype._beginWithClear = cc.RenderTexture.prototype.beginWithClear; cc.RenderTexture.prototype.beginWithClear = function(r, g, b, a, depthValue, stencilValue) { r /= 255; g /= 255; b /= 255; a /= 255; this._beginWithClear(r, g, b, a, depthValue, stencilValue); }; cc.RenderTexture.prototype._clear = cc.RenderTexture.prototype.clear; cc.RenderTexture.prototype.clear = function(r, g, b, a) { r /= 255; g /= 255; b /= 255; a /= 255; this._clear(r, g, b, a); }; // // Texture2D setTexParameters // cc.Texture2D.prototype._setTexParameters = cc.Texture2D.prototype.setTexParameters; cc.Texture2D.prototype.setTexParameters = function (texParams, magFilter, wrapS, wrapT) { var minFilter; if (magFilter === undefined) { minFilter = texParams.minFilter; magFilter = texParams.magFilter; wrapS = texParams.wrapS; wrapT = texParams.wrapT; } else minFilter = texParams; this._setTexParameters(minFilter, magFilter, wrapS, wrapT); }; cc.Texture2D.prototype.handleLoadedTexture = function (premultiplied) {}; // // MenuItem setCallback support target // cc.MenuItem.prototype._setCallback = cc.MenuItem.prototype.setCallback; cc.MenuItem.prototype.setCallback = function (callback, target) { this._setCallback(callback.bind(target)); }; // // MenuItemImage support sprite frame name as parameter // var _p = cc.MenuItemImage.prototype; _p._setNormalSpriteFrame = _p.setNormalSpriteFrame; _p._setSelectedSpriteFrame = _p.setSelectedSpriteFrame; _p._setDisabledSpriteFrame = _p.setDisabledSpriteFrame; _p.setNormalSpriteFrame = function(frame) { if (frame[0] == "#") frame = cc.spriteFrameCache.getSpriteFrame(frame.substr(1)); this._setNormalSpriteFrame(frame); }; _p.setSelectedSpriteFrame = function(frame) { if (frame[0] == "#") frame = cc.spriteFrameCache.getSpriteFrame(frame.substr(1)); this._setSelectedSpriteFrame(frame); }; _p.setDisabledSpriteFrame = function(frame) { if (frame[0] == "#") frame = cc.spriteFrameCache.getSpriteFrame(frame.substr(1)); this._setDisabledSpriteFrame(frame); }; cc.MenuItemToggle.prototype.selectedItem = cc.MenuItemToggle.prototype.getSelectedItem; // playMusic searchPaths if (cc.sys.os === cc.sys.OS_ANDROID && cc.audioEngine) { cc.audioEngine._playMusic = cc.audioEngine.playMusic; cc.audioEngine.playMusic = function () { var args = arguments; var searchPaths = jsb.fileUtils.getSearchPaths(); var path = args[0]; searchPaths.some(function (item) { var temp = item + '/' + path; var exists = jsb.fileUtils.isFileExist(temp); if (exists) { path = temp; return true; } }); args[0] = path; cc.audioEngine._playMusic.apply(cc.audioEngine, args); }; } // // LabelTTF API wrappers // cc.LabelTTF.prototype._setDimensions = cc.LabelTTF.prototype.setDimensions; cc.LabelTTF.prototype.setDimensions = function (dim, height) { if (!isNaN(height)) { dim = {width: dim, height: height}; } this._setDimensions(dim); }; cc.LabelTTF.prototype._enableShadow = cc.LabelTTF.prototype.enableShadow; cc.LabelTTF.prototype.enableShadow = function (shadowColor, offset, blurRadius) { var opacity = 1; this._enableShadow(offset, opacity, blurRadius); }; cc.LabelTTF.prototype.setDrawMode = function () {}; // // Label overflow // cc.Label.Overflow = { NONE: 0, CLAMP: 1, SHRINK: 2, RESIZE_HEIGHT: 3 }; // // Label adaptation to LabelTTF/LabelBMFont/LabelAtlas // _p = cc.Label.prototype; _p.enableStroke = _p.enableOutline; _p.setBoundingWidth = _p.setWidth; _p.setBoundingHeight = _p.setHeight; // // cc.Scheduler scheduleCallbackForTarget // _p = cc.Scheduler.prototype; _p.unscheduleUpdateForTarget = _p.unscheduleUpdate; _p.unscheduleAllCallbacksForTarget = function (target) { this.unschedule(target.__instanceId + "", target); }; _p._schedule = _p.schedule; _p.schedule = function (callback, target, interval, repeat, delay, paused, key) { var isSelector = false; if(typeof callback !== "function"){ var selector = callback; isSelector = true; } if(isSelector === false){ //callback, target, interval, repeat, delay, paused, key //callback, target, interval, paused, key if(arguments.length === 4 || arguments.length === 5) { key = delay; paused = repeat; delay = 0; repeat = cc.REPEAT_FOREVER; } }else{ //selector, target, interval, repeat, delay, paused //selector, target, interval, paused if(arguments.length === 4){ paused = repeat; repeat = cc.REPEAT_FOREVER; delay = 0; } } if (key === undefined) { key = target.__instanceId + ""; } this._schedule(callback, target, interval, repeat, delay, paused, key); }; cc._NodeGrid = cc.NodeGrid; cc.NodeGrid = function(rect){ if (!(this instanceof cc.NodeGrid)){ cc.error("NodeGrid's constructor can not be called as a function, please use 'new cc.NodeGrid()'"); return; } if (rect) { return cc._NodeGrid.create(rect); } else { return cc._NodeGrid.create(); } } cc.NodeGrid.create = function(rect){ if (rect) { return cc._NodeGrid.create(rect); } else { return cc._NodeGrid.create(); } } // // cc.BlendFunc // /** * Blend Function used for textures * @Class cc.BlendFunc * @Constructor * @param {Number} src1 source blend function * @param {Number} dst1 destination blend function */ cc.BlendFunc = function (src1, dst1) { this.src = src1; this.dst = dst1; }; cc.BlendFunc._disable = function(){ return new cc.BlendFunc(cc.ONE, cc.ZERO); }; cc.BlendFunc._alphaPremultiplied = function(){ return new cc.BlendFunc(cc.ONE, cc.ONE_MINUS_SRC_ALPHA); }; cc.BlendFunc._alphaNonPremultiplied = function(){ return new cc.BlendFunc(cc.SRC_ALPHA, cc.ONE_MINUS_SRC_ALPHA); }; cc.BlendFunc._additive = function(){ return new cc.BlendFunc(cc.SRC_ALPHA, cc.ONE); }; /** @expose */ cc.BlendFunc.DISABLE; cc.defineGetterSetter(cc.BlendFunc, "DISABLE", cc.BlendFunc._disable); /** @expose */ cc.BlendFunc.ALPHA_PREMULTIPLIED; cc.defineGetterSetter(cc.BlendFunc, "ALPHA_PREMULTIPLIED", cc.BlendFunc._alphaPremultiplied); /** @expose */ cc.BlendFunc.ALPHA_NON_PREMULTIPLIED; cc.defineGetterSetter(cc.BlendFunc, "ALPHA_NON_PREMULTIPLIED", cc.BlendFunc._alphaNonPremultiplied); /** @expose */ cc.BlendFunc.ADDITIVE; cc.defineGetterSetter(cc.BlendFunc, "ADDITIVE", cc.BlendFunc._additive); cc.GLProgram.prototype.setUniformLocationWithMatrix2fv = function(){ var tempArray = Array.prototype.slice.call(arguments); tempArray = Array.prototype.concat.call(tempArray, 2); this.setUniformLocationWithMatrixfvUnion.apply(this, tempArray); }; cc.GLProgram.prototype.setUniformLocationWithMatrix3fv = function(){ var tempArray = Array.prototype.slice.call(arguments); tempArray = Array.prototype.concat.call(tempArray, 3); this.setUniformLocationWithMatrixfvUnion.apply(this, tempArray); }; cc.GLProgram.prototype.setUniformLocationWithMatrix4fv = function(){ var tempArray = Array.prototype.slice.call(arguments); tempArray = Array.prototype.concat.call(tempArray, 4); this.setUniformLocationWithMatrixfvUnion.apply(this, tempArray); }; var jsbSetUniformCallback = cc.GLProgramState.prototype.setUniformCallback; cc.GLProgramState.prototype.setUniformCallback = function (uniform, callback) { jsbSetUniformCallback.call(this, uniform, callback); }; // // Script Component // cc._ComponentJS = cc.ComponentJS; cc._ComponentJS.extend = cc.Class.extend; cc.ComponentJS = function (filename) { var comp = cc._ComponentJS.create(filename); var res = comp.getScriptObject(); return res; }; cc.ComponentJS.extend = function (prop) { return cc._ComponentJS.extend(prop); }; // // 3D module rename to jsb namespace // jsb.BaseLight = cc.BaseLight; delete cc.BaseLight; jsb.DirectionLight = cc.DirectionLight; delete cc.DirectionLight; jsb.PointLight = cc.PointLight; delete cc.PointLight; jsb.SpotLight = cc.SpotLight; delete cc.SpotLight; jsb.AmbientLight = cc.AmbientLight; delete cc.AmbientLight;