require('jshelper/jsb_constants_gl.js'); // cocos2d Helper cc.c3 = cc.c3 || function (r, g, b) { return {r: r, g: g, b: b}; }; cc.c3b = cc.c3; cc.c4 = cc.c4 || function (r, g, b, o) { return {r: r, g: g, b: b, a: o}; }; cc.c4b = cc.c4; cc.c4f = cc.c4f || function (r, g, b, o) { return {r: r, g: g, b: b, a: o}; }; cc.p = cc.p || function( x, y ) { return {x:x, y:y}; }; cc.g = cc.g || cc.p; cc.log = cc.log || log; // // cocos2d constants // cc.TEXTURE_PIXELFORMAT_RGBA8888 = 0; cc.TEXTURE_PIXELFORMAT_RGB888 = 1; cc.TEXTURE_PIXELFORMAT_RGB565 = 2; cc.TEXTURE_PIXELFORMAT_A8 = 3; cc.TEXTURE_PIXELFORMAT_I8 = 4; cc.TEXTURE_PIXELFORMAT_AI88 = 5; cc.TEXTURE_PIXELFORMAT_RGBA4444 = 6; cc.TEXTURE_PIXELFORMAT_RGB5A1 = 7; cc.TEXTURE_PIXELFORMAT_PVRTC4 = 8; cc.TEXTURE_PIXELFORMAT_PVRTC4 = 9; cc.TEXTURE_PIXELFORMAT_DEFAULT = cc.TEXTURE_PIXELFORMAT_RGBA8888; cc.TEXT_ALIGNMENT_LEFT = 0; cc.TEXT_ALIGNMENT_CENTER = 1; cc.TEXT_ALIGNMENT_RIGHT = 2; cc.VERTICAL_TEXT_ALIGNMENT_TOP = 0; cc.VERTICAL_TEXT_ALIGNMENT_CENTER = 1; cc.VERTICAL_TEXT_ALIGNMENT_BOTTOM = 2; cc.IMAGE_FORMAT_JPEG = 0; cc.IMAGE_FORMAT_PNG = 0; cc.PROGRESS_TIMER_TYPE_RADIAL = 0; cc.PROGRESS_TIMER_TYPE_BAR = 1; cc.PARTICLE_TYPE_FREE = 0; cc.PARTICLE_TYPE_RELATIVE = 1; cc.PARTICLE_TYPE_GROUPED = 2; cc.PARTICLE_DURATION_INFINITY = -1; cc.PARTICLE_MODE_GRAVITY = 0; cc.PARTICLE_MODE_RADIUS = 1; cc.PARTICLE_START_SIZE_EQUAL_TO_END_SIZE = -1; cc.PARTICLE_START_RADIUS_EQUAL_TO_END_RADIUS = -1; cc.RED = cc.c3(255,0,0); cc.GREEN = cc.c3(0,255,0); cc.BLUE = cc.c3(0,0,255); cc.BLACK = cc.c3(0,0,0); cc.WHITE = cc.c3(255,255,255); cc.POINT_ZERO = {x:0, y:0}; cc._reuse_p0 = {x:0, y:0}; cc._reuse_p1 = {x:0, y:0}; cc._reuse_p_index = 0; cc._reuse_color3b = cc.c3(255, 255, 255 ); cc._reuse_color4b = cc.c4(255, 255, 255, 255 ); cc._reuse_grid = cc.g(0,0); // dump config info, but only in debug mode cc.dumpConfig = function() { if( cc.config.debug ) { for(var i in cc.config) cc.log( i + " = " + cc.config[i] ); } }; // // Point // cc._p = function( x, y ) { if( cc._reuse_p_index === 0 ) { cc._reuse_p0.x = x; cc._reuse_p0.y = y; cc._reuse_p_index = 1; return cc._reuse_p0; } else { cc._reuse_p1.x = x; cc._reuse_p1.y = y; cc._reuse_p_index = 0; return cc._reuse_p1; } }; cc._to_p = function( point ) { return point; }; cc._from_p = function( size ) { return size; }; // // Grid // cc._g = function( x, y ) { cc._reuse_grid.x = x; cc._reuse_grid.y = y; return cc._reuse_grid; } // // Color // // // Color 3B // cc.c3b = function( r, g, b ) { return {r:r, g:g, b:b }; }; cc._c3b = function( r, g, b ) { cc._reuse_color3b.r = r; cc._reuse_color3b.g = g; cc._reuse_color3b.b = b; return cc._reuse_color3b; }; // compatibility cc.c3 = cc.c3b; cc._c3 = cc._c3b; // // Color 4B // cc.c4b = function( r, g, b, a ) { return {r:r, g:g, b:b, a:a }; }; cc._c4b = function( r, g, b, a ) { cc._reuse_color4b.r = r; cc._reuse_color4b.g = g; cc._reuse_color4b.b = b; cc._reuse_color4b.a = a; return cc._reuse_color4b; }; // compatibility cc.c4 = cc.c4b; cc._c4 = cc._c4b; // // Size // cc.size = function(w,h) { return {width:w, height:h}; } cc._to_size = function( size ) { return size; } cc._from_size = function( size ) { return size; } // // Rect // cc.rect = function(x,y,w,h) { return {x:x, y:y, width:w, height:h}; } cc._to_rect = function( rect ) { return rect; } cc._from_rect = function( rect ) { return rect; } // XXX Should be done in native 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; } // point functions cc.pAdd = cc.pAdd || function (p1, p2) { return {x: p1.x + p2.x, y: p1.y + p2.y}; }; cc.pSub = cc.pSub || function (p1, p2) { return {x: p1.x - p2.x, y: p1.y - p2.y}; } cc.pMult = cc.pMult || function (p1, s) { return {x: p1.x * s, y: p1.y * s}; }; /** * Calculates dot product of two points. * @param {cc.Point} v1 * @param {cc.Point} v2 * @return {Number} */ cc.pDot = function (v1, v2) { return v1.x * v2.x + v1.y * v2.y; }; /** * Calculates the square length of a cc.Point (not calling sqrt() ) * @param {cc.Point} v *@return {cc.pDot} */ cc.pLengthSQ = function (v) { return cc.pDot(v, v); }; /** * Calculates distance between point an origin * @param {cc.Point} v * @return {Number} */ cc.pLength = function (v) { return Math.sqrt(cc.pLengthSQ(v)); }; /** * Calculates the distance between two points * @param {cc.Point} v1 * @param {cc.Point} v2 * @return {cc.pLength} */ cc.pDistance = function (v1, v2) { return cc.pLength(cc.pSub(v1, v2)); }; /** * 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; }; /** * Clamp a point between from and to. * @param {Number} p * @param {Number} min_inclusive * @param {Number} max_inclusive * @return {cc.Point} */ cc.pClamp = function (p, min_inclusive, max_inclusive) { return cc.p(cc.clampf(p.x, min_inclusive.x, max_inclusive.x), cc.clampf(p.y, min_inclusive.y, max_inclusive.y)); }; /** * returns a random float between 0 and 1 * @return {Number} * @function */ cc.RANDOM_0_1 = function () { return Math.random(); }; /** * Associates a base class with a native superclass * @function * @param {object} jsobj subclass * @param {object} klass superclass */ cc.associateWithNative = function( jsobj, superclass ) { var native = new superclass(); __associateObjWithNative( jsobj, native ); }; // // Array: for cocos2d-hmtl5 compatibility // cc.ArrayRemoveObject = function (arr, delObj) { for (var i = 0; i < arr.length; i++) { if (arr[i] == delObj) { arr.splice(i, 1); } } }; // // Google "subclasses" // borrowed from closure library // var goog = goog || {}; // Check to see if already defined in current scope goog.inherits = function (childCtor, parentCtor) { /** @constructor */ function tempCtor() {}; tempCtor.prototype = parentCtor.prototype; childCtor.superClass_ = parentCtor.prototype; childCtor.prototype = new tempCtor(); childCtor.prototype.constructor = childCtor; // Copy "static" method, but doesn't generate subclasses. // for( var i in parentCtor ) { // childCtor[ i ] = parentCtor[ i ]; // } }; goog.base = function(me, opt_methodName, var_args) { var caller = arguments.callee.caller; if (caller.superClass_) { // This is a constructor. Call the superclass constructor. ret = caller.superClass_.constructor.apply( me, Array.prototype.slice.call(arguments, 1)); // XXX: SpiderMonkey bindings extensions // __associateObjWithNative( me, ret ); return ret; } var args = Array.prototype.slice.call(arguments, 2); var foundCaller = false; for (var ctor = me.constructor; ctor; ctor = ctor.superClass_ && ctor.superClass_.constructor) { if (ctor.prototype[opt_methodName] === caller) { foundCaller = true; } else if (foundCaller) { return ctor.prototype[opt_methodName].apply(me, args); } } // If we did not find the caller in the prototype chain, // then one of two things happened: // 1) The caller is an instance method. // 2) This method was not called by the right caller. if (me[opt_methodName] === caller) { return me.constructor.prototype[opt_methodName].apply(me, args); } else { throw Error( 'goog.base called from a method of one name ' + 'to a method of a different name'); } }; // // Simple subclass // cc.Class = function(){}; cc.Class.extend = function (prop) { var _super = this.prototype; // Instantiate a base class (but only create the instance, // don't run the init constructor) initializing = true; var prototype = new this(); initializing = false; fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; // Copy the properties over onto the new prototype for (var name in prop) { // Check if we're overwriting an existing function prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function (name, fn) { return function () { var tmp = this._super; // Add a new ._super() method that is the same method // but on the super-class this._super = _super[name]; // The method only need to be bound temporarily, so we // remove it when we're done executing var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } // The dummy class constructor function Class() { // All construction is actually done in the init method if (!initializing && this.ctor) this.ctor.apply(this, arguments); } // Populate our constructed prototype object Class.prototype = prototype; // Enforce the constructor to be what we expect Class.prototype.constructor = Class; // And make this class extendable Class.extend = arguments.callee; return Class; }; cc.Layer.extend = cc.Class.extend; cc.Scene.extend = cc.Class.extend; cc.LayerGradient.extend = cc.Class.extend; cc.Sprite.extend = cc.Class.extend; cc.MenuItemFont.extend = cc.Class.extend; // // Chipmunk helpers // var cp = cp || {}; cp.v = cc.p; cp._v = cc._p; cp.vzero = cp.v(0,0); // // OpenGL Helpers // var gl = gl || {}; gl.NEAREST = 0x2600; gl.LINEAR = 0x2601; gl.REPEAT = 0x2901; gl.CLAMP_TO_EDGE = 0x812F; gl.CLAMP_TO_BORDER = 0x812D; gl.LINEAR_MIPMAP_NEAREST = 0x2701; gl.NEAREST_MIPMAP_NEAREST = 0x2700; gl.ZERO = 0; gl.ONE = 1; gl.SRC_COLOR = 0x0300; gl.ONE_MINUS_SRC_COLOR = 0x0301; gl.SRC_ALPHA = 0x0302; gl.ONE_MINUS_SRC_ALPHA = 0x0303; gl.DST_ALPHA = 0x0304; gl.ONE_MINUS_DST_ALPHA = 0x0305; gl.DST_COLOR = 0x0306; gl.ONE_MINUS_DST_COLOR = 0x0307; gl.SRC_ALPHA_SATURATE = 0x0308;