cocos2dx
Version:
cocos2dx JS for module usage
1,330 lines • 757 kB
JavaScript
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