From 22e4771f8829454b1b26c6c1d8fb549ea933a892 Mon Sep 17 00:00:00 2001 From: joshuastray Date: Mon, 30 Jun 2014 21:39:16 +0800 Subject: [PATCH 01/15] add provider for facebook sdk --- .../js-tests/project/proj.android/AndroidManifest.xml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/samples/js-tests/project/proj.android/AndroidManifest.xml b/samples/js-tests/project/proj.android/AndroidManifest.xml index 10b360053b..885d613c60 100644 --- a/samples/js-tests/project/proj.android/AndroidManifest.xml +++ b/samples/js-tests/project/proj.android/AndroidManifest.xml @@ -32,7 +32,10 @@ - + + - + + + + + From e77b1fba62e18c0069e140b60e72dda1be833555 Mon Sep 17 00:00:00 2001 From: wuzhiming Date: Mon, 30 Jun 2014 21:59:28 +0800 Subject: [PATCH 02/15] fixed the iap test bug --- .../ExtensionsTest/PluginXTest/IOSIAPTest.js | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/samples/js-tests/src/ExtensionsTest/PluginXTest/IOSIAPTest.js b/samples/js-tests/src/ExtensionsTest/PluginXTest/IOSIAPTest.js index 5a84aff2e6..aaff011fa0 100644 --- a/samples/js-tests/src/ExtensionsTest/PluginXTest/IOSIAPTest.js +++ b/samples/js-tests/src/ExtensionsTest/PluginXTest/IOSIAPTest.js @@ -45,7 +45,6 @@ var IAPTestLayer = PluginXTest.extend({ _serverMode: false, onEnter: function () { this._super(); - this.addCloseBtn(); this.initPlugin(); this.addMenuItem(); this.initToast(); @@ -53,7 +52,7 @@ var IAPTestLayer = PluginXTest.extend({ initPlugin: function () { var pluginManager = plugin.PluginManager.getInstance(); this.PluginIAP = pluginManager.loadPlugin("IOSIAP"); - this.PluginIAP.setResultListener(this); + this.PluginIAP.setListener(this); }, addMenuItem: function () { var payMenu = cc.Menu.create(); @@ -77,19 +76,6 @@ var IAPTestLayer = PluginXTest.extend({ payMenu.y = 0; this.addChild(payMenu); }, - addCloseBtn: function () { - var pCloseItem = cc.MenuItemImage.create( - "CloseNormal.png", - "CloseSelected.png", - this.closeFunction, - this); - pCloseItem.setPosition(cc.p(cc.winSize.width - 20, 20)); - - // create menu, it's an autorelease object - var pMenu = cc.Menu.create(pCloseItem); - pMenu.setPosition(cc.p(0, 0)); - this.addChild(pMenu, 1); - }, closeFunction: function (sender) { var scene = new ExtensionsTestScene(); scene.runThisTest(); @@ -105,13 +91,36 @@ var IAPTestLayer = PluginXTest.extend({ this.toastLayer.retain(); this.toastLayer.setColor(cc.color(100, 100, 100, 100)); }, + addTouch: function (bool) { + if (bool) { + var self = this.toastLayer; + this.listener = cc.EventListener.create({ + event: cc.EventListener.TOUCH_ONE_BY_ONE, + swallowTouches: true, + onTouchBegan: function (touch, event) { + return true; + }, + onTouchMoved: function (touch, event) { + }, + onTouchEnded: function (touch, event) { + }, + onTouchCancelled: function (touch, event) { + } + }); + cc.eventManager.addListener(this.listener, self); + } else { + cc.eventManager.removeListener(this.listener); + } + }, toggleToast: function (show) { if (show) { if (!this.getChildByTag(TAG_TOAST)) { this.addChild(this.toastLayer); + this.addTouch(true); } } else { this.toastLayer.removeFromParent(true); + this.addTouch(false); } }, menuCallBack: function (sender) { @@ -185,8 +194,9 @@ var IAPTestLayer = PluginXTest.extend({ postServerData: function (data) { var that = this; var xhr = cc.loader.getXMLHttpRequest(); + //replace to your own server address - xhr.open("POST", "http://192.168.52.22:8888/start"); + xhr.open("POST", "http://192.168.52.38:8888/start"); that.toggleToast(true); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { From 2f81c5f7266cbb705a60df7668a6a767c1829ee0 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 1 Jul 2014 00:39:04 +0800 Subject: [PATCH 03/15] Fixed #3547: Correctly recognize Mac OSX as a desktop platform --- .../js-bindings/bindings/script/jsb_boot.js | 63 ++++++++++--------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/frameworks/js-bindings/bindings/script/jsb_boot.js b/frameworks/js-bindings/bindings/script/jsb_boot.js index 3bc334af13..01f964b801 100644 --- a/frameworks/js-bindings/bindings/script/jsb_boot.js +++ b/frameworks/js-bindings/bindings/script/jsb_boot.js @@ -978,7 +978,38 @@ cc._initSys = function(config, CONFIG_KEY){ * @type Boolean */ locSys.isNative = true; - locSys.isMobile = __getPlatform() == "mobile"; + + /** Get the os of system */ + locSys.os = __getOS(); + + // Forces the garbage collector + locSys.garbageCollect = function() { + __jsc__.garbageCollect(); + }; + + // Dumps rooted objects + locSys.dumpRoot = function() { + __jsc__.dumpRoot(); + }; + + // restarts the JS VM + locSys.restartVM = function() { + __restartVM(); + }; + + locSys.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 += "capabilities : " + JSON.stringify(self.capabilities) + "\r\n"; + str += "os : " + self.os + "\r\n"; + cc.log(str); + } + + locSys.isMobile = (locSys.os == locSys.OS_ANDROID || locSys.os == locSys.OS_IOS) ? true : false; + locSys.language = (function(){ var language = cc.Application.getInstance().getCurrentLanguage(); switch(language){ @@ -1004,6 +1035,7 @@ cc._initSys = function(config, CONFIG_KEY){ locSys.browserType = null;//null in jsb var capabilities = locSys.capabilities = {"opengl":true}; + cc.log("ISMOBILE : " + locSys.isMobile); if( locSys.isMobile ) { capabilities["accelerometer"] = true; capabilities["touches"] = true; @@ -1013,33 +1045,8 @@ cc._initSys = function(config, CONFIG_KEY){ capabilities["mouse"] = true; } - /** Get the os of system */ - locSys.os = __getOS(); - - // Forces the garbage collector - locSys.garbageCollect = function() { - __jsc__.garbageCollect(); - }; - - // Dumps rooted objects - locSys.dumpRoot = function() { - __jsc__.dumpRoot(); - }; - - // restarts the JS VM - locSys.restartVM = function() { - __restartVM(); - }; - - locSys.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 += "capabilities : " + JSON.stringify(self.capabilities) + "\r\n"; - str += "os : " + self.os + "\r\n"; - cc.log(str); + if(locSys.os == locSys.OS_OSX) { + capabilities["touches"] = true; } }; From 1747bd734e435f4f3cfb1b4e95953f26312259b4 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 1 Jul 2014 10:13:44 +0800 Subject: [PATCH 04/15] Fixed #3547: Remove touch capability on Mac and log --- frameworks/js-bindings/bindings/script/jsb_boot.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/frameworks/js-bindings/bindings/script/jsb_boot.js b/frameworks/js-bindings/bindings/script/jsb_boot.js index 01f964b801..c27c4ae308 100644 --- a/frameworks/js-bindings/bindings/script/jsb_boot.js +++ b/frameworks/js-bindings/bindings/script/jsb_boot.js @@ -1035,7 +1035,6 @@ cc._initSys = function(config, CONFIG_KEY){ locSys.browserType = null;//null in jsb var capabilities = locSys.capabilities = {"opengl":true}; - cc.log("ISMOBILE : " + locSys.isMobile); if( locSys.isMobile ) { capabilities["accelerometer"] = true; capabilities["touches"] = true; @@ -1044,10 +1043,6 @@ cc._initSys = function(config, CONFIG_KEY){ capabilities["keyboard"] = true; capabilities["mouse"] = true; } - - if(locSys.os == locSys.OS_OSX) { - capabilities["touches"] = true; - } }; //+++++++++++++++++++++++++something about sys end+++++++++++++++++++++++++++++ From 0a92477a9e4fe7b7a31db440aad8cc274c0f3097 Mon Sep 17 00:00:00 2001 From: joshuastray Date: Tue, 1 Jul 2014 10:38:56 +0800 Subject: [PATCH 05/15] feature #5592: use rendertexture to capture screen in photo share testcase --- samples/js-tests/res/Images/cocos-html5.png | Bin 0 -> 54970 bytes .../PluginXTest/FacebookShareTest.js | 42 +++++++++++++++--- samples/js-tests/src/tests_resources.js | 1 + 3 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 samples/js-tests/res/Images/cocos-html5.png diff --git a/samples/js-tests/res/Images/cocos-html5.png b/samples/js-tests/res/Images/cocos-html5.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7c7118e32a1a8d78de771b8ad0f51576e45f23 GIT binary patch literal 54970 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 literal 0 HcmV?d00001 diff --git a/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js b/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js index f4981de992..7354fccbf3 100644 --- a/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js +++ b/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js @@ -50,11 +50,15 @@ var FacebookShareTest = PluginXTest.extend({ for (var action in buttons) { var label = cc.LabelTTF.create(action, "Arial", 24); var item = cc.MenuItemLabel.create(label, this[buttons[action]], this); - item.setPosition(winSize.width / 2, winSize.height - top); + item.setPosition(winSize.width * 1/3 , winSize.height - top); menu.addChild(item); top += 50; } + var logo = cc.Sprite.create(s_html5_logo); + logo.setPosition(winSize.width * 2/3, winSize.height / 2); + this.addChild(logo); + this._agentManager = plugin.AgentManager.getInstance(); }, @@ -87,13 +91,37 @@ var FacebookShareTest = PluginXTest.extend({ }, onSharePhoto : function(){ - var map = { - "dialog" : "share_photo", - "photo" : "http://files.cocos2d-x.org/images/orgsite/logo.png" - }; - this._agentManager.dialog(map, function(resultcode, msg) { - cc.log(msg); + + var tex = cc.RenderTexture.create(winSize.width, winSize.height,cc.Texture2D.PIXEL_FORMAT_RGBA8888); + tex.setPosition(cc.p(winSize.width / 2, winSize.height / 2)); + tex.begin(); + cc.director.getRunningScene().visit(); + tex.end(); + + var imgPath = jsb.fileUtils.getWritablePath(); + if (imgPath.length == 0) { + return; + } + var imgName = "facebookshare.jpg"; + var result = tex.saveToFile(imgName, cc.IMAGE_FORMAT_JPEG); + if (result) { + imgPath += imgName; + cc.log("save image:"+imgPath); + } + + var delay = cc.DelayTime.create(2); + var share = cc.CallFunc.create(function(){ + var map = { + "dialog" : "share_photo", + "photo" : imgPath + }; + plugin.AgentManager.getInstance().dialog(map, function(resultcode, msg) { + cc.log(msg); + }); }); + var seq = cc.Sequence.create(delay, share); + this.runAction(seq); + }, onLinkMsg : function(){ diff --git a/samples/js-tests/src/tests_resources.js b/samples/js-tests/src/tests_resources.js index 11d47e1bcc..8d4c387e4b 100644 --- a/samples/js-tests/src/tests_resources.js +++ b/samples/js-tests/src/tests_resources.js @@ -203,6 +203,7 @@ var s_extensions_button = "res/extensions/button.png"; var s_extensions_buttonHighlighted = "res/extensions/buttonHighlighted.png"; var s_extensions_ribbon = "res/extensions/ribbon.png"; var s_image_icon = "res/Images/Icon.png"; +var s_html5_logo = "res/Images/cocos-html5.png"; var g_resources = [ //global From 184c1ee9cde7ce876678239ade0904d840e8c2f5 Mon Sep 17 00:00:00 2001 From: joshuastray Date: Tue, 1 Jul 2014 11:08:11 +0800 Subject: [PATCH 06/15] feature #5592 : use screenshot in photomessageshare testcase --- .../PluginXTest/FacebookShareTest.js | 59 +++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js b/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js index 7354fccbf3..c3d7d80f14 100644 --- a/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js +++ b/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js @@ -92,28 +92,13 @@ var FacebookShareTest = PluginXTest.extend({ onSharePhoto : function(){ - var tex = cc.RenderTexture.create(winSize.width, winSize.height,cc.Texture2D.PIXEL_FORMAT_RGBA8888); - tex.setPosition(cc.p(winSize.width / 2, winSize.height / 2)); - tex.begin(); - cc.director.getRunningScene().visit(); - tex.end(); - - var imgPath = jsb.fileUtils.getWritablePath(); - if (imgPath.length == 0) { - return; - } - var imgName = "facebookshare.jpg"; - var result = tex.saveToFile(imgName, cc.IMAGE_FORMAT_JPEG); - if (result) { - imgPath += imgName; - cc.log("save image:"+imgPath); - } + var img = this.screenshot(); var delay = cc.DelayTime.create(2); var share = cc.CallFunc.create(function(){ var map = { "dialog" : "share_photo", - "photo" : imgPath + "photo" : img }; plugin.AgentManager.getInstance().dialog(map, function(resultcode, msg) { cc.log(msg); @@ -153,13 +138,20 @@ var FacebookShareTest = PluginXTest.extend({ }, onPhotoMsg : function(){ - var map = { - "dialog" : "message_photo", - "photo" : "http://files.cocos2d-x.org/images/orgsite/logo.png" - }; - this._agentManager.dialog(map, function(resultcode, msg) { - cc.log(msg); + var img = this.screenshot(); + + var delay = cc.DelayTime.create(2); + var share = cc.CallFunc.create(function(){ + var map = { + "dialog" : "message_photo", + "photo" : img + }; + plugin.AgentManager.getInstance().dialog(map, function(resultcode, msg) { + cc.log(msg); + }); }); + var seq = cc.Sequence.create(delay, share); + this.runAction(seq); }, onRequest : function(){ @@ -182,5 +174,26 @@ var FacebookShareTest = PluginXTest.extend({ var s = new PluginXTestScene(); s.addChild(new PluginXTestLayer()); director.runScene(s); + }, + + screenshot:function(){ + var tex = cc.RenderTexture.create(winSize.width, winSize.height,cc.Texture2D.PIXEL_FORMAT_RGBA8888); + tex.setPosition(cc.p(winSize.width / 2, winSize.height / 2)); + tex.begin(); + cc.director.getRunningScene().visit(); + tex.end(); + + var imgPath = jsb.fileUtils.getWritablePath(); + if (imgPath.length == 0) { + return; + } + var imgName = "facebookmessage.jpg"; + var result = tex.saveToFile(imgName, cc.IMAGE_FORMAT_JPEG); + if (result) { + imgPath += imgName; + cc.log("save image:"+imgPath); + return imageName; + } + return ""; } }); \ No newline at end of file From bb8c37c915b78d94668552eddb3734537f9a447e Mon Sep 17 00:00:00 2001 From: joshuastray Date: Tue, 1 Jul 2014 11:18:30 +0800 Subject: [PATCH 07/15] feature #5592:fix screenshot bugs --- .../ExtensionsTest/PluginXTest/FacebookShareTest.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js b/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js index c3d7d80f14..d18ac3c8f6 100644 --- a/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js +++ b/samples/js-tests/src/ExtensionsTest/PluginXTest/FacebookShareTest.js @@ -92,7 +92,7 @@ var FacebookShareTest = PluginXTest.extend({ onSharePhoto : function(){ - var img = this.screenshot(); + var img = this.screenshot("facebookshare.jpg"); var delay = cc.DelayTime.create(2); var share = cc.CallFunc.create(function(){ @@ -138,7 +138,7 @@ var FacebookShareTest = PluginXTest.extend({ }, onPhotoMsg : function(){ - var img = this.screenshot(); + var img = this.screenshot("facebookmessage.jpg"); var delay = cc.DelayTime.create(2); var share = cc.CallFunc.create(function(){ @@ -176,7 +176,7 @@ var FacebookShareTest = PluginXTest.extend({ director.runScene(s); }, - screenshot:function(){ + screenshot:function(fileName){ var tex = cc.RenderTexture.create(winSize.width, winSize.height,cc.Texture2D.PIXEL_FORMAT_RGBA8888); tex.setPosition(cc.p(winSize.width / 2, winSize.height / 2)); tex.begin(); @@ -187,12 +187,11 @@ var FacebookShareTest = PluginXTest.extend({ if (imgPath.length == 0) { return; } - var imgName = "facebookmessage.jpg"; - var result = tex.saveToFile(imgName, cc.IMAGE_FORMAT_JPEG); + var result = tex.saveToFile(fileName, cc.IMAGE_FORMAT_JPEG); if (result) { - imgPath += imgName; + imgPath += fileName; cc.log("save image:"+imgPath); - return imageName; + return imgPath; } return ""; } From 715cb9d6aba3ad1dfae44d5194b72704e90d3b54 Mon Sep 17 00:00:00 2001 From: joshuastray Date: Tue, 1 Jul 2014 11:42:10 +0800 Subject: [PATCH 08/15] feature #5592: add facebook share receiver --- samples/js-tests/project/proj.android/AndroidManifest.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/samples/js-tests/project/proj.android/AndroidManifest.xml b/samples/js-tests/project/proj.android/AndroidManifest.xml index 885d613c60..f89480cea1 100644 --- a/samples/js-tests/project/proj.android/AndroidManifest.xml +++ b/samples/js-tests/project/proj.android/AndroidManifest.xml @@ -35,6 +35,11 @@ + + + + + From bca7ad453ae6a926d5b9c1e1efd764633fa58aa9 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 1 Jul 2014 12:05:01 +0800 Subject: [PATCH 09/15] Fixed #5634: Support EventListenerMouse in JSB --- .../bindings/manual/ScriptingCore.cpp | 68 ++++++++++++++++++- .../bindings/manual/ScriptingCore.h | 1 + .../bindings/manual/cocos2d_specifics.cpp | 3 + .../manual/jsb_event_dispatcher_manual.cpp | 30 ++++++++ .../manual/jsb_event_dispatcher_manual.h | 1 + .../bindings/script/jsb_cocos2d.js | 55 ++++++++++++++- frameworks/js-bindings/cocos2d-x | 2 +- samples/js-tests/src/tests-main.js | 2 +- tools/tojs/cocos2dx.ini | 4 +- 9 files changed, 160 insertions(+), 6 deletions(-) diff --git a/frameworks/js-bindings/bindings/manual/ScriptingCore.cpp b/frameworks/js-bindings/bindings/manual/ScriptingCore.cpp index 9d73acf538..cd1110f610 100644 --- a/frameworks/js-bindings/bindings/manual/ScriptingCore.cpp +++ b/frameworks/js-bindings/bindings/manual/ScriptingCore.cpp @@ -185,6 +185,29 @@ static std::string getTouchFuncName(EventTouch::EventCode eventCode) return funcName; } +static std::string getMouseFuncName(EventMouse::MouseEventType eventType) +{ + std::string funcName; + switch(eventType) { + case EventMouse::MouseEventType::MOUSE_DOWN: + funcName = "onMouseDown"; + break; + case EventMouse::MouseEventType::MOUSE_UP: + funcName = "onMouseUp"; + break; + case EventMouse::MouseEventType::MOUSE_MOVE: + funcName = "onMouseMove"; + break; + case EventMouse::MouseEventType::MOUSE_SCROLL: + funcName = "onMouseScroll"; + break; + default: + CCASSERT(false, "Invalid event code!"); + } + + return funcName; +} + static void rootObject(JSContext *cx, JSObject *obj) { JS_AddNamedObjectRoot(cx, &obj, "unnamed"); } @@ -1092,6 +1115,49 @@ bool ScriptingCore::handleTouchEvent(void* nativeObj, cocos2d::EventTouch::Event return ret; } +bool ScriptingCore::handleMouseEvent(void* nativeObj, cocos2d::EventMouse::MouseEventType eventType, cocos2d::Event* event, jsval* jsvalRet/* = nullptr*/) +{ + JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET + + std::string funcName = getMouseFuncName(eventType); + bool ret = false; + + do + { + js_proxy_t * p = jsb_get_native_proxy(nativeObj); + if (!p) break; + + jsval dataVal[1]; + dataVal[0] = getJSObject(_cx, event); + + if (jsvalRet != nullptr) + { + ret = executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), funcName.c_str(), 1, dataVal, jsvalRet); + } + else + { + jsval retval; + executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), funcName.c_str(), 1, dataVal, &retval); + if(JSVAL_IS_NULL(retval)) + { + ret = false; + } + else if(JSVAL_IS_BOOLEAN(retval)) + { + ret = JSVAL_TO_BOOLEAN(retval); + } + else + { + ret = false; + } + } + } while(false); + + removeJSObject(_cx, event); + + return ret; +} + bool ScriptingCore::executeFunctionWithObjectData(void* nativeObj, const char *name, JSObject *obj) { js_proxy_t * p = jsb_get_native_proxy(nativeObj); @@ -1497,7 +1563,7 @@ static void serverEntryPoint(void) char buf[1024] = {0}; int readBytes = 0; - while ((readBytes = ::recv(clientSocket, buf, sizeof(buf), 0)) > 0) + while ((readBytes = (int)::recv(clientSocket, buf, sizeof(buf), 0)) > 0) { buf[readBytes] = '\0'; // TRACE_DEBUGGER_SERVER("debug server : received command >%s", buf); diff --git a/frameworks/js-bindings/bindings/manual/ScriptingCore.h b/frameworks/js-bindings/bindings/manual/ScriptingCore.h index 951c4c95d9..d64b2fca10 100644 --- a/frameworks/js-bindings/bindings/manual/ScriptingCore.h +++ b/frameworks/js-bindings/bindings/manual/ScriptingCore.h @@ -245,6 +245,7 @@ class ScriptingCore : public cocos2d::ScriptEngineProtocol bool handleTouchesEvent(void* nativeObj, cocos2d::EventTouch::EventCode eventCode, const std::vector& touches, cocos2d::Event* event, jsval* jsvalRet = nullptr); bool handleTouchEvent(void* nativeObj, cocos2d::EventTouch::EventCode eventCode, cocos2d::Touch* touch, cocos2d::Event* event, jsval* jsvalRet = nullptr); + bool handleMouseEvent(void* nativeObj, cocos2d::EventMouse::MouseEventType eventType, cocos2d::Event* event, jsval* jsvalRet = nullptr); bool handleKeybardEvent(void* nativeObj, cocos2d::EventKeyboard::KeyCode keyCode, bool isPressed, cocos2d::Event* event); }; diff --git a/frameworks/js-bindings/bindings/manual/cocos2d_specifics.cpp b/frameworks/js-bindings/bindings/manual/cocos2d_specifics.cpp index 10c0785cd4..ad099dcae6 100644 --- a/frameworks/js-bindings/bindings/manual/cocos2d_specifics.cpp +++ b/frameworks/js-bindings/bindings/manual/cocos2d_specifics.cpp @@ -4232,6 +4232,9 @@ void register_cocos2dx_js_extensions(JSContext* cx, JSObject* global) tmpObj = JSVAL_TO_OBJECT(anonEvaluate(cx, global, "(function () { return cc.EventListenerTouchAllAtOnce; })()")); JS_DefineFunction(cx, tmpObj, "create", js_EventListenerTouchAllAtOnce_create, 0, JSPROP_READONLY | JSPROP_PERMANENT); + tmpObj = JSVAL_TO_OBJECT(anonEvaluate(cx, global, "(function () { return cc.EventListenerMouse; })()")); + JS_DefineFunction(cx, tmpObj, "create", js_EventListenerMouse_create, 0, JSPROP_READONLY | JSPROP_PERMANENT); + tmpObj = JSVAL_TO_OBJECT(anonEvaluate(cx, global, "(function () { return cc.EventListenerKeyboard; })()")); JS_DefineFunction(cx, tmpObj, "create", js_EventListenerKeyboard_create, 0, JSPROP_READONLY | JSPROP_PERMANENT); diff --git a/frameworks/js-bindings/bindings/manual/jsb_event_dispatcher_manual.cpp b/frameworks/js-bindings/bindings/manual/jsb_event_dispatcher_manual.cpp index 36e05a39c7..f82dc9a418 100644 --- a/frameworks/js-bindings/bindings/manual/jsb_event_dispatcher_manual.cpp +++ b/frameworks/js-bindings/bindings/manual/jsb_event_dispatcher_manual.cpp @@ -95,6 +95,36 @@ bool js_EventListenerTouchAllAtOnce_create(JSContext *cx, uint32_t argc, jsval * return false; } +bool js_EventListenerMouse_create(JSContext *cx, uint32_t argc, jsval *vp) +{ + if (argc == 0) { + auto ret = EventListenerMouse::create(); + + ret->onMouseDown = [ret](Event* event) { + ScriptingCore::getInstance()->handleMouseEvent(ret, EventMouse::MouseEventType::MOUSE_DOWN, event); + }; + + ret->onMouseUp = [ret](Event* event) { + ScriptingCore::getInstance()->handleMouseEvent(ret, EventMouse::MouseEventType::MOUSE_UP, event); + }; + + ret->onMouseMove = [ret](Event* event) { + ScriptingCore::getInstance()->handleMouseEvent(ret, EventMouse::MouseEventType::MOUSE_MOVE, event); + }; + + ret->onMouseScroll = [ret](Event* event) { + ScriptingCore::getInstance()->handleMouseEvent(ret, EventMouse::MouseEventType::MOUSE_SCROLL, event); + }; + + jsval jsret = getJSObject(cx, ret); + JS_SET_RVAL(cx, vp, jsret); + return true; + } + + JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 0); + return false; +} + bool js_EventListenerKeyboard_create(JSContext *cx, uint32_t argc, jsval *vp) { if (argc == 0) { diff --git a/frameworks/js-bindings/bindings/manual/jsb_event_dispatcher_manual.h b/frameworks/js-bindings/bindings/manual/jsb_event_dispatcher_manual.h index cf10ed4b18..095a96f1b4 100644 --- a/frameworks/js-bindings/bindings/manual/jsb_event_dispatcher_manual.h +++ b/frameworks/js-bindings/bindings/manual/jsb_event_dispatcher_manual.h @@ -29,5 +29,6 @@ bool js_EventListenerTouchOneByOne_create(JSContext *cx, uint32_t argc, jsval *vp); bool js_EventListenerTouchAllAtOnce_create(JSContext *cx, uint32_t argc, jsval *vp); bool js_EventListenerKeyboard_create(JSContext *cx, uint32_t argc, jsval *vp); +bool js_EventListenerMouse_create(JSContext *cx, uint32_t argc, jsval *vp); #endif /* defined(__cocos2d_js_bindings__jsb_event_dispatcher__) */ diff --git a/frameworks/js-bindings/bindings/script/jsb_cocos2d.js b/frameworks/js-bindings/bindings/script/jsb_cocos2d.js index a58927d1ea..6c6c0b26e4 100644 --- a/frameworks/js-bindings/bindings/script/jsb_cocos2d.js +++ b/frameworks/js-bindings/bindings/script/jsb_cocos2d.js @@ -1674,7 +1674,10 @@ cc.EventListener.create = function(argObj){ } for(var key in argObj) { - listener[key] = argObj[key]; + // Temporary fix for EventMouse to support getDelta functions (doesn't exist in Cocos2d-x) + if (key == "onMouseDown" || key == "onMouseMove") + listener["_" + key] = argObj[key]; + else listener[key] = argObj[key]; } return listener; @@ -1745,10 +1748,60 @@ cc.EventListenerKeyboard.prototype.clone = function() { return ret; }; +cc.EventListenerMouse.prototype.clone = function() { + var ret = cc.EventListenerMouse.create(); + ret._onMouseDown = this._onMouseDown; + ret._onMouseMove = this._onMouseMove; + ret.onMouseUp = this.onMouseUp; + ret.onMouseScroll = this.onMouseScroll; + return ret; +}; +cc.EventListenerMouse.prototype.onMouseMove = function(event) { + event._listener = this; + this._onMouseMove(event); + this._previousX = event.getLocationX(); + this._previousY = event.getLocationY(); +}; +cc.EventListenerMouse.prototype.onMouseDown = function(event) { + event._listener = this; + this._previousX = event.getLocationX(); + this._previousY = event.getLocationY(); + this._onMouseDown(event); +}; + cc.EventMouse.prototype.getLocation = function(){ return { x: this.getLocationX(), y: this.getLocationY() }; }; +cc.EventMouse.prototype.getLocationInView = function() { + return {x: this.getLocationX(), y: cc.view.getDesignResolutionSize().height - this.getLocationY()}; +}; + +// Temporary fix for EventMouse to support getDelta functions (doesn't exist in Cocos2d-x) +cc.EventMouse.prototype.getDelta = function(){ + if (isNaN(this._listener._previousX)) { + this._listener._previousX = this.getLocationX(); + this._listener._previousY = this.getLocationY(); + } + return { x: this.getLocationX() - this._listener._previousX, y: this.getLocationY() - this._listener._previousY }; +}; + +cc.EventMouse.prototype.getDeltaX = function(){ + if (isNaN(this._listener._previousX)) { + this._listener._previousX = this.getLocationX(); + this._listener._previousY = this.getLocationY(); + } + return this.getLocationX() - this._listener._previousX; +}; + +cc.EventMouse.prototype.getDeltaY = function(){ + if (isNaN(this._listener._previousX)) { + this._listener._previousX = this.getLocationX(); + this._listener._previousY = this.getLocationY(); + } + return this.getLocationY() - this._listener._previousY; +}; + cc.Touch.prototype.getLocationX = function(){ return this.getLocation().x; }; diff --git a/frameworks/js-bindings/cocos2d-x b/frameworks/js-bindings/cocos2d-x index 758577c73e..6a58db4942 160000 --- a/frameworks/js-bindings/cocos2d-x +++ b/frameworks/js-bindings/cocos2d-x @@ -1 +1 @@ -Subproject commit 758577c73ee6328441e92439bdec52d5ef2aba53 +Subproject commit 6a58db4942dd94617e39c0f006fd7966b4facae6 diff --git a/samples/js-tests/src/tests-main.js b/samples/js-tests/src/tests-main.js index 22146a8009..a8e0cb6021 100644 --- a/samples/js-tests/src/tests-main.js +++ b/samples/js-tests/src/tests-main.js @@ -160,7 +160,7 @@ var TestController = cc.LayerGradient.extend({ cc.eventManager.addListener({ event: cc.EventListener.MOUSE, onMouseMove: function (event) { - if(event.getButton() != undefined) + if(event.getButton() == cc.EventMouse.BUTTON_LEFT) event.getCurrentTarget().moveMenu(event.getDelta()); }, onMouseScroll: function (event) { diff --git a/tools/tojs/cocos2dx.ini b/tools/tojs/cocos2dx.ini index 65730eed7d..815fdcf1c3 100644 --- a/tools/tojs/cocos2dx.ini +++ b/tools/tojs/cocos2dx.ini @@ -109,7 +109,7 @@ skip = Node::[^setPosition$ setGLServerState description getUserObject .*UserDat RenderTexture::[listenToBackground listenToForeground], TextFieldTTF::[(g|s)etDelegate], EventListenerVector::[*], - EventListener(Touch|Keyboard).*::[create], + EventListener(Touch|Keyboard|Mouse).*::[create], EventTouch::[(s|g)etTouches], Device::[getTextureDataForText], EventDispatcher::[dispatchCustomEvent], @@ -132,10 +132,10 @@ rename_functions = SpriteFrameCache::[addSpriteFramesWithFile=addSpriteFrames ge FileUtils::[loadFilenameLookupDictionaryFromFile=loadFilenameLookup], SimpleAudioEngine::[preloadBackgroundMusic=preloadMusic setBackgroundMusicVolume=setMusicVolume getBackgroundMusicVolume=getMusicVolume playBackgroundMusic=playMusic stopBackgroundMusic=stopMusic pauseBackgroundMusic=pauseMusic resumeBackgroundMusic=resumeMusic rewindBackgroundMusic=rewindMusic isBackgroundMusicPlaying=isMusicPlaying willPlayBackgroundMusic=willPlayMusic], EventDispatcher::[addCustomEventListener=addCustomListener removeEventListener=removeListener removeEventListenersForType=removeListeners removeEventListenersForTarget=removeListeners removeCustomEventListeners=removeCustomListeners removeAllEventListeners=removeAllListeners pauseEventListenersForTarget=pauseTarget resumeEventListenersForTarget=resumeTarget], + EventMouse::[getMouseButton=getButton setMouseButton=setButton setCursorPosition=setLocation getCursorX=getLocationX getCursorY=getLocationY], Configuration::[getInfo=dumpInfo], ComponentContainer::[get=getComponent], LayerColor::[initWithColor=init], - EventMouse::[getCursorX=getLocationX getCursorY=getLocationY setCursorPosition=setLocation], GLProgramCache::[getGLProgram=getProgram addGLProgram=addProgram reloadDefaultGLPrograms=reloadDefaultShaders loadDefaultGLPrograms=loadDefaultShaders] rename_classes = ParticleSystemQuad::ParticleSystem, From 23fecabb8afbead0074ac10792fb6deb4d535fdc Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 1 Jul 2014 06:55:06 +0000 Subject: [PATCH 10/15] [AUTO] : updating jsbinding automatically --- .../auto/api/jsb_cocos2dx_auto_api.js | 46 +++----- .../bindings/auto/jsb_cocos2dx_auto.cpp | 105 +++++++----------- .../bindings/auto/jsb_cocos2dx_auto.hpp | 7 +- 3 files changed, 62 insertions(+), 96 deletions(-) diff --git a/frameworks/js-bindings/bindings/auto/api/jsb_cocos2dx_auto_api.js b/frameworks/js-bindings/bindings/auto/api/jsb_cocos2dx_auto_api.js index 21c7361702..411d0ce396 100644 --- a/frameworks/js-bindings/bindings/auto/api/jsb_cocos2dx_auto_api.js +++ b/frameworks/js-bindings/bindings/auto/api/jsb_cocos2dx_auto_api.js @@ -3581,13 +3581,13 @@ getMouseButton : function ( }, /** - * @method getScrollY - * @return {float} + * @method setMouseButton + * @param {int} arg0 */ -getScrollY : function ( +setMouseButton : function ( +int ) { - return 0; }, /** @@ -3613,13 +3613,23 @@ getCursorY : function ( }, /** - * @method setMouseButton - * @param {int} arg0 + * @method getCursorX + * @return {float} */ -setMouseButton : function ( -int +getCursorX : function ( +) +{ + return 0; +}, + +/** + * @method getScrollY + * @return {float} + */ +getScrollY : function ( ) { + return 0; }, /** @@ -3644,16 +3654,6 @@ getScrollX : function ( return 0; }, -/** - * @method getCursorX - * @return {float} - */ -getCursorX : function ( -) -{ - return 0; -}, - /** * @method EventMouse * @constructor @@ -3672,16 +3672,6 @@ mouseeventtype */ cc.EventListenerMouse = { -/** - * @method create - * @return {cc.EventListenerMouse} - */ -create : function ( -) -{ - return cc.EventListenerMouse; -}, - }; /** diff --git a/frameworks/js-bindings/bindings/auto/jsb_cocos2dx_auto.cpp b/frameworks/js-bindings/bindings/auto/jsb_cocos2dx_auto.cpp index 717cd86c03..d8cdaf7d70 100644 --- a/frameworks/js-bindings/bindings/auto/jsb_cocos2dx_auto.cpp +++ b/frameworks/js-bindings/bindings/auto/jsb_cocos2dx_auto.cpp @@ -8956,21 +8956,24 @@ bool js_cocos2dx_EventMouse_getMouseButton(JSContext *cx, uint32_t argc, jsval * JS_ReportError(cx, "js_cocos2dx_EventMouse_getMouseButton : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } -bool js_cocos2dx_EventMouse_getScrollY(JSContext *cx, uint32_t argc, jsval *vp) +bool js_cocos2dx_EventMouse_setMouseButton(JSContext *cx, uint32_t argc, jsval *vp) { + jsval *argv = JS_ARGV(cx, vp); + bool ok = true; JSObject *obj = JS_THIS_OBJECT(cx, vp); js_proxy_t *proxy = jsb_get_js_proxy(obj); cocos2d::EventMouse* cobj = (cocos2d::EventMouse *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_EventMouse_getScrollY : Invalid Native Object"); - if (argc == 0) { - double ret = cobj->getScrollY(); - jsval jsret = JSVAL_NULL; - jsret = DOUBLE_TO_JSVAL(ret); - JS_SET_RVAL(cx, vp, jsret); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_EventMouse_setMouseButton : Invalid Native Object"); + if (argc == 1) { + int arg0; + ok &= jsval_to_int32(cx, argv[0], (int32_t *)&arg0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_EventMouse_setMouseButton : Error processing arguments"); + cobj->setMouseButton(arg0); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } - JS_ReportError(cx, "js_cocos2dx_EventMouse_getScrollY : wrong number of arguments: %d, was expecting %d", argc, 0); + JS_ReportError(cx, "js_cocos2dx_EventMouse_setMouseButton : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } bool js_cocos2dx_EventMouse_setScrollData(JSContext *cx, uint32_t argc, jsval *vp) @@ -9012,24 +9015,38 @@ bool js_cocos2dx_EventMouse_getCursorY(JSContext *cx, uint32_t argc, jsval *vp) JS_ReportError(cx, "js_cocos2dx_EventMouse_getCursorY : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } -bool js_cocos2dx_EventMouse_setMouseButton(JSContext *cx, uint32_t argc, jsval *vp) +bool js_cocos2dx_EventMouse_getCursorX(JSContext *cx, uint32_t argc, jsval *vp) { - jsval *argv = JS_ARGV(cx, vp); - bool ok = true; JSObject *obj = JS_THIS_OBJECT(cx, vp); js_proxy_t *proxy = jsb_get_js_proxy(obj); cocos2d::EventMouse* cobj = (cocos2d::EventMouse *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_EventMouse_setMouseButton : Invalid Native Object"); - if (argc == 1) { - int arg0; - ok &= jsval_to_int32(cx, argv[0], (int32_t *)&arg0); - JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_EventMouse_setMouseButton : Error processing arguments"); - cobj->setMouseButton(arg0); - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_EventMouse_getCursorX : Invalid Native Object"); + if (argc == 0) { + double ret = cobj->getCursorX(); + jsval jsret = JSVAL_NULL; + jsret = DOUBLE_TO_JSVAL(ret); + JS_SET_RVAL(cx, vp, jsret); return true; } - JS_ReportError(cx, "js_cocos2dx_EventMouse_setMouseButton : wrong number of arguments: %d, was expecting %d", argc, 1); + JS_ReportError(cx, "js_cocos2dx_EventMouse_getCursorX : wrong number of arguments: %d, was expecting %d", argc, 0); + return false; +} +bool js_cocos2dx_EventMouse_getScrollY(JSContext *cx, uint32_t argc, jsval *vp) +{ + JSObject *obj = JS_THIS_OBJECT(cx, vp); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::EventMouse* cobj = (cocos2d::EventMouse *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_EventMouse_getScrollY : Invalid Native Object"); + if (argc == 0) { + double ret = cobj->getScrollY(); + jsval jsret = JSVAL_NULL; + jsret = DOUBLE_TO_JSVAL(ret); + JS_SET_RVAL(cx, vp, jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_EventMouse_getScrollY : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } bool js_cocos2dx_EventMouse_setCursorPosition(JSContext *cx, uint32_t argc, jsval *vp) @@ -9071,23 +9088,6 @@ bool js_cocos2dx_EventMouse_getScrollX(JSContext *cx, uint32_t argc, jsval *vp) JS_ReportError(cx, "js_cocos2dx_EventMouse_getScrollX : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } -bool js_cocos2dx_EventMouse_getCursorX(JSContext *cx, uint32_t argc, jsval *vp) -{ - JSObject *obj = JS_THIS_OBJECT(cx, vp); - js_proxy_t *proxy = jsb_get_js_proxy(obj); - cocos2d::EventMouse* cobj = (cocos2d::EventMouse *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_EventMouse_getCursorX : Invalid Native Object"); - if (argc == 0) { - double ret = cobj->getCursorX(); - jsval jsret = JSVAL_NULL; - jsret = DOUBLE_TO_JSVAL(ret); - JS_SET_RVAL(cx, vp, jsret); - return true; - } - - JS_ReportError(cx, "js_cocos2dx_EventMouse_getCursorX : wrong number of arguments: %d, was expecting %d", argc, 0); - return false; -} bool js_cocos2dx_EventMouse_constructor(JSContext *cx, uint32_t argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); @@ -9143,14 +9143,14 @@ void js_register_cocos2dx_EventMouse(JSContext *cx, JSObject *global) { }; static JSFunctionSpec funcs[] = { - JS_FN("getMouseButton", js_cocos2dx_EventMouse_getMouseButton, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("getScrollY", js_cocos2dx_EventMouse_getScrollY, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getButton", js_cocos2dx_EventMouse_getMouseButton, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("setButton", js_cocos2dx_EventMouse_setMouseButton, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setScrollData", js_cocos2dx_EventMouse_setScrollData, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getLocationY", js_cocos2dx_EventMouse_getCursorY, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("setMouseButton", js_cocos2dx_EventMouse_setMouseButton, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getLocationX", js_cocos2dx_EventMouse_getCursorX, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getScrollY", js_cocos2dx_EventMouse_getScrollY, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setLocation", js_cocos2dx_EventMouse_setCursorPosition, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getScrollX", js_cocos2dx_EventMouse_getScrollX, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("getLocationX", js_cocos2dx_EventMouse_getCursorX, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FS_END }; @@ -9187,26 +9187,6 @@ void js_register_cocos2dx_EventMouse(JSContext *cx, JSObject *global) { JSClass *jsb_cocos2d_EventListenerMouse_class; JSObject *jsb_cocos2d_EventListenerMouse_prototype; -bool js_cocos2dx_EventListenerMouse_create(JSContext *cx, uint32_t argc, jsval *vp) -{ - if (argc == 0) { - cocos2d::EventListenerMouse* ret = cocos2d::EventListenerMouse::create(); - jsval jsret = JSVAL_NULL; - do { - if (ret) { - js_proxy_t *jsProxy = js_get_or_create_proxy(cx, (cocos2d::EventListenerMouse*)ret); - jsret = OBJECT_TO_JSVAL(jsProxy->obj); - } else { - jsret = JSVAL_NULL; - } - } while (0); - JS_SET_RVAL(cx, vp, jsret); - return true; - } - JS_ReportError(cx, "js_cocos2dx_EventListenerMouse_create : wrong number of arguments"); - return false; -} - extern JSObject *jsb_cocos2d_EventListener_prototype; @@ -9236,10 +9216,7 @@ void js_register_cocos2dx_EventListenerMouse(JSContext *cx, JSObject *global) { JS_FS_END }; - static JSFunctionSpec st_funcs[] = { - JS_FN("create", js_cocos2dx_EventListenerMouse_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FS_END - }; + JSFunctionSpec *st_funcs = NULL; jsb_cocos2d_EventListenerMouse_prototype = JS_InitClass( cx, global, diff --git a/frameworks/js-bindings/bindings/auto/jsb_cocos2dx_auto.hpp b/frameworks/js-bindings/bindings/auto/jsb_cocos2dx_auto.hpp index 6dda24937d..08179999da 100644 --- a/frameworks/js-bindings/bindings/auto/jsb_cocos2dx_auto.hpp +++ b/frameworks/js-bindings/bindings/auto/jsb_cocos2dx_auto.hpp @@ -487,13 +487,13 @@ void js_cocos2dx_EventMouse_finalize(JSContext *cx, JSObject *obj); void js_register_cocos2dx_EventMouse(JSContext *cx, JSObject *global); void register_all_cocos2dx(JSContext* cx, JSObject* obj); bool js_cocos2dx_EventMouse_getMouseButton(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_EventMouse_getScrollY(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_EventMouse_setMouseButton(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_EventMouse_setScrollData(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_EventMouse_getCursorY(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_EventMouse_setMouseButton(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_EventMouse_getCursorX(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_EventMouse_getScrollY(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_EventMouse_setCursorPosition(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_EventMouse_getScrollX(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_EventMouse_getCursorX(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_EventMouse_EventMouse(JSContext *cx, uint32_t argc, jsval *vp); extern JSClass *jsb_cocos2d_EventListenerMouse_class; @@ -503,7 +503,6 @@ bool js_cocos2dx_EventListenerMouse_constructor(JSContext *cx, uint32_t argc, js void js_cocos2dx_EventListenerMouse_finalize(JSContext *cx, JSObject *obj); void js_register_cocos2dx_EventListenerMouse(JSContext *cx, JSObject *global); void register_all_cocos2dx(JSContext* cx, JSObject* obj); -bool js_cocos2dx_EventListenerMouse_create(JSContext *cx, uint32_t argc, jsval *vp); extern JSClass *jsb_cocos2d_EventAcceleration_class; extern JSObject *jsb_cocos2d_EventAcceleration_prototype; From 367adc910683003463cff78679b40c0b88ea282e Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 1 Jul 2014 16:10:33 +0800 Subject: [PATCH 11/15] Issue #5636: Fix many bugs --- frameworks/js-bindings/bindings/script/jsb_cocos2d.js | 4 ++++ frameworks/js-bindings/cocos2d-x | 2 +- samples/js-moonwarriors/src/GameLayer.js | 2 +- samples/js-tests/src/CocosDenshionTest/CocosDenshionTest.js | 2 +- samples/js-tests/src/EventTest/EventTest.js | 4 ++-- .../ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js | 1 - samples/js-tests/src/ExtensionsTest/ExtensionsTest.js | 2 +- samples/js-tests/src/LabelTest/LabelTest.js | 2 +- samples/js-tests/src/LayerTest/LayerTest.js | 4 ++-- .../js-tests/src/NewEventManagerTest/NewEventManagerTest.js | 6 ++++-- samples/js-tests/src/ParallaxTest/ParallaxTest.js | 2 +- samples/js-tests/src/ParticleTest/ParticleTest.js | 2 +- samples/js-tests/src/RenderTextureTest/RenderTextureTest.js | 2 +- samples/js-tests/src/TileMapTest/TileMapTest.js | 2 +- 14 files changed, 21 insertions(+), 16 deletions(-) diff --git a/frameworks/js-bindings/bindings/script/jsb_cocos2d.js b/frameworks/js-bindings/bindings/script/jsb_cocos2d.js index 6c6c0b26e4..8ea1c9f136 100644 --- a/frameworks/js-bindings/bindings/script/jsb_cocos2d.js +++ b/frameworks/js-bindings/bindings/script/jsb_cocos2d.js @@ -1757,12 +1757,16 @@ cc.EventListenerMouse.prototype.clone = function() { return ret; }; cc.EventListenerMouse.prototype.onMouseMove = function(event) { + if (!this._onMouseMove) + return; event._listener = this; this._onMouseMove(event); this._previousX = event.getLocationX(); this._previousY = event.getLocationY(); }; cc.EventListenerMouse.prototype.onMouseDown = function(event) { + if (!this._onMouseDown) + return; event._listener = this; this._previousX = event.getLocationX(); this._previousY = event.getLocationY(); diff --git a/frameworks/js-bindings/cocos2d-x b/frameworks/js-bindings/cocos2d-x index 6a58db4942..c67a854d6c 160000 --- a/frameworks/js-bindings/cocos2d-x +++ b/frameworks/js-bindings/cocos2d-x @@ -1 +1 @@ -Subproject commit 6a58db4942dd94617e39c0f006fd7966b4facae6 +Subproject commit c67a854d6ca13285a9561b1e9d85b4677c2c1201 diff --git a/samples/js-moonwarriors/src/GameLayer.js b/samples/js-moonwarriors/src/GameLayer.js index b9ca1377da..1a9c7041b1 100755 --- a/samples/js-moonwarriors/src/GameLayer.js +++ b/samples/js-moonwarriors/src/GameLayer.js @@ -123,7 +123,7 @@ var GameLayer = cc.Layer.extend({ cc.eventManager.addListener({ event: cc.EventListener.MOUSE, onMouseMove: function(event){ - if(event.getButton() != undefined) + if(event.getButton() == cc.EventMouse.BUTTON_LEFT) event.getCurrentTarget().processEvent(event); } }, this); diff --git a/samples/js-tests/src/CocosDenshionTest/CocosDenshionTest.js b/samples/js-tests/src/CocosDenshionTest/CocosDenshionTest.js index 225a88f1ea..e86cdce75d 100644 --- a/samples/js-tests/src/CocosDenshionTest/CocosDenshionTest.js +++ b/samples/js-tests/src/CocosDenshionTest/CocosDenshionTest.js @@ -183,7 +183,7 @@ var CocosDenshionTest = cc.LayerGradient.extend({ cc.eventManager.addListener({ event: cc.EventListener.MOUSE, onMouseMove: function(event){ - if(event.getButton() != undefined) + if(event.getButton() == cc.EventMouse.BUTTON_LEFT) event.getCurrentTarget().moveMenu(event.getDelta()); } }, this); diff --git a/samples/js-tests/src/EventTest/EventTest.js b/samples/js-tests/src/EventTest/EventTest.js index 9c908f61a3..4e57eccf50 100644 --- a/samples/js-tests/src/EventTest/EventTest.js +++ b/samples/js-tests/src/EventTest/EventTest.js @@ -361,8 +361,8 @@ var MouseTest = EventTest.extend({ var pos = event.getLocation(), target = event.getCurrentTarget(); if(event.getButton() === cc.EventMouse.BUTTON_RIGHT) cc.log("onRightMouseDown at: " + pos.x + " " + pos.y ); - else - cc.log("onMouseDown at: " + pos.x + " " + pos.y ); + else if(event.getButton() === cc.EventMouse.BUTTON_LEFT) + cc.log("onLeftMouseDown at: " + pos.x + " " + pos.y ); target.sprite.x = pos.x; target.sprite.y = pos.y; }, diff --git a/samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js b/samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js index c1fdf21a5a..2bb3d8019f 100644 --- a/samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js +++ b/samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js @@ -208,7 +208,6 @@ var AssetsManagerLoaderScene = TestScene.extend({ }, updateProgress : function () { - cc.log("What the fuck::: " + this._percent); this._loadingBar.setPercent(this._percent); this._fileLoadingBar.setPercent(this._percentByFile); }, diff --git a/samples/js-tests/src/ExtensionsTest/ExtensionsTest.js b/samples/js-tests/src/ExtensionsTest/ExtensionsTest.js index 447785056e..8940ef0ed2 100644 --- a/samples/js-tests/src/ExtensionsTest/ExtensionsTest.js +++ b/samples/js-tests/src/ExtensionsTest/ExtensionsTest.js @@ -96,7 +96,7 @@ var extensionsTestItemNames = [ } ]; -if (cc.sys.os == cc.sys.OS_IOS || cc.sys.os == cc.sys.OS_ANDROID || true) { +if (cc.sys.isMobile || !cc.sys.isNative) { extensionsTestItemNames.push({ itemTitle:"PluginTest", testScene:function () { diff --git a/samples/js-tests/src/LabelTest/LabelTest.js b/samples/js-tests/src/LabelTest/LabelTest.js index 31faf854b7..00291928f1 100644 --- a/samples/js-tests/src/LabelTest/LabelTest.js +++ b/samples/js-tests/src/LabelTest/LabelTest.js @@ -1582,7 +1582,7 @@ var BMFontMultiLineAlignmentTest = AtlasDemo.extend({ } }, onMouseMove:function (touch) { - if(event.getButton == undefined || event.getButton() == undefined) + if(!event.getButton || event.getButton() != cc.EventMouse.BUTTON_LEFT) return; var location = touch.getLocation(); diff --git a/samples/js-tests/src/LayerTest/LayerTest.js b/samples/js-tests/src/LayerTest/LayerTest.js index 9a3299d495..50344aa17b 100644 --- a/samples/js-tests/src/LayerTest/LayerTest.js +++ b/samples/js-tests/src/LayerTest/LayerTest.js @@ -103,7 +103,7 @@ var LayerTest1 = LayerTest.extend({ cc.eventManager.addListener({ event: cc.EventListener.MOUSE, onMouseMove: function(event){ - if(event.getButton() != undefined) + if(event.getButton() == cc.EventMouse.BUTTON_LEFT) event.getCurrentTarget().updateSize(event.getLocation()); } }, this); @@ -470,7 +470,7 @@ var LayerGradient = LayerTest.extend({ event.getCurrentTarget().updateGradient(event.getLocation()); }, onMouseMove: function(event){ - if(event.getButton() != undefined) + if(event.getButton() == cc.EventMouse.BUTTON_LEFT) event.getCurrentTarget().updateGradient(event.getLocation()); } }, this); diff --git a/samples/js-tests/src/NewEventManagerTest/NewEventManagerTest.js b/samples/js-tests/src/NewEventManagerTest/NewEventManagerTest.js index a9003406ff..b656ecad45 100644 --- a/samples/js-tests/src/NewEventManagerTest/NewEventManagerTest.js +++ b/samples/js-tests/src/NewEventManagerTest/NewEventManagerTest.js @@ -211,8 +211,10 @@ var TouchableSprite = cc.Sprite.extend({ }, onTouchEnded: function (touch, event) { selfPointer.setColor(cc.color.WHITE); - if(selfPointer._removeListenerOnTouchEnded) + if(selfPointer._removeListenerOnTouchEnded) { cc.eventManager.removeListener(selfPointer._listener); + selfPointer._listener = null; + } } }); @@ -224,7 +226,7 @@ var TouchableSprite = cc.Sprite.extend({ }, onExit: function(){ - cc.eventManager.removeListener(this._listener); + this._listener && cc.eventManager.removeListener(this._listener); this._super(); }, diff --git a/samples/js-tests/src/ParallaxTest/ParallaxTest.js b/samples/js-tests/src/ParallaxTest/ParallaxTest.js index 83b05065ee..965e0f35bf 100644 --- a/samples/js-tests/src/ParallaxTest/ParallaxTest.js +++ b/samples/js-tests/src/ParallaxTest/ParallaxTest.js @@ -177,7 +177,7 @@ Parallax2 = ParallaxDemo.extend({ cc.eventManager.addListener({ event: cc.EventListener.MOUSE, onMouseMove: function(event){ - if(event.getButton() != undefined){ + if(event.getButton() == cc.EventMouse.BUTTON_LEFT){ var node = event.getCurrentTarget().getChildByTag(TAG_NODE); node.x += event.getDeltaX(); node.y += event.getDeltaY(); diff --git a/samples/js-tests/src/ParticleTest/ParticleTest.js b/samples/js-tests/src/ParticleTest/ParticleTest.js index e87f77db4a..42bcd39024 100644 --- a/samples/js-tests/src/ParticleTest/ParticleTest.js +++ b/samples/js-tests/src/ParticleTest/ParticleTest.js @@ -197,7 +197,7 @@ var ParticleDemo = BaseTestLayer.extend({ event.getCurrentTarget()._moveToTouchPoint(event.getLocation()); }, onMouseMove: function(event){ - if(event.getButton() != undefined) + if(event.getButton() == cc.EventMouse.BUTTON_LEFT) event.getCurrentTarget()._moveToTouchPoint(event.getLocation()); } }, this); diff --git a/samples/js-tests/src/RenderTextureTest/RenderTextureTest.js b/samples/js-tests/src/RenderTextureTest/RenderTextureTest.js index d8400069bb..88f3b5a635 100644 --- a/samples/js-tests/src/RenderTextureTest/RenderTextureTest.js +++ b/samples/js-tests/src/RenderTextureTest/RenderTextureTest.js @@ -96,7 +96,7 @@ var RenderTextureSave = RenderTextureBaseLayer.extend({ event.getCurrentTarget()._lastLocation = event.getLocation(); }, onMouseMove: function(event){ - if(event.getButton() != undefined) + if(event.getButton() == cc.EventMouse.BUTTON_LEFT) event.getCurrentTarget().drawInLocation(event.getLocation()); } }, this); diff --git a/samples/js-tests/src/TileMapTest/TileMapTest.js b/samples/js-tests/src/TileMapTest/TileMapTest.js index c53cdca46e..490243ac75 100644 --- a/samples/js-tests/src/TileMapTest/TileMapTest.js +++ b/samples/js-tests/src/TileMapTest/TileMapTest.js @@ -50,7 +50,7 @@ var TileDemoProps = { cc.eventManager.addListener({ event: cc.EventListener.MOUSE, onMouseMove: function(event){ - if(event.getButton() != undefined){ + if(event.getButton() == cc.EventMouse.BUTTON_LEFT){ var node = event.getCurrentTarget().getChildByTag(TAG_TILE_MAP); node.x += event.getDeltaX(); node.y += event.getDeltaY(); From f81a0e5cbeeedead9c8ab18360cdf53a736277ef Mon Sep 17 00:00:00 2001 From: joshuastray Date: Tue, 1 Jul 2014 16:16:32 +0800 Subject: [PATCH 12/15] fix #5542:copy binding scripts to script folder --- .../frameworks/runtime-src/proj.win32/build-cfg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/js-template-default/frameworks/runtime-src/proj.win32/build-cfg.json b/templates/js-template-default/frameworks/runtime-src/proj.win32/build-cfg.json index 185596a442..94dadfd8ec 100644 --- a/templates/js-template-default/frameworks/runtime-src/proj.win32/build-cfg.json +++ b/templates/js-template-default/frameworks/runtime-src/proj.win32/build-cfg.json @@ -18,7 +18,7 @@ }, { "from": "../../js-bindings/bindings/script", - "to": "" + "to": "script" } ] } From ccda46445032e1604bf09910a1bd6c42d6ad9bac Mon Sep 17 00:00:00 2001 From: Slawomir Caluch Date: Sat, 28 Jun 2014 17:26:27 +0200 Subject: [PATCH 13/15] Adds support for debugging over ethernet in addition to WiFi --- .../org/cocos2dx/javascript/AppActivity.java | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/templates/js-template-runtime/frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.java b/templates/js-template-runtime/frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.java index e436741e9c..0a3248749d 100644 --- a/templates/js-template-runtime/frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.java +++ b/templates/js-template-runtime/frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.java @@ -30,6 +30,7 @@ of this software and associated documentation files (the "Software"), to deal import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; +import java.util.ArrayList; import org.cocos2dx.lib.Cocos2dxActivity; @@ -72,7 +73,7 @@ protected void onCreate(Bundle savedInstanceState) { // Check the wifi is opened when the native is debug. if(nativeIsDebug()) { - if(!isWifiConnected()) + if(!isNetworkConnected()) { AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setTitle("Warning"); @@ -92,17 +93,31 @@ public void onClick(DialogInterface dialog, int which) { } hostIPAdress = getHostIpAddress(); } - private boolean isWifiConnected() { - ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - if (cm != null) { - NetworkInfo networkInfo = cm.getActiveNetworkInfo(); - if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { - return true; - } - } - return false; - } - + + private boolean isNetworkConnected() { + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + ArrayList networkTypes = new ArrayList(); + networkTypes.add(ConnectivityManager.TYPE_WIFI); + //We need to use getDeclaredField as TYPE_ETHERNET is only available from API level 13 (3.2) + //networkTypes.add(ConnectivityManager.TYPE_ETHERNET); // will not compile + try { + networkTypes.add(ConnectivityManager.class.getDeclaredField("TYPE_ETHERNET").getInt(null)); + } catch (NoSuchFieldException nsfe) { + //Ignore on older API levels + //throw new RuntimeException(nsfe); + } + catch (IllegalAccessException iae) { + throw new RuntimeException(iae); + } + if (networkInfo != null && networkTypes.contains(networkInfo.getType())) { + return true; + } + } + return false; + } + public String getHostIpAddress() { WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); From 7c0c54154d6080ebcc942e6eccb47edc0f091575 Mon Sep 17 00:00:00 2001 From: joshuastray Date: Wed, 2 Jul 2014 09:59:57 +0800 Subject: [PATCH 14/15] issue #5527: fix jsb namespace bugs --- frameworks/js-bindings/bindings/script/jsb_boot.js | 2 +- .../src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js | 2 +- samples/js-tests/src/ReflectionTest/ReflectionTest.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/js-bindings/bindings/script/jsb_boot.js b/frameworks/js-bindings/bindings/script/jsb_boot.js index c27c4ae308..fdc5d52dff 100644 --- a/frameworks/js-bindings/bindings/script/jsb_boot.js +++ b/frameworks/js-bindings/bindings/script/jsb_boot.js @@ -1250,7 +1250,7 @@ cc.game._initConfig(); // JS to Native bridges if(cc.sys.os == cc.sys.OS_ANDROID){ - cc.reflection = new JavascriptJavaBridge(); + jsb.reflection = new JavascriptJavaBridge(); cc.sys.capabilities["keyboard"] = true; } else if(cc.sys.os == cc.sys.OS_IOS){ diff --git a/samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js b/samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js index 2bb3d8019f..2d133cb6c4 100644 --- a/samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js +++ b/samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js @@ -131,7 +131,7 @@ var AssetsManagerLoaderScene = TestScene.extend({ if (!this._am.getLocalManifest().isLoaded()) { cc.log("Fail to update assets, step skipped."); - var scene = new jsb.AssetsManagerTestScene(backgroundPaths[currentScene]); + var scene = new AssetsManagerTestScene(backgroundPaths[currentScene]); cc.director.runScene(scene); } else diff --git a/samples/js-tests/src/ReflectionTest/ReflectionTest.js b/samples/js-tests/src/ReflectionTest/ReflectionTest.js index 211edab257..86d27c572a 100644 --- a/samples/js-tests/src/ReflectionTest/ReflectionTest.js +++ b/samples/js-tests/src/ReflectionTest/ReflectionTest.js @@ -34,7 +34,7 @@ var ReflectionTestLayer = BaseTestLayer.extend({ var label = cc.LabelTTF.create("Show Alert Dialog", "Arial", 35); var menuItem = cc.MenuItemLabel.create(label, function(){ - cc.reflection.callStaticMethod("org/cocos2dx/js_tests/AppActivity", "showAlertDialog", "(Ljava/lang/String;Ljava/lang/String;)V", "How are you ?", "I'm great !"); + jsb.reflection.callStaticMethod("org/cocos2dx/js_tests/AppActivity", "showAlertDialog", "(Ljava/lang/String;Ljava/lang/String;)V", "How are you ?", "I'm great !"); }, this); menuItem.x = winSize.width / 2; menuItem.y = winSize.height / 2; From 1e14078694ed928669cfa1b3d182b606f8b12bc4 Mon Sep 17 00:00:00 2001 From: akira_cn Date: Wed, 2 Jul 2014 10:27:03 +0800 Subject: [PATCH 15/15] no default font Arial on android --- frameworks/js-bindings/bindings/script/jsb_create_apis.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/js-bindings/bindings/script/jsb_create_apis.js b/frameworks/js-bindings/bindings/script/jsb_create_apis.js index ec15d77c09..1aa49423be 100644 --- a/frameworks/js-bindings/bindings/script/jsb_create_apis.js +++ b/frameworks/js-bindings/bindings/script/jsb_create_apis.js @@ -762,7 +762,7 @@ cc.LabelTTF.prototype._ctor = function(text, fontName, fontSize, dimensions, hAl this.initWithStringAndTextDefinition(text, fontName); } else { - fontName = fontName || "Arial"; + fontName = fontName || ""; fontSize = fontSize || 16; dimensions = dimensions || cc.size(0,0); hAlignment = hAlignment === undefined ? cc.TEXT_ALIGNMENT_LEFT : hAlignment; @@ -927,7 +927,7 @@ cc.LabelTTF.create = function (text, fontName, fontSize, dimensions, hAlignment, label = cc.LabelTTF.createWithFontDefinition(text, fontName); } else { - fontName = fontName || "Arial"; + fontName = fontName || ""; fontSize = fontSize || 16; dimensions = dimensions || cc.size(0, 0); hAlignment = hAlignment == undefined ? cc.TEXT_ALIGNMENT_CENTER : hAlignment;