Skip to content

Commit 6b316e9

Browse files
committed
Merge branch 'develop' into improve-editbox-touch-handling
2 parents a3f21e4 + 774e89a commit 6b316e9

File tree

66 files changed

+6978
-3632
lines changed

Some content is hidden

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

66 files changed

+6978
-3632
lines changed

CCBoot.js

Lines changed: 84 additions & 33 deletions
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();
@@ -2511,8 +2547,9 @@ cc.game = /** @lends cc.game# */{
25112547
// @Time ticker section
25122548
_setAnimFrame: function () {
25132549
this._lastTime = new Date();
2514-
this._frameTime = 1000 / cc.game.config[cc.game.CONFIG_KEY.frameRate];
2515-
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) {
25162553
window.requestAnimFrame = this._stTime;
25172554
window.cancelAnimationFrame = this._ctTime;
25182555
}
@@ -2550,20 +2587,26 @@ cc.game = /** @lends cc.game# */{
25502587
//Run game.
25512588
_runMainLoop: function () {
25522589
var self = this, callback, config = self.config, CONFIG_KEY = self.CONFIG_KEY,
2553-
director = cc.director;
2590+
director = cc.director,
2591+
skip = true, frameRate = config[CONFIG_KEY.frameRate];
25542592

25552593
director.setDisplayStats(config[CONFIG_KEY.showFPS]);
25562594

25572595
callback = function () {
25582596
if (!self._paused) {
2597+
if (frameRate === 30) {
2598+
if (skip = !skip) {
2599+
self._intervalId = window.requestAnimFrame(callback);
2600+
return;
2601+
}
2602+
}
2603+
25592604
director.mainLoop();
2560-
if (self._intervalId)
2561-
window.cancelAnimationFrame(self._intervalId);
25622605
self._intervalId = window.requestAnimFrame(callback);
25632606
}
25642607
};
25652608

2566-
window.requestAnimFrame(callback);
2609+
self._intervalId = window.requestAnimFrame(callback);
25672610
self._paused = false;
25682611
},
25692612

@@ -2659,7 +2702,7 @@ cc.game = /** @lends cc.game# */{
26592702
}
26602703
width = width || element.clientWidth;
26612704
height = height || element.clientHeight;
2662-
this.canvas = cc._canvas = localCanvas = document.createElement("CANVAS");
2705+
this.canvas = cc._canvas = localCanvas = cc.$(document.createElement("CANVAS"));
26632706
this.container = cc.container = localContainer = document.createElement("DIV");
26642707
element.appendChild(localContainer);
26652708
}
@@ -2707,7 +2750,7 @@ cc.game = /** @lends cc.game# */{
27072750
},
27082751

27092752
_initEvents: function () {
2710-
var win = window, self = this, hidden, visibilityChange, _undef = "undefined";
2753+
var win = window, hidden;
27112754

27122755
this._eventHide = this._eventHide || new cc.EventCustom(this.EVENT_HIDE);
27132756
this._eventHide.setUserData(this);
@@ -2720,18 +2763,21 @@ cc.game = /** @lends cc.game# */{
27202763

27212764
if (!cc.isUndefined(document.hidden)) {
27222765
hidden = "hidden";
2723-
visibilityChange = "visibilitychange";
27242766
} else if (!cc.isUndefined(document.mozHidden)) {
27252767
hidden = "mozHidden";
2726-
visibilityChange = "mozvisibilitychange";
27272768
} else if (!cc.isUndefined(document.msHidden)) {
27282769
hidden = "msHidden";
2729-
visibilityChange = "msvisibilitychange";
27302770
} else if (!cc.isUndefined(document.webkitHidden)) {
27312771
hidden = "webkitHidden";
2732-
visibilityChange = "webkitvisibilitychange";
27332772
}
27342773

2774+
var changeList = [
2775+
"visibilitychange",
2776+
"mozvisibilitychange",
2777+
"msvisibilitychange",
2778+
"webkitvisibilitychange",
2779+
"qbrowserVisibilityChange"
2780+
];
27352781
var onHidden = function () {
27362782
if (cc.eventManager && cc.game._eventHide)
27372783
cc.eventManager.dispatchEvent(cc.game._eventHide);
@@ -2742,10 +2788,15 @@ cc.game = /** @lends cc.game# */{
27422788
};
27432789

27442790
if (hidden) {
2745-
document.addEventListener(visibilityChange, function () {
2746-
if (document[hidden]) onHidden();
2747-
else onShow();
2748-
}, 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+
}
27492800
} else {
27502801
win.addEventListener("blur", onHidden, false);
27512802
win.addEventListener("focus", onShow, false);

README.mdown

Lines changed: 2 additions & 2 deletions
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/audio/CCAudio.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ cc.Audio = cc.Class.extend({
122122
cc.Audio.touchPlayList.push({ loop: loop, offset: offset, audio: this._element });
123123
}
124124

125-
if (cc.Audio.bindTouch === false && this._element.paused) {
125+
if (cc.Audio.bindTouch === false) {
126126
cc.Audio.bindTouch = true;
127127
// Listen to the touchstart body event and play the audio when necessary.
128128
cc.game.canvas.addEventListener('touchstart', cc.Audio.touchStart);
@@ -352,6 +352,15 @@ cc.Audio.WebAudio.prototype = {
352352
if (SWA) {
353353
var context = new (window.AudioContext || window.webkitAudioContext || window.mozAudioContext)();
354354
cc.Audio._context = context;
355+
// check context integrity
356+
if (
357+
!context["createBufferSource"] ||
358+
!context["createGain"] ||
359+
!context["destination"] ||
360+
!context["decodeAudioData"]
361+
) {
362+
throw 'context is incomplete';
363+
}
355364
if (polyfill.DELAY_CREATE_CTX)
356365
setTimeout(function () {
357366
context = new (window.AudioContext || window.webkitAudioContext || window.mozAudioContext)();

cocos2d/clipping-nodes/CCClippingNode.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,6 @@ cc.ClippingNode = cc.Node.extend(/** @lends cc.ClippingNode# */{
128128
},
129129

130130
visit: function (parent) {
131-
if (!this._visible)
132-
return;
133-
134131
this._renderCmd.clippingVisit(parent && parent._renderCmd);
135132
},
136133

cocos2d/clipping-nodes/CCClippingNodeWebGLRenderCmd.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@
2222
THE SOFTWARE.
2323
****************************************************************************/
2424

25+
function setProgram (node, program) {
26+
node.shaderProgram = program;
27+
28+
var children = node.children;
29+
if (!children)
30+
return;
31+
32+
for (var i = 0; i < children.length; i++)
33+
setProgram(children[i], program);
34+
}
35+
2536
// ------------------------------- ClippingNode's WebGL render cmd ------------------------------
2637
(function () {
2738
cc.ClippingNode.WebGLRenderCmd = function (renderable) {

cocos2d/core/CCDirector.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ cc.Director = cc.Class.extend(/** @lends cc.Director# */{
183183
convertToGL: function (uiPoint) {
184184
var docElem = document.documentElement;
185185
var view = cc.view;
186-
var box = element.getBoundingClientRect();
186+
var box = docElem.getBoundingClientRect();
187187
box.left += window.pageXOffset - docElem.clientLeft;
188188
box.top += window.pageYOffset - docElem.clientTop;
189189
var x = view._devicePixelRatio * (uiPoint.x - box.left);
@@ -202,7 +202,7 @@ cc.Director = cc.Class.extend(/** @lends cc.Director# */{
202202
convertToUI: function (glPoint) {
203203
var docElem = document.documentElement;
204204
var view = cc.view;
205-
var box = element.getBoundingClientRect();
205+
var box = docElem.getBoundingClientRect();
206206
box.left += window.pageXOffset - docElem.clientLeft;
207207
box.top += window.pageYOffset - docElem.clientTop;
208208
var uiPoint = {x: 0, y: 0};
@@ -939,7 +939,7 @@ cc.Director.PROJECTION_3D = 1;
939939
cc.Director.PROJECTION_CUSTOM = 3;
940940

941941
/**
942-
* Constant for default projection of cc.Director, default projection is 3D projection
942+
* Constant for default projection of cc.Director, default projection is 2D projection
943943
* @constant
944944
* @type {Number}
945945
*/

cocos2d/core/CCDirectorWebGL.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ cc.game.addEventListener(cc.game.EVENT_RENDERER_INITED, function () {
177177
};
178178

179179
_p.getZEye = function () {
180-
return (this._winSizeInPoints.height / 1.1566 );
180+
return (this._winSizeInPoints.height / 1.15469993750 );
181181
};
182182

183183
_p.setViewport = function () {

0 commit comments

Comments
 (0)