Skip to content

Commit ea7994d

Browse files
Merge branch 'develop' into program-state
2 parents 781c3c8 + 2083141 commit ea7994d

File tree

75 files changed

+6782
-3698
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+6782
-3698
lines changed

CCBoot.js

+86-36
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,33 @@ cc.path = /** @lends cc.path# */{
583583
* @see cc.loader
584584
*/
585585

586+
var imagePool = {
587+
_pool: new Array(10),
588+
_MAX: 10,
589+
_smallImg: "data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=",
590+
591+
count: 0,
592+
get: function () {
593+
if (this.count > 0) {
594+
this.count--;
595+
var result = this._pool[this.count];
596+
this._pool[this.count] = null;
597+
return result;
598+
}
599+
else {
600+
return new Image();
601+
}
602+
},
603+
put: function (img) {
604+
var pool = this._pool;
605+
if (img instanceof HTMLImageElement && this.count < this._MAX) {
606+
img.src = this._smallImg;
607+
pool[this.count] = img;
608+
this.count++;
609+
}
610+
}
611+
};
612+
586613
/**
587614
* Singleton instance of cc.Loader.
588615
* @name cc.loader
@@ -867,7 +894,7 @@ cc.loader = (function () {
867894
* @param {function} callback
868895
* @returns {Image}
869896
*/
870-
loadImg: function (url, option, callback) {
897+
loadImg: function (url, option, callback, img) {
871898
var opt = {
872899
isCrossOrigin: true
873900
};
@@ -876,10 +903,10 @@ cc.loader = (function () {
876903
else if (option !== undefined)
877904
callback = option;
878905

879-
var img = this.getRes(url);
880-
if (img) {
881-
callback && callback(null, img);
882-
return img;
906+
var texture = this.getRes(url);
907+
if (texture) {
908+
callback && callback(null, texture);
909+
return null;
883910
}
884911

885912
var queue = _queue[url];
@@ -888,18 +915,16 @@ cc.loader = (function () {
888915
return queue.img;
889916
}
890917

891-
img = new Image();
918+
img = img || imagePool.get();
892919
if (opt.isCrossOrigin && location.origin !== "file://")
893920
img.crossOrigin = "Anonymous";
921+
else
922+
img.crossOrigin = null;
894923

895924
var loadCallback = function () {
896925
this.removeEventListener('load', loadCallback, false);
897926
this.removeEventListener('error', errorCallback, false);
898927

899-
if (!_urlRegExp.test(url)) {
900-
cc.loader.cache[url] = img;
901-
}
902-
903928
var queue = _queue[url];
904929
if (queue) {
905930
var callbacks = queue.callbacks;
@@ -912,16 +937,21 @@ cc.loader = (function () {
912937
queue.img = null;
913938
delete _queue[url];
914939
}
940+
941+
if (cc._renderType === cc.game.RENDER_TYPE_WEBGL) {
942+
imagePool.put(img);
943+
}
915944
};
916945

917946
var self = this;
918947
var errorCallback = function () {
948+
this.removeEventListener('load', loadCallback, false);
919949
this.removeEventListener('error', errorCallback, false);
920950

921-
if (img.crossOrigin && img.crossOrigin.toLowerCase() === "anonymous") {
951+
if (window.location.protocol !== 'https:' && img.crossOrigin && img.crossOrigin.toLowerCase() === "anonymous") {
922952
opt.isCrossOrigin = false;
923953
self.release(url);
924-
cc.loader.loadImg(url, opt, callback);
954+
cc.loader.loadImg(url, opt, callback, img);
925955
} else {
926956
var queue = _queue[url];
927957
if (queue) {
@@ -935,6 +965,10 @@ cc.loader = (function () {
935965
queue.img = null;
936966
delete _queue[url];
937967
}
968+
969+
if (cc._renderType === cc.game.RENDER_TYPE_WEBGL) {
970+
imagePool.put(img);
971+
}
938972
}
939973
};
940974

@@ -1610,6 +1644,7 @@ var _initSys = function () {
16101644
sys.BROWSER_TYPE_WECHAT = "wechat";
16111645
sys.BROWSER_TYPE_ANDROID = "androidbrowser";
16121646
sys.BROWSER_TYPE_IE = "ie";
1647+
sys.BROWSER_TYPE_QQ_APP = "qq"; // QQ App
16131648
sys.BROWSER_TYPE_QQ = "qqbrowser";
16141649
sys.BROWSER_TYPE_MOBILE_QQ = "mqqbrowser";
16151650
sys.BROWSER_TYPE_UC = "ucbrowser";
@@ -1727,13 +1762,13 @@ var _initSys = function () {
17271762
/* Determine the browser type */
17281763
(function(){
17291764
var typeReg1 = /micromessenger|mqqbrowser|sogou|qzone|liebao|ucbrowser|360 aphone|360browser|baiduboxapp|baidubrowser|maxthon|mxbrowser|trident|miuibrowser/i;
1730-
var typeReg2 = /qqbrowser|chrome|safari|firefox|opr|oupeng|opera/i;
1765+
var typeReg2 = /qqbrowser|qq|chrome|safari|firefox|opr|oupeng|opera/i;
17311766
var browserTypes = typeReg1.exec(ua);
17321767
if(!browserTypes) browserTypes = typeReg2.exec(ua);
17331768
var browserType = browserTypes ? browserTypes[0] : sys.BROWSER_TYPE_UNKNOWN;
17341769
if (browserType === 'micromessenger')
17351770
browserType = sys.BROWSER_TYPE_WECHAT;
1736-
else if (browserType === "safari" && (ua.match(/android.*applewebkit/)))
1771+
else if (browserType === "safari" && isAndroid)
17371772
browserType = sys.BROWSER_TYPE_ANDROID;
17381773
else if (browserType === "trident")
17391774
browserType = sys.BROWSER_TYPE_IE;
@@ -1756,8 +1791,8 @@ var _initSys = function () {
17561791
sys.browserVersion = "";
17571792
/* Determine the browser version number */
17581793
(function(){
1759-
var versionReg1 = /(micromessenger|qq|mx|maxthon|baidu|sogou)(mobile)?(browser)?\/?([\d.]+)/i;
1760-
var versionReg2 = /(msie |rv:|firefox|chrome|ucbrowser|oupeng|opera|opr|safari|miui)(mobile)?(browser)?\/?([\d.]+)/i;
1794+
var versionReg1 = /(mqqbrowser|micromessenger|sogou|qzone|liebao|maxthon|mxbrowser|baidu)(mobile)?(browser)?\/?([\d.]+)/i;
1795+
var versionReg2 = /(msie |rv:|firefox|chrome|ucbrowser|qq|oupeng|opera|opr|safari|miui)(mobile)?(browser)?\/?([\d.]+)/i;
17611796
var tmp = ua.match(versionReg1);
17621797
if(!tmp) tmp = ua.match(versionReg2);
17631798
sys.browserVersion = tmp ? tmp[4] : "";
@@ -1843,7 +1878,7 @@ var _initSys = function () {
18431878
var tmpCanvas = document.createElement("CANVAS");
18441879
try{
18451880
var context = cc.create3DContext(tmpCanvas);
1846-
if (context && context.getShaderPrecisionFormat) {
1881+
if (context) {
18471882
_supportWebGL = true;
18481883
}
18491884

@@ -2329,6 +2364,7 @@ cc.game = /** @lends cc.game# */{
23292364
config[CONFIG_KEY.frameRate] = frameRate;
23302365
if (self._intervalId)
23312366
window.cancelAnimationFrame(self._intervalId);
2367+
self._intervalId = 0;
23322368
self._paused = true;
23332369
self._setAnimFrame();
23342370
self._runMainLoop();
@@ -2349,8 +2385,7 @@ cc.game = /** @lends cc.game# */{
23492385
this._paused = true;
23502386
// Pause audio engine
23512387
if (cc.audioEngine) {
2352-
cc.audioEngine.stopAllEffects();
2353-
cc.audioEngine.pauseMusic();
2388+
cc.audioEngine._pausePlaying();
23542389
}
23552390
// Pause main loop
23562391
if (this._intervalId)
@@ -2366,7 +2401,7 @@ cc.game = /** @lends cc.game# */{
23662401
this._paused = false;
23672402
// Resume audio engine
23682403
if (cc.audioEngine) {
2369-
cc.audioEngine.resumeMusic();
2404+
cc.audioEngine._resumePlaying();
23702405
}
23712406
// Resume main loop
23722407
this._runMainLoop();
@@ -2512,8 +2547,9 @@ cc.game = /** @lends cc.game# */{
25122547
// @Time ticker section
25132548
_setAnimFrame: function () {
25142549
this._lastTime = new Date();
2515-
this._frameTime = 1000 / cc.game.config[cc.game.CONFIG_KEY.frameRate];
2516-
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) {
2550+
var frameRate = cc.game.config[cc.game.CONFIG_KEY.frameRate];
2551+
this._frameTime = 1000 / frameRate;
2552+
if (frameRate !== 60 && frameRate !== 30) {
25172553
window.requestAnimFrame = this._stTime;
25182554
window.cancelAnimationFrame = this._ctTime;
25192555
}
@@ -2551,20 +2587,26 @@ cc.game = /** @lends cc.game# */{
25512587
//Run game.
25522588
_runMainLoop: function () {
25532589
var self = this, callback, config = self.config, CONFIG_KEY = self.CONFIG_KEY,
2554-
director = cc.director;
2590+
director = cc.director,
2591+
skip = true, frameRate = config[CONFIG_KEY.frameRate];
25552592

25562593
director.setDisplayStats(config[CONFIG_KEY.showFPS]);
25572594

25582595
callback = function () {
25592596
if (!self._paused) {
2597+
if (frameRate === 30) {
2598+
if (skip = !skip) {
2599+
self._intervalId = window.requestAnimFrame(callback);
2600+
return;
2601+
}
2602+
}
2603+
25602604
director.mainLoop();
2561-
if (self._intervalId)
2562-
window.cancelAnimationFrame(self._intervalId);
25632605
self._intervalId = window.requestAnimFrame(callback);
25642606
}
25652607
};
25662608

2567-
window.requestAnimFrame(callback);
2609+
self._intervalId = window.requestAnimFrame(callback);
25682610
self._paused = false;
25692611
},
25702612

@@ -2660,7 +2702,7 @@ cc.game = /** @lends cc.game# */{
26602702
}
26612703
width = width || element.clientWidth;
26622704
height = height || element.clientHeight;
2663-
this.canvas = cc._canvas = localCanvas = document.createElement("CANVAS");
2705+
this.canvas = cc._canvas = localCanvas = cc.$(document.createElement("CANVAS"));
26642706
this.container = cc.container = localContainer = document.createElement("DIV");
26652707
element.appendChild(localContainer);
26662708
}
@@ -2708,7 +2750,7 @@ cc.game = /** @lends cc.game# */{
27082750
},
27092751

27102752
_initEvents: function () {
2711-
var win = window, self = this, hidden, visibilityChange, _undef = "undefined";
2753+
var win = window, hidden;
27122754

27132755
this._eventHide = this._eventHide || new cc.EventCustom(this.EVENT_HIDE);
27142756
this._eventHide.setUserData(this);
@@ -2721,18 +2763,21 @@ cc.game = /** @lends cc.game# */{
27212763

27222764
if (!cc.isUndefined(document.hidden)) {
27232765
hidden = "hidden";
2724-
visibilityChange = "visibilitychange";
27252766
} else if (!cc.isUndefined(document.mozHidden)) {
27262767
hidden = "mozHidden";
2727-
visibilityChange = "mozvisibilitychange";
27282768
} else if (!cc.isUndefined(document.msHidden)) {
27292769
hidden = "msHidden";
2730-
visibilityChange = "msvisibilitychange";
27312770
} else if (!cc.isUndefined(document.webkitHidden)) {
27322771
hidden = "webkitHidden";
2733-
visibilityChange = "webkitvisibilitychange";
27342772
}
27352773

2774+
var changeList = [
2775+
"visibilitychange",
2776+
"mozvisibilitychange",
2777+
"msvisibilitychange",
2778+
"webkitvisibilitychange",
2779+
"qbrowserVisibilityChange"
2780+
];
27362781
var onHidden = function () {
27372782
if (cc.eventManager && cc.game._eventHide)
27382783
cc.eventManager.dispatchEvent(cc.game._eventHide);
@@ -2743,10 +2788,15 @@ cc.game = /** @lends cc.game# */{
27432788
};
27442789

27452790
if (hidden) {
2746-
document.addEventListener(visibilityChange, function () {
2747-
if (document[hidden]) onHidden();
2748-
else onShow();
2749-
}, false);
2791+
for (var i=0; i<changeList.length; i++) {
2792+
document.addEventListener(changeList[i], function (event) {
2793+
var visible = document[hidden];
2794+
// QQ App
2795+
visible = visible || event["hidden"];
2796+
if (visible) onHidden();
2797+
else onShow();
2798+
}, false);
2799+
}
27502800
} else {
27512801
win.addEventListener("blur", onHidden, false);
27522802
win.addEventListener("focus", onShow, false);

README.mdown

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Cocos2d-html5
22
==================
33

4-
[Cocos2d-html5][1] is a cross-platform 2D game engine written in Javascript, based on [Cocos2d-X][2] and licensed under MIT.
4+
[Cocos2d-html5][1] is a cross-platform 2D game engine written in JavaScript, based on [Cocos2d-X][2] and licensed under MIT.
55
It incorporates the same high level api as “Cocos2d JS-binding engine” and compatible with Cocos2d-X.
66
It currently supports canvas and WebGL renderer.
77

@@ -49,4 +49,4 @@ Contact us
4949
[5]: http://forum.cocos2d-x.org "http://forum.cocos2d-x.org"
5050
[6]: http://www.twitter.com/cocos2dhtml5 "http://www.twitter.com/cocos2dhtml5"
5151
[7]: http://t.sina.com.cn/cocos2dhtml5 "http://t.sina.com.cn/cocos2dhtml5"
52-
[8]: http://bower.io "http://bower.io"
52+
[8]: http://bower.io "http://bower.io"

cocos2d/actions/CCActionInterval.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3363,7 +3363,7 @@ cc.Animate = cc.ActionInterval.extend(/** @lends cc.Animate# */{
33633363
startWithTarget: function (target) {
33643364
cc.ActionInterval.prototype.startWithTarget.call(this, target);
33653365
if (this._animation.getRestoreOriginalFrame())
3366-
this._origFrame = target.displayFrame();
3366+
this._origFrame = target.getSpriteFrame();
33673367
this._nextFrame = 0;
33683368
this._executedLoops = 0;
33693369
},

0 commit comments

Comments
 (0)