JSBool js_cocos2dx_CCMenu_create(JSContext *cx, uint32_t argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); if (argc > 0) { cocos2d::CCArray* array = cocos2d::CCArray::create(); int i = 0; while (i < argc) { js_proxy_t *proxy; JSObject *tmpObj = JSVAL_TO_OBJECT(argv[i]); JS_GET_NATIVE_PROXY(proxy, tmpObj); cocos2d::CCObject *item = (cocos2d::CCObject*)(proxy ? proxy->ptr : NULL); TEST_NATIVE_OBJECT(cx, item) array->addObject(item); i++; } cocos2d::CCMenu* ret = cocos2d::CCMenu::createWithArray(array); jsval jsret; do { if (ret) { js_proxy_t *p; JS_GET_PROXY(p, ret); if (p) { jsret = OBJECT_TO_JSVAL(p->obj); } else { // create a new js obj of that class js_proxy_t *proxy = js_get_or_create_proxy<cocos2d::CCMenu>(cx, ret); jsret = OBJECT_TO_JSVAL(proxy->obj); } } else { jsret = JSVAL_NULL; } } while (0); JS_SET_RVAL(cx, vp, jsret); return JS_TRUE; } if (argc == 0) { cocos2d::CCMenu* ret = cocos2d::CCMenu::create(); jsval jsret; do { if (ret) { js_proxy_t *p; JS_GET_PROXY(p, ret); if (p) { jsret = OBJECT_TO_JSVAL(p->obj); } else { // create a new js obj of that class js_proxy_t *proxy = js_get_or_create_proxy<cocos2d::CCMenu>(cx, ret); jsret = OBJECT_TO_JSVAL(proxy->obj); } } else { jsret = JSVAL_NULL; } } while (0); JS_SET_RVAL(cx, vp, jsret); return JS_TRUE; } return JS_FALSE; }
JSBool js_CocosBuilder_create(JSContext *cx, uint32_t argc, jsval *vp) { CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary(); ccNodeLoaderLibrary->registerCCNodeLoader("", JSLayerLoader::loader()); cocos2d::extension::CCBReader * ret = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary); ret->autorelease(); jsval jsret; if (ret) { js_proxy_t *proxy; JS_GET_PROXY(proxy, ret); if (proxy) { jsret = OBJECT_TO_JSVAL(proxy->obj); } else { // create a new js obj of that class proxy = js_get_or_create_proxy<cocos2d::extension::CCBReader>(cx, ret); jsret = OBJECT_TO_JSVAL(proxy->obj); } } else { jsret = JSVAL_NULL; } JS_SET_RVAL(cx, vp, jsret); return JS_TRUE; }
static void removeJSTouchObject(JSContext *cx, CCTouch *x, jsval &jsret) { js_proxy_t* nproxy; js_proxy_t* jsproxy; void *ptr = (void*)x; JS_GET_PROXY(nproxy, ptr); if (nproxy) { JS_GET_NATIVE_PROXY(jsproxy, nproxy->obj); JS_RemoveObjectRoot(cx, &jsproxy->obj); JS_REMOVE_PROXY(nproxy, jsproxy); } }
void JSCallbackTarget::onControlEventReceived(CCObject* pSender, CCControlEvent event) { JSContext* cx = ScriptingCore::getInstance()->getGlobalContext(); jsval args[2]; jsval retval; js_proxy_t* p; JS_GET_PROXY(p, pSender); assert(p); args[0] = OBJECT_TO_JSVAL(p->obj); args[1] = INT_TO_JSVAL(event); JS_CallFunctionValue(cx, m_pProxy->jsTargetObj, OBJECT_TO_JSVAL(m_pProxy->jsFuncObj), 2, args, &retval); }
static void getJSTouchObject(JSContext *cx, CCTouch *x, jsval &jsret) { js_type_class_t *classType; TypeTest<cocos2d::CCTouch> t; uint32_t typeId = t.s_id(); HASH_FIND_INT(_js_global_type_ht, &typeId, classType); assert(classType); JSObject *_tmp = JS_NewObject(cx, classType->jsclass, classType->proto, classType->parentProto); js_proxy_t *proxy, *nproxy; JS_NEW_PROXY(proxy, x, _tmp); void *ptr = x; JS_GET_PROXY(nproxy, ptr); JS_AddNamedObjectRoot(cx, &nproxy->obj, "CCTouch"); jsret = OBJECT_TO_JSVAL(_tmp); }
void callbackFunc(CCNode *node) const { js_proxy_t *p; JS_GET_PROXY(p, node); jsval retObj = OBJECT_TO_JSVAL(p->obj); if(extraData != NULL) { ScriptingCore::getInstance()->executeJSFunctionWithThisObj(jsThisObj, jsCallback, *extraData); } else { ScriptingCore::getInstance()->executeJSFunctionWithThisObj(jsThisObj, jsCallback, retObj); } }
virtual void onEvent(Ref *controlButton, Control::EventType event) { js_proxy_t * p; JS_GET_PROXY(p, controlButton); if (!p) { log("Failed to get proxy for control button"); return; } jsval dataVal[2]; dataVal[0] = OBJECT_TO_JSVAL(p->obj); int arg1 = (int)event; dataVal[1] = INT_TO_JSVAL(arg1); jsval jsRet; ScriptingCore::getInstance()->executeJSFunctionWithThisObj(OBJECT_TO_JSVAL(_jsTarget), OBJECT_TO_JSVAL(_jsFunc), 2, dataVal, &jsRet); }
JSBool js_cocos2dx_CCAnimation_create(JSContext *cx, uint32_t argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); if (argc <= 3) { cocos2d::CCArray* arg0; if (argc > 0) { arg0 = jsval_to_ccarray(cx, argv[0]); } cocos2d::CCAnimation* ret; double arg1 = 0.0f; if (argc > 0 && argc == 2) { if (argc == 2) { JS_ValueToNumber(cx, argv[1], &arg1); } ret = cocos2d::CCAnimation::create(arg0, arg1); } else if (argc > 0) { unsigned int loops; JS_ValueToNumber(cx, argv[1], &arg1); JS_ValueToECMAUint32(cx, argv[1], &loops); ret = cocos2d::CCAnimation::create(arg0, arg1, loops); } else if (argc == 0) { ret = cocos2d::CCAnimation::create(); } jsval jsret; if (ret) { js_proxy_t *proxy; JS_GET_PROXY(proxy, ret); if (proxy) { jsret = OBJECT_TO_JSVAL(proxy->obj); } else { // create a new js obj of that class proxy = js_get_or_create_proxy<cocos2d::CCAnimation>(cx, ret); jsret = OBJECT_TO_JSVAL(proxy->obj); } } else { jsret = JSVAL_NULL; } JS_SET_RVAL(cx, vp, jsret); return JS_TRUE; } return JS_FALSE; }
JSObject* bind_menu_item(JSContext *cx, T* nativeObj, jsval callback, jsval thisObj) { js_proxy_t *p; JS_GET_PROXY(p, nativeObj); if (p) { addCallBackAndThis(p->obj, callback, thisObj); return p->obj; } else { js_type_class_t *classType = js_get_type_from_native<T>(nativeObj); assert(classType); JSObject *tmp = JS_NewObject(cx, classType->jsclass, classType->proto, classType->parentProto); // bind nativeObj <-> JSObject js_proxy_t *proxy; JS_NEW_PROXY(proxy, nativeObj, tmp); JS_AddNamedObjectRoot(cx, &proxy->obj, "MenuItem"); addCallBackAndThis(tmp, callback, thisObj); return tmp; } }
virtual void onEvent(Ref *controlButton, Control::EventType event) { js_proxy_t * p; JS_GET_PROXY(p, controlButton); if (!p) { log("Failed to get proxy for control button"); return; } jsval dataVal[2]; dataVal[0] = OBJECT_TO_JSVAL(p->obj); int arg1 = (int)event; dataVal[1] = INT_TO_JSVAL(arg1); JSContext* cx = ScriptingCore::getInstance()->getGlobalContext(); JS::RootedValue jsRet(cx); ScriptingCore::getInstance()->executeJSFunctionWithThisObj(JS::RootedValue(cx, OBJECT_TO_JSVAL(_jsTarget)), JS::RootedValue(cx, OBJECT_TO_JSVAL(_jsFunc)), JS::HandleValueArray::fromMarkedLocation(2, dataVal), &jsRet); }
JSBool js_cocos2dx_swap_native_object(JSContext *cx, uint32_t argc, jsval *vp) { if (argc == 2) { // get the native object from the second object to the first object jsval *argv = JS_ARGV(cx, vp); JSObject *one = JSVAL_TO_OBJECT(argv[0]); JSObject *two = JSVAL_TO_OBJECT(argv[1]); js_proxy_t *nproxy; JS_GET_NATIVE_PROXY(nproxy, two); void *ptrTwo = (nproxy ? nproxy->ptr : NULL); if (nproxy) { js_proxy_t *jsproxy; JS_GET_PROXY(jsproxy, ptrTwo); if (jsproxy) { JS_REMOVE_PROXY(jsproxy, nproxy); JS_NEW_PROXY(nproxy, ptrTwo, one); } } } return JS_TRUE; }