UNPKG

cocos2dx

Version:
1,330 lines 757 kB
var cc = cc || {}; cc._tmp = cc._tmp || {}; cc._LogInfos = {}; var _p = window; _p.gl; _p.WebGLRenderingContext; _p.DeviceOrientationEvent; _p.DeviceMotionEvent; _p.AudioContext; if (!_p.AudioContext) { _p.webkitAudioContext; } _p.mozAudioContext; _p = Object.prototype; _p._super; _p.ctor; _p = null; cc.ORIENTATION_PORTRAIT = 0; cc.ORIENTATION_PORTRAIT_UPSIDE_DOWN = 1; cc.ORIENTATION_LANDSCAPE_LEFT = 2; cc.ORIENTATION_LANDSCAPE_RIGHT = 3; cc._drawingUtil = null; cc._renderContext = null; cc._supportRender = false; cc._canvas = null; cc.container = null; cc._gameDiv = null; cc.newElement = function (x) { return document.createElement(x); }; cc.each = function (obj, iterator, context) { if (!obj) return; if (obj instanceof Array) { for (var i = 0, li = obj.length; i < li; i++) { if (iterator.call(context, obj[i], i) === false) return; } } else { for (var key in obj) { if (iterator.call(context, obj[key], key) === false) return; } } }; cc.extend = function(target) { var sources = arguments.length >= 2 ? Array.prototype.slice.call(arguments, 1) : []; cc.each(sources, function(src) { for(var key in src) { if (src.hasOwnProperty(key)) { target[key] = src[key]; } } }); return target; }; cc.isFunction = function(obj) { return typeof obj === 'function'; }; cc.isNumber = function(obj) { return typeof obj === 'number' || Object.prototype.toString.call(obj) === '[object Number]'; }; cc.isString = function(obj) { return typeof obj === 'string' || Object.prototype.toString.call(obj) === '[object String]'; }; cc.isArray = function(obj) { return Array.isArray(obj) || (typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Array]'); }; cc.isUndefined = function(obj) { return typeof obj === 'undefined'; }; cc.isObject = function(obj) { return typeof obj === "object" && Object.prototype.toString.call(obj) === '[object Object]'; }; cc.isCrossOrigin = function (url) { if (!url) { cc.log("invalid URL"); return false; } var startIndex = url.indexOf("://"); if (startIndex === -1) return false; var endIndex = url.indexOf("/", startIndex + 3); var urlOrigin = (endIndex === -1) ? url : url.substring(0, endIndex); return urlOrigin !== location.origin; }; cc.AsyncPool = function(srcObj, limit, iterator, onEnd, target){ var self = this; self._srcObj = srcObj; self._limit = limit; self._pool = []; self._iterator = iterator; self._iteratorTarget = target; self._onEnd = onEnd; self._onEndTarget = target; self._results = srcObj instanceof Array ? [] : {}; self._errors = srcObj instanceof Array ? [] : {}; cc.each(srcObj, function(value, index){ self._pool.push({index : index, value : value}); }); self.size = self._pool.length; self.finishedSize = 0; self._workingSize = 0; self._limit = self._limit || self.size; self.onIterator = function(iterator, target){ self._iterator = iterator; self._iteratorTarget = target; }; self.onEnd = function(endCb, endCbTarget){ self._onEnd = endCb; self._onEndTarget = endCbTarget; }; self._handleItem = function(){ var self = this; if(self._pool.length === 0 || self._workingSize >= self._limit) return; var item = self._pool.shift(); var value = item.value, index = item.index; self._workingSize++; self._iterator.call(self._iteratorTarget, value, index, function(err, result) { self.finishedSize++; self._workingSize--; if (err) { self._errors[this.index] = err; } else { self._results[this.index] = result; } if (self.finishedSize === self.size) { if (self._onEnd) { var errors = self._errors.length === 0 ? null : self._errors; self._onEnd.call(self._onEndTarget, errors, self._results); } return; } self._handleItem(); }.bind(item), self); }; self.flow = function(){ var self = this; if(self._pool.length === 0) { if(self._onEnd) self._onEnd.call(self._onEndTarget, null, []); return; } for(var i = 0; i < self._limit; i++) self._handleItem(); }; }; cc.async = { series : function(tasks, cb, target){ var asyncPool = new cc.AsyncPool(tasks, 1, function(func, index, cb1){ func.call(target, cb1); }, cb, target); asyncPool.flow(); return asyncPool; }, parallel : function(tasks, cb, target){ var asyncPool = new cc.AsyncPool(tasks, 0, function(func, index, cb1){ func.call(target, cb1); }, cb, target); asyncPool.flow(); return asyncPool; }, waterfall : function(tasks, cb, target){ var args = []; var lastResults = [null];//the array to store the last results var asyncPool = new cc.AsyncPool(tasks, 1, function (func, index, cb1) { args.push(function (err) { args = Array.prototype.slice.call(arguments, 1); if(tasks.length - 1 === index) lastResults = lastResults.concat(args);//while the last task cb1.apply(null, arguments); }); func.apply(target, args); }, function (err) { if (!cb) return; if (err) return cb.call(target, err); cb.apply(target, lastResults); }); asyncPool.flow(); return asyncPool; }, map : function(tasks, iterator, callback, target){ var locIterator = iterator; if(typeof(iterator) === "object"){ callback = iterator.cb; target = iterator.iteratorTarget; locIterator = iterator.iterator; } var asyncPool = new cc.AsyncPool(tasks, 0, locIterator, callback, target); asyncPool.flow(); return asyncPool; }, mapLimit : function(tasks, limit, iterator, cb, target){ var asyncPool = new cc.AsyncPool(tasks, limit, iterator, cb, target); asyncPool.flow(); return asyncPool; } }; cc.path = { normalizeRE: /[^\.\/]+\/\.\.\//, join: function () { var l = arguments.length; var result = ""; for (var i = 0; i < l; i++) { result = (result + (result === "" ? "" : "/") + arguments[i]).replace(/(\/|\\\\)$/, ""); } return result; }, extname: function (pathStr) { var temp = /(\.[^\.\/\?\\]*)(\?.*)?$/.exec(pathStr); return temp ? temp[1] : null; }, mainFileName: function(fileName){ if(fileName){ var idx = fileName.lastIndexOf("."); if(idx !== -1) return fileName.substring(0,idx); } return fileName; }, basename: function (pathStr, extname) { var index = pathStr.indexOf("?"); if (index > 0) pathStr = pathStr.substring(0, index); var reg = /(\/|\\\\)([^(\/|\\\\)]+)$/g; var result = reg.exec(pathStr.replace(/(\/|\\\\)$/, "")); if (!result) return null; var baseName = result[2]; if (extname && pathStr.substring(pathStr.length - extname.length).toLowerCase() === extname.toLowerCase()) return baseName.substring(0, baseName.length - extname.length); return baseName; }, dirname: function (pathStr) { return pathStr.replace(/((.*)(\/|\\|\\\\))?(.*?\..*$)?/, '$2'); }, changeExtname: function (pathStr, extname) { extname = extname || ""; var index = pathStr.indexOf("?"); var tempStr = ""; if (index > 0) { tempStr = pathStr.substring(index); pathStr = pathStr.substring(0, index); } index = pathStr.lastIndexOf("."); if (index < 0) return pathStr + extname + tempStr; return pathStr.substring(0, index) + extname + tempStr; }, changeBasename: function (pathStr, basename, isSameExt) { if (basename.indexOf(".") === 0) return this.changeExtname(pathStr, basename); var index = pathStr.indexOf("?"); var tempStr = ""; var ext = isSameExt ? this.extname(pathStr) : ""; if (index > 0) { tempStr = pathStr.substring(index); pathStr = pathStr.substring(0, index); } index = pathStr.lastIndexOf("/"); index = index <= 0 ? 0 : index + 1; return pathStr.substring(0, index) + basename + ext + tempStr; }, _normalize: function(url){ var oldUrl = url = String(url); do { oldUrl = url; url = url.replace(this.normalizeRE, ""); } while(oldUrl.length !== url.length); return url; } }; cc.loader = (function () { var _jsCache = {}, _register = {}, _langPathCache = {}, _aliases = {}, _queue = {}, _urlRegExp = new RegExp( "^" + "(?:(?:https?|ftp)://)" + "(?:\\S+(?::\\S*)?@)?" + "(?:" + "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + "|" + "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" + "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*" + "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" + "|" + "(?:localhost)" + ")" + "(?::\\d{2,5})?" + "(?:/\\S*)?" + "$", "i" ); return { resPath: "", audioPath: "", cache: {}, getXMLHttpRequest: function () { return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP"); }, _getArgs4Js: function (args) { var a0 = args[0], a1 = args[1], a2 = args[2], results = ["", null, null]; if (args.length === 1) { results[1] = a0 instanceof Array ? a0 : [a0]; } else if (args.length === 2) { if (typeof a1 === "function") { results[1] = a0 instanceof Array ? a0 : [a0]; results[2] = a1; } else { results[0] = a0 || ""; results[1] = a1 instanceof Array ? a1 : [a1]; } } else if (args.length === 3) { results[0] = a0 || ""; results[1] = a1 instanceof Array ? a1 : [a1]; results[2] = a2; } else throw new Error("arguments error to load js!"); return results; }, isLoading: function (url) { return (_queue[url] !== undefined); }, loadJs: function (baseDir, jsList, cb) { var self = this, args = self._getArgs4Js(arguments); var preDir = args[0], list = args[1], callback = args[2]; if (navigator.userAgent.indexOf("Trident/5") > -1) { self._loadJs4Dependency(preDir, list, 0, callback); } else { cc.async.map(list, function (item, index, cb1) { var jsPath = cc.path.join(preDir, item); if (_jsCache[jsPath]) return cb1(null); self._createScript(jsPath, false, cb1); }, callback); } }, loadJsWithImg: function (baseDir, jsList, cb) { var self = this, jsLoadingImg = self._loadJsImg(), args = self._getArgs4Js(arguments); this.loadJs(args[0], args[1], function (err) { if (err) throw new Error(err); jsLoadingImg.parentNode.removeChild(jsLoadingImg);//remove loading gif if (args[2]) args[2](); }); }, _createScript: function (jsPath, isAsync, cb) { var d = document, self = this, s = document.createElement('script'); s.async = isAsync; _jsCache[jsPath] = true; if(cc.game.config["noCache"] && typeof jsPath === "string"){ if(self._noCacheRex.test(jsPath)) s.src = jsPath + "&_t=" + (new Date() - 0); else s.src = jsPath + "?_t=" + (new Date() - 0); }else{ s.src = jsPath; } s.addEventListener('load', function () { s.parentNode.removeChild(s); this.removeEventListener('load', arguments.callee, false); cb(); }, false); s.addEventListener('error', function () { s.parentNode.removeChild(s); cb("Load " + jsPath + " failed!"); }, false); d.body.appendChild(s); }, _loadJs4Dependency: function (baseDir, jsList, index, cb) { if (index >= jsList.length) { if (cb) cb(); return; } var self = this; self._createScript(cc.path.join(baseDir, jsList[index]), false, function (err) { if (err) return cb(err); self._loadJs4Dependency(baseDir, jsList, index + 1, cb); }); }, _loadJsImg: function () { var d = document, jsLoadingImg = d.getElementById("cocos2d_loadJsImg"); if (!jsLoadingImg) { jsLoadingImg = document.createElement('img'); if (cc._loadingImage) jsLoadingImg.src = cc._loadingImage; var canvasNode = d.getElementById(cc.game.config["id"]); canvasNode.style.backgroundColor = "transparent"; canvasNode.parentNode.appendChild(jsLoadingImg); var canvasStyle = getComputedStyle ? getComputedStyle(canvasNode) : canvasNode.currentStyle; if (!canvasStyle) canvasStyle = {width: canvasNode.width, height: canvasNode.height}; jsLoadingImg.style.left = canvasNode.offsetLeft + (parseFloat(canvasStyle.width) - jsLoadingImg.width) / 2 + "px"; jsLoadingImg.style.top = canvasNode.offsetTop + (parseFloat(canvasStyle.height) - jsLoadingImg.height) / 2 + "px"; jsLoadingImg.style.position = "absolute"; } return jsLoadingImg; }, loadTxt: function (url, cb) { if (!cc._isNodeJs) { var xhr = this.getXMLHttpRequest(), errInfo = "load " + url + " failed!"; xhr.open("GET", url, true); if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) { xhr.setRequestHeader("Accept-Charset", "utf-8"); xhr.onreadystatechange = function () { if(xhr.readyState === 4) xhr.status === 200 ? cb(null, xhr.responseText) : cb({status:xhr.status, errorMessage:errInfo}, null); }; } else { if (xhr.overrideMimeType) xhr.overrideMimeType("text\/plain; charset=utf-8"); xhr.onload = function () { if(xhr.readyState === 4) xhr.status === 200 ? cb(null, xhr.responseText) : cb({status:xhr.status, errorMessage:errInfo}, null); }; xhr.onerror = function(){ cb({status:xhr.status, errorMessage:errInfo}, null); }; } xhr.send(null); } else { var fs = require("fs"); fs.readFile(url, function (err, data) { err ? cb(err) : cb(null, data.toString()); }); } }, _loadTxtSync: function (url) { if (!cc._isNodeJs) { var xhr = this.getXMLHttpRequest(); xhr.open("GET", url, false); if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) { xhr.setRequestHeader("Accept-Charset", "utf-8"); } else { if (xhr.overrideMimeType) xhr.overrideMimeType("text\/plain; charset=utf-8"); } xhr.send(null); if (!xhr.readyState === 4 || xhr.status !== 200) { return null; } return xhr.responseText; } else { var fs = require("fs"); return fs.readFileSync(url).toString(); } }, loadCsb: function(url, cb){ var xhr = new XMLHttpRequest(), errInfo = "load " + url + " failed!"; xhr.open("GET", url, true); xhr.responseType = "arraybuffer"; xhr.onload = function () { var arrayBuffer = xhr.response; if (arrayBuffer) { window.msg = arrayBuffer; } if(xhr.readyState === 4) xhr.status === 200 ? cb(null, xhr.response) : cb({status:xhr.status, errorMessage:errInfo}, null); }; xhr.onerror = function(){ cb({status:xhr.status, errorMessage:errInfo}, null); }; xhr.send(null); }, loadJson: function (url, cb) { this.loadTxt(url, function (err, txt) { if (err) { cb(err); } else { try { var result = JSON.parse(txt); } catch (e) { throw new Error("parse json [" + url + "] failed : " + e); return; } cb(null, result); } }); }, _checkIsImageURL: function (url) { var ext = /(\.png)|(\.jpg)|(\.bmp)|(\.jpeg)|(\.gif)/.exec(url); return (ext != null); }, loadImg: function (url, option, callback) { var opt = { isCrossOrigin: true }; if (callback !== undefined) opt.isCrossOrigin = option.isCrossOrigin === undefined ? opt.isCrossOrigin : option.isCrossOrigin; else if (option !== undefined) callback = option; var img = this.getRes(url); if (img) { callback && callback(null, img); return img; } var queue = _queue[url]; if (queue) { queue.callbacks.push(callback); return queue.img; } img = new Image(); if (opt.isCrossOrigin && location.origin !== "file://") img.crossOrigin = "Anonymous"; var loadCallback = function () { this.removeEventListener('load', loadCallback, false); this.removeEventListener('error', errorCallback, false); if (!_urlRegExp.test(url)) { cc.loader.cache[url] = img; } var queue = _queue[url]; if (queue) { var callbacks = queue.callbacks; for (var i = 0; i < callbacks.length; ++i) { var cb = callbacks[i]; if (cb) { cb(null, img); } } queue.img = null; delete _queue[url]; } }; var self = this; var errorCallback = function () { this.removeEventListener('error', errorCallback, false); if (img.crossOrigin && img.crossOrigin.toLowerCase() === "anonymous") { opt.isCrossOrigin = false; self.release(url); cc.loader.loadImg(url, opt, callback); } else { var queue = _queue[url]; if (queue) { var callbacks = queue.callbacks; for (var i = 0; i < callbacks.length; ++i) { var cb = callbacks[i]; if (cb) { cb("load image failed"); } } queue.img = null; delete _queue[url]; } } }; _queue[url] = { img: img, callbacks: callback ? [callback] : [] }; img.addEventListener("load", loadCallback); img.addEventListener("error", errorCallback); img.src = url; return img; }, _loadResIterator: function (item, index, cb) { var self = this, url = null; var type = item.type; if (type) { type = "." + type.toLowerCase(); url = item.src ? item.src : item.name + type; } else { url = item; type = cc.path.extname(url); } var obj = self.getRes(url); if (obj) return cb(null, obj); var loader = null; if (type) { loader = _register[type.toLowerCase()]; } if (!loader) { cc.error("loader for [" + type + "] not exists!"); return cb(); } var realUrl = url; if (!_urlRegExp.test(url)) { var basePath = loader.getBasePath ? loader.getBasePath() : self.resPath; realUrl = self.getUrl(basePath, url); } if(cc.game.config["noCache"] && typeof realUrl === "string"){ if(self._noCacheRex.test(realUrl)) realUrl += "&_t=" + (new Date() - 0); else realUrl += "?_t=" + (new Date() - 0); } loader.load(realUrl, url, item, function (err, data) { if (err) { cc.log(err); self.cache[url] = null; delete self.cache[url]; cb({status:520, errorMessage:err}, null); } else { self.cache[url] = data; cb(null, data); } }); }, _noCacheRex: /\?/, getUrl: function (basePath, url) { var self = this, path = cc.path; if (basePath !== undefined && url === undefined) { url = basePath; var type = path.extname(url); type = type ? type.toLowerCase() : ""; var loader = _register[type]; if (!loader) basePath = self.resPath; else basePath = loader.getBasePath ? loader.getBasePath() : self.resPath; } url = cc.path.join(basePath || "", url); if (url.match(/[\/(\\\\)]lang[\/(\\\\)]/i)) { if (_langPathCache[url]) return _langPathCache[url]; var extname = path.extname(url) || ""; url = _langPathCache[url] = url.substring(0, url.length - extname.length) + "_" + cc.sys.language + extname; } return url; }, load : function(resources, option, loadCallback){ var self = this; var len = arguments.length; if(len === 0) throw new Error("arguments error!"); if(len === 3){ if(typeof option === "function"){ if(typeof loadCallback === "function") option = {trigger : option, cb : loadCallback }; else option = { cb : option, cbTarget : loadCallback}; } }else if(len === 2){ if(typeof option === "function") option = {cb : option}; }else if(len === 1){ option = {}; } if(!(resources instanceof Array)) resources = [resources]; var asyncPool = new cc.AsyncPool( resources, 0, function (value, index, AsyncPoolCallback, aPool) { self._loadResIterator(value, index, function (err) { var arr = Array.prototype.slice.call(arguments, 1); if (option.trigger) option.trigger.call(option.triggerTarget, arr[0], aPool.size, aPool.finishedSize); AsyncPoolCallback(err, arr[0]); }); }, option.cb, option.cbTarget); asyncPool.flow(); return asyncPool; }, _handleAliases: function (fileNames, cb) { var self = this; var resList = []; for (var key in fileNames) { var value = fileNames[key]; _aliases[key] = value; resList.push(value); } this.load(resList, cb); }, loadAliases: function (url, callback) { var self = this, dict = self.getRes(url); if (!dict) { self.load(url, function (err, results) { self._handleAliases(results[0]["filenames"], callback); }); } else self._handleAliases(dict["filenames"], callback); }, register: function (extNames, loader) { if (!extNames || !loader) return; var self = this; if (typeof extNames === "string") return _register[extNames.trim().toLowerCase()] = loader; for (var i = 0, li = extNames.length; i < li; i++) { _register["." + extNames[i].trim().toLowerCase()] = loader; } }, getRes: function (url) { return this.cache[url] || this.cache[_aliases[url]]; }, _getAliase: function (url) { return _aliases[url]; }, release: function (url) { var cache = this.cache; var queue = _queue[url]; if (queue) { queue.img = null; delete _queue[url]; } delete cache[url]; delete cache[_aliases[url]]; delete _aliases[url]; }, releaseAll: function () { var locCache = this.cache; for (var key in locCache) delete locCache[key]; for (var key in _aliases) delete _aliases[key]; } }; })(); cc.formatStr = function(){ var args = arguments; var l = args.length; if(l < 1) return ""; var str = args[0]; var needToFormat = true; if(typeof str === "object"){ needToFormat = false; } for(var i = 1; i < l; ++i){ var arg = args[i]; if(needToFormat){ while(true){ var result = null; if(typeof arg === "number"){ result = str.match(/(%d)|(%s)/); if(result){ str = str.replace(/(%d)|(%s)/, arg); break; } } result = str.match(/%s/); if(result) str = str.replace(/%s/, arg); else str += " " + arg; break; } }else str += " " + arg; } return str; }; (function () { var _tmpCanvas1 = document.createElement("canvas"), _tmpCanvas2 = document.createElement("canvas"); cc.create3DContext = function (canvas, opt_attribs) { var names = ["webgl", "experimental-webgl", "webkit-3d", "moz-webgl"]; var context = null; for (var ii = 0; ii < names.length; ++ii) { try { context = canvas.getContext(names[ii], opt_attribs); } catch (e) { } if (context) { break; } } return context; }; var _initSys = function () { cc.sys = {}; var sys = cc.sys; sys.LANGUAGE_ENGLISH = "en"; sys.LANGUAGE_CHINESE = "zh"; sys.LANGUAGE_FRENCH = "fr"; sys.LANGUAGE_ITALIAN = "it"; sys.LANGUAGE_GERMAN = "de"; sys.LANGUAGE_SPANISH = "es"; sys.LANGUAGE_DUTCH = "du"; sys.LANGUAGE_RUSSIAN = "ru"; sys.LANGUAGE_KOREAN = "ko"; sys.LANGUAGE_JAPANESE = "ja"; sys.LANGUAGE_HUNGARIAN = "hu"; sys.LANGUAGE_PORTUGUESE = "pt"; sys.LANGUAGE_ARABIC = "ar"; sys.LANGUAGE_NORWEGIAN = "no"; sys.LANGUAGE_POLISH = "pl"; sys.LANGUAGE_UNKNOWN = "unkonwn"; sys.OS_IOS = "iOS"; sys.OS_ANDROID = "Android"; sys.OS_WINDOWS = "Windows"; sys.OS_MARMALADE = "Marmalade"; sys.OS_LINUX = "Linux"; sys.OS_BADA = "Bada"; sys.OS_BLACKBERRY = "Blackberry"; sys.OS_OSX = "OS X"; sys.OS_WP8 = "WP8"; sys.OS_WINRT = "WINRT"; sys.OS_UNKNOWN = "Unknown"; sys.UNKNOWN = -1; sys.WIN32 = 0; sys.LINUX = 1; sys.MACOS = 2; sys.ANDROID = 3; sys.IPHONE = 4; sys.IPAD = 5; sys.BLACKBERRY = 6; sys.NACL = 7; sys.EMSCRIPTEN = 8; sys.TIZEN = 9; sys.WINRT = 10; sys.WP8 = 11; sys.MOBILE_BROWSER = 100; sys.DESKTOP_BROWSER = 101; sys.BROWSER_TYPE_WECHAT = "wechat"; sys.BROWSER_TYPE_ANDROID = "androidbrowser"; sys.BROWSER_TYPE_IE = "ie"; sys.BROWSER_TYPE_QQ = "qqbrowser"; sys.BROWSER_TYPE_MOBILE_QQ = "mqqbrowser"; sys.BROWSER_TYPE_UC = "ucbrowser"; sys.BROWSER_TYPE_360 = "360browser"; sys.BROWSER_TYPE_BAIDU_APP = "baiduboxapp"; sys.BROWSER_TYPE_BAIDU = "baidubrowser"; sys.BROWSER_TYPE_MAXTHON = "maxthon"; sys.BROWSER_TYPE_OPERA = "opera"; sys.BROWSER_TYPE_OUPENG = "oupeng"; sys.BROWSER_TYPE_MIUI = "miuibrowser"; sys.BROWSER_TYPE_FIREFOX = "firefox"; sys.BROWSER_TYPE_SAFARI = "safari"; sys.BROWSER_TYPE_CHROME = "chrome"; sys.BROWSER_TYPE_LIEBAO = "liebao"; sys.BROWSER_TYPE_QZONE = "qzone"; sys.BROWSER_TYPE_SOUGOU = "sogou"; sys.BROWSER_TYPE_UNKNOWN = "unknown"; sys.isNative = false; var win = window, nav = win.navigator, doc = document, docEle = doc.documentElement; var ua = nav.userAgent.toLowerCase(); sys.isMobile = ua.indexOf('mobile') !== -1 || ua.indexOf('android') !== -1; sys.platform = sys.isMobile ? sys.MOBILE_BROWSER : sys.DESKTOP_BROWSER; var currLanguage = nav.language; currLanguage = currLanguage ? currLanguage : nav.browserLanguage; currLanguage = currLanguage ? currLanguage.split("-")[0] : sys.LANGUAGE_ENGLISH; sys.language = currLanguage; var isAndroid = false, iOS = false, osVersion = '', osMainVersion = 0; var uaResult = /android (\d+(?:\.\d+)+)/i.exec(ua) || /android (\d+(?:\.\d+)+)/i.exec(nav.platform); if (uaResult) { isAndroid = true; osVersion = uaResult[1] || ''; osMainVersion = parseInt(osVersion) || 0; } uaResult = /(iPad|iPhone|iPod).*OS ((\d+_?){2,3})/i.exec(ua); if (uaResult) { iOS = true; osVersion = uaResult[2] || ''; osMainVersion = parseInt(osVersion) || 0; } var osName = sys.OS_UNKNOWN; if (nav.appVersion.indexOf("Win") !== -1) osName = sys.OS_WINDOWS; else if (iOS) osName = sys.OS_IOS; else if (nav.appVersion.indexOf("Mac") !== -1) osName = sys.OS_OSX; else if (nav.appVersion.indexOf("X11") !== -1 && nav.appVersion.indexOf("Linux") === -1) osName = sys.OS_UNIX; else if (isAndroid) osName = sys.OS_ANDROID; else if (nav.appVersion.indexOf("Linux") !== -1) osName = sys.OS_LINUX; sys.os = osName; sys.osVersion = osVersion; sys.osMainVersion = osMainVersion; sys.browserType = sys.BROWSER_TYPE_UNKNOWN; (function(){ var typeReg1 = /mqqbrowser|sogou|qzone|liebao|micromessenger|ucbrowser|360 aphone|360browser|baiduboxapp|baidubrowser|maxthon|mxbrowser|trident|miuibrowser/i; var typeReg2 = /qqbrowser|chrome|safari|firefox|opr|oupeng|opera/i; var browserTypes = typeReg1.exec(ua); if(!browserTypes) browserTypes = typeReg2.exec(ua); var browserType = browserTypes ? browserTypes[0] : sys.BROWSER_TYPE_UNKNOWN; if (browserType === 'micromessenger') browserType = sys.BROWSER_TYPE_WECHAT; else if (browserType === "safari" && (ua.match(/android.*applewebkit/))) browserType = sys.BROWSER_TYPE_ANDROID; else if (browserType === "trident") browserType = sys.BROWSER_TYPE_IE; else if (browserType === "360 aphone") browserType = sys.BROWSER_TYPE_360; else if (browserType === "mxbrowser") browserType = sys.BROWSER_TYPE_MAXTHON; else if (browserType === "opr") browserType = sys.BROWSER_TYPE_OPERA; sys.browserType = browserType; })(); sys.browserVersion = ""; (function(){ var versionReg1 = /(micromessenger|qq|mx|maxthon|baidu|sogou)(mobile)?(browser)?\/?([\d.]+)/i; var versionReg2 = /(msie |rv:|firefox|chrome|ucbrowser|oupeng|opera|opr|safari|miui)(mobile)?(browser)?\/?([\d.]+)/i; var tmp = ua.match(versionReg1); if(!tmp) tmp = ua.match(versionReg2); sys.browserVersion = tmp ? tmp[4] : ""; })(); var w = window.innerWidth || document.documentElement.clientWidth; var h = window.innerHeight || document.documentElement.clientHeight; var ratio = window.devicePixelRatio || 1; sys.windowPixelResolution = { width: ratio * w, height: ratio * h }; sys._checkWebGLRenderMode = function () { if (cc._renderType !== cc.game.RENDER_TYPE_WEBGL) throw new Error("This feature supports WebGL render mode only."); }; sys._supportCanvasNewBlendModes = (function(){ var canvas = _tmpCanvas1; canvas.width = 1; canvas.height = 1; var context = canvas.getContext('2d'); context.fillStyle = '#000'; context.fillRect(0,0,1,1); context.globalCompositeOperation = 'multiply'; var canvas2 = _tmpCanvas2; canvas2.width = 1; canvas2.height = 1; var context2 = canvas2.getContext('2d'); context2.fillStyle = '#fff'; context2.fillRect(0,0,1,1); context.drawImage(canvas2, 0, 0, 1, 1); return context.getImageData(0,0,1,1).data[0] === 0; })(); if (cc.sys.isMobile) { var fontStyle = document.createElement("style"); fontStyle.type = "text/css"; document.body.appendChild(fontStyle); fontStyle.textContent = "body,canvas,div{ -moz-user-select: none;-webkit-user-select: none;-ms-user-select: none;-khtml-user-select: none;" + "-webkit-tap-highlight-color:rgba(0,0,0,0);}"; } try { var localStorage = sys.localStorage = win.localStorage; localStorage.setItem("storage", ""); localStorage.removeItem("storage"); localStorage = null; } catch (e) { var warn = function () { cc.warn("Warning: localStorage isn't enabled. Please confirm browser cookie or privacy option"); }; sys.localStorage = { getItem : warn, setItem : warn, removeItem : warn, clear : warn }; } var _supportCanvas = !!_tmpCanvas1.getContext("2d"); var _supportWebGL = false; if (win.WebGLRenderingContext) { var tmpCanvas = document.createElement("CANVAS"); try{ var context = cc.create3DContext(tmpCanvas, {'stencil': true}); if(context) { _supportWebGL = true; } if (_supportWebGL && sys.os === sys.OS_ANDROID) { var browserVer = parseFloat(sys.browserVersion); switch (sys.browserType) { case sys.BROWSER_TYPE_MOBILE_QQ: case sys.BROWSER_TYPE_BAIDU: case sys.BROWSER_TYPE_BAIDU_APP: if (browserVer >= 6.2) { _supportWebGL = true; } else { _supportWebGL = false; } break; case sys.BROWSER_TYPE_CHROME: if(browserVer >= 30.0) { _supportWebGL = true; } else { _supportWebGL = false; } break; case sys.BROWSER_TYPE_ANDROID: if (sys.osMainVersion && sys.osMainVersion >= 5) { _supportWebGL = true; } break; case sys.BROWSER_TYPE_UNKNOWN: case sys.BROWSER_TYPE_360: case sys.BROWSER_TYPE_MIUI: case sys.BROWSER_TYPE_UC: _supportWebGL = false; } } } catch (e) {} tmpCanvas = null; } var capabilities = sys.capabilities = { "canvas": _supportCanvas, "opengl": _supportWebGL }; if (docEle['ontouchstart'] !== undefined || doc['ontouchstart'] !== undefined || nav.msPointerEnabled) capabilities["touches"] = true; if (docEle['onmouseup'] !== undefined) capabilities["mouse"] = true; if (docEle['onkeyup'] !== undefined) capabilities["keyboard"] = true; if (win.DeviceMotionEvent || win.DeviceOrientationEvent) capabilities["accelerometer"] = true; sys.garbageCollect = function () { }; sys.dumpRoot = function () { }; sys.restartVM = function () { }; sys.cleanScript = function (jsfile) { }; sys.isObjectValid = function (obj) { if (obj) return true; else return false; }; sys.dump = function () { var self = this; var str = ""; str += "isMobile : " + self.isMobile + "\r\n"; str += "language : " + self.language + "\r\n"; str += "browserType : " + self.browserType + "\r\n"; str += "browserVersion : " + self.browserVersion + "\r\n"; str += "capabilities : " + JSON.stringify(self.capabilities) + "\r\n"; str += "os : " + self.os + "\r\n"; str += "osVersion : " + self.osVersion + "\r\n"; str += "platform : " + self.platform + "\r\n"; str += "Using " + (cc._renderType === cc.game.RENDER_TYPE_WEBGL ? "WEBGL" : "CANVAS") + " renderer." + "\r\n"; cc.log(str); }; sys.openURL = function(url){ window.open(url); }; }; _initSys(); _tmpCanvas1 = null; _tmpCanvas2 = null; cc.log = cc.warn = cc.error = cc.assert = function () { }; var _config = null, _jsAddedCache = {}, _engineInitCalled = false, _engineLoadedCallback = null; cc._engineLoaded = false; function _determineRenderType(config) { var CONFIG_KEY = cc.game.CONFIG_KEY, userRenderMode = parseInt(config[CONFIG_KEY.renderMode]) || 0; if (isNaN(userRenderMode) || userRenderMode > 2 || userRenderMode < 0) config[CONFIG_KEY.renderMode] = 0; cc._renderType = cc.game.RENDER_TYPE_CANVAS; cc._supportRender = false; if (userRenderMode === 0) { if (cc.sys.capabilities["opengl"]) { cc._renderType = cc.game.RENDER_TYPE_WEBGL; cc._supportRender = true; } else if (cc.sys.capabilities["canvas"]) { cc._renderType = cc.game.RENDER_TYPE_CANVAS; cc._supportRender = true; } } else if (userRenderMode === 1 && cc.sys.capabilities["canvas"]) { cc._renderType = cc.game.RENDER_TYPE_CANVAS; cc._supportRender = true; } else if (userRenderMode === 2 && cc.sys.capabilities["opengl"]) { cc._renderType = cc.game.RENDER_TYPE_WEBGL; cc._supportRender = true; } } function _getJsListOfModule(moduleMap, moduleName, dir) { if (_jsAddedCache[moduleName]) return null; dir = dir || ""; var jsList = []; var tempList = moduleMap[moduleName]; if (!tempList) throw new Error("can not find module [" + moduleName + "]"); var ccPath = cc.path; for (var i = 0, li = tempList.length; i < li; i++) { var item = tempList[i]; if (_jsAddedCache[item]) continue; var extname = ccPath.extname(item); if (!extname) { var arr = _getJsListOfModule(moduleMap, item, dir); if (arr) jsList = jsList.concat(arr); } else if (extname.toLowerCase() === ".js") jsList.push(ccPath.join(dir, item)); _jsAddedCache[item] = 1; } return jsList; } function _afterEngineLoaded(config) { if (cc._initDebugSetting) cc._initDebugSetting(config[cc.game.CONFIG_KEY.debugMode]); cc._engineLoaded = true; if (_engineLoadedCallback) _engineLoadedCallback(); } function _load(config) { var self = this; var CONFIG_KEY = cc.game.CONFIG_KEY, engineDir = config[CONFIG_KEY.engineDir], loader = cc.loader; if (cc.Class) { _afterEngineLoaded(config); } else { var ccModulesPath = cc.path.join(engineDir, "moduleConfig.json"); loader.loadJson(ccModulesPath, function (err, modulesJson) { if (err) throw new Error(err); var modules = config["modules"] || []; var moduleMap = modulesJson["module"]; var jsList = []; if (cc.sys.capabilities["opengl"] && modules.indexOf("base4webgl") < 0) modules.splice(0, 0, "base4webgl"); else if (modules.indexOf("core") < 0) modules.splice(0, 0, "core"); for (var i = 0, li = modules.length; i < li; i++) { var arr = _getJsListOfModule(moduleMap, modules[i], engineDir); if (arr) jsList = jsList.concat(arr); } cc.loader.loadJsWithImg(jsList, function (err) { if (err) throw err; _afterEngineLoaded(config); }); }); } } function _windowLoaded() { this.removeEventListener('load', _windowLoaded, false); _load(cc.game.config); } cc.initEngine = function (config, cb) { if (_engineInitCalled) { var previousCallback = _engineLoadedCallback; _engineLoadedCallback = function () { previousCallback && previousCallback(); cb && cb(); } return; } _engineLoadedCallback = cb; if (!cc.game.config && config) { cc.game.config = config; } else if (!cc.game.config) { cc.game._loadConfig(); } config = cc.game.config; _determineRenderType(config); document.body ? _load(config) : cc._addEventListener(window, 'load', _windowLoaded, false); _engineInitCalled = true; }; })(); cc.game = { DEBUG_MODE_NONE: 0, DEBUG_MODE_INFO: 1, DEBUG_MODE_WARN: 2, DEBUG_MODE_ERROR: 3, DEBUG_MODE_INFO_FOR_WEB_PAGE: 4, DEBUG_MODE_WARN_FOR_WEB_PAGE: 5, DEBUG_MODE_ERROR_FOR_WEB_PAGE: 6, EVENT_HIDE: "game_on_hide", EVENT_SHOW: "game_on_show", EVENT_RESIZE: "game_on_resize", EVENT_RENDERER_INITED: "renderer_inited", RENDER_TYPE_CANVAS: 0, RENDER_TYPE_WEBGL: 1, RENDER_TYPE_OPENGL: 2, _eventHide: null, _eventShow: null, CONFIG_KEY: { width: "width", height: "height", engineDir: "engineDir", modules: "modules", debugMode: "debugMode", showFPS: "showFPS", frameRate: "frameRate", id: "id", renderMode: "renderMode", jsList: "jsList" }, _paused: true,//whether the game is paused _prepareCalled: false,//whether the prepare function has been called _prepared: false,//whether the engine has prepared _rendererInitialized: false, _renderContext: null, _intervalId: null,//interval target of main _lastTime: null, _frameTime: null, frame: null, container: null, canvas: null, config: null, onStart: null, onStop: null, setFrameRate: function (frameRate) { var self = this, config = self.config, CONFIG_KEY = self.CONFIG_KEY; config[CONFIG_KEY.frameRate] = frameRate; if (self._intervalId) window.cancelAnimationFrame(self._intervalId); self._paused = true; self._setAnimFrame(); self._runMainLoop(); }, step: function () { cc.director.mainLoop(); }, pause: function () { if (this._paused) return; this._paused = true; if (cc.audioEngine) { cc.audioEngine.stopAllEffects(); cc.audioEngine.pauseMusic(); } if (this._intervalId) window.cancelAnimationFrame(this._intervalId); this._intervalId = 0; }, resume: function () { if (!this._paused) return; this._paused = false; if (cc.audioEngine) { cc.audioEngine.resumeMusic(); } this._runMainLoop(); }, isPaused: function () { return this._paused; }, restart: function () { cc.director.popToSceneStackLevel(0); cc.audioEngine && cc.audioEngine.end(); cc.game.onStart(); }, end: function () { close(); }, prepare: function (cb) { var self = this, config = self.config, CONFIG_KEY = self.CONFIG_KEY; this._loadConfig(); if (this._prepared) { if (cb) cb(); return; } if (this._prepareCalled) { return; } if (cc._engineLoaded) { this._prepareCalled = true; this._initRenderer(config[CONFIG_KEY.width], config[CONFIG_KEY.height]); cc.view = cc.EGLView._getInstance(); cc.director = cc.Director._getInstance(); if (cc.director.setOpenGLView) cc.director.setOpenGLView(cc.view); cc.winSize = cc.director.getWinSize(); this._initEvents(); this._setAnimFrame(); this._runMainLoop(); var jsList = config[CONFIG_KEY.jsList]; if (jsList) { cc.loader.loadJsWithImg(jsList, function (err) { if (err) throw new Error(err); self._prepared = true; if (cb) cb(); }); } else { if (cb) cb(); } return; } cc.initEngine(this.config, function () { self.prepare(cb); }); }, run: function (config, onStart) { if (typeof config === 'function') { cc.game.onStart = config; } else { if (config) { if (typeof config === 'string') { if (!cc.game.config) this._loadConfig(); cc.game.config[cc.game.CONFIG_KEY.id] = config; } else { cc.game.config = config; } } if (typeof onStart === 'function') { cc.game.onStart = onStart; } } this.prepare(cc.game.onStart && cc.game.onStart.bind(cc.game)); }, _setAnimFrame: function () { this._lastTime = new Date(); this._frameTime = 1000 / cc.game.config[cc.game.CONFIG_KEY.frameRate]; if((cc.sys.os === cc.sys.OS_IOS && cc.sys.browserType === cc.sys.BROWSER_TYPE_WECHAT) || cc.game.config[cc.game.CONFIG_KEY.frameRate] !== 60) { window.requestAnimFrame = this._stTime; window.cancelAnimationFrame = this._ctTime; } else { window.requestAnimFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || this._stTime; window.cancelAnimationFrame = window.cancelAnimationFrame || window.cancelRequestAnimationFrame || window.msCancelRequestAnimationFrame || window.mozCancelRequestAnimationFrame || window.oCancelRequestAnimationFrame || window.webkitCancelRequestAnimationFrame || window.msCancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.oCancelAnimationFrame || this._ctTime; } }, _stTime: function(callback){ var currTime = new Date().getTime(); var timeToCall = Math.max(0, cc.game._frameTime - (currTime - cc.game._lastTime)); var id = window.setTimeout(function() { callback(); }, timeToCall); cc.game._lastTime = currTime + timeToCall; return id; }, _ctTime: function(id){ window.clearTimeout(id); }, _runMainLoop: function () { var self = this, callback, config = self.config, CONFIG_KEY = self.CONFIG_KEY, director = cc.director; d