此篇文章帮助开发者实现CCDictionary to JSB 绑定方式及实现原理。点此链接实例代码下载
JSBool js_cocos2dx_CCFileUtils_bindingCCDictionaryFile(JSContext *cx,uint32_t argc,jsval *vp)
{
jsval *argv =JS_ARGV(cx, vp);
JSBool ok =JS_TRUE;
JSObject *obj =JS_THIS_OBJECT(cx, vp);
js_proxy_t *proxy =jsb_get_js_proxy(obj);
cocos2d::CCFileUtils* cobj = (cocos2d::CCFileUtils *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if (argc ==1) {
constchar* arg0;
std::string arg0_tmp; ok &=jsval_to_std_string(cx, argv[0], &arg0_tmp); arg0 = arg0_tmp.c_str();
JSB_PRECONDITION2(ok, cx,JS_FALSE,"Error processing arguments");
cocos2d::CCDictionary* ret = cobj->createCCDictionaryWithContentsOfFile(arg0);
jsval jsret;
jsret =ccdictionary_to_jsval(cx, ret);
JS_SET_RVAL(cx, vp, jsret);
returnJS_TRUE;
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_FALSE;
}
以上函数是实现cpp到js端的绑定,那么js端如何解析返回的dictionary呢。好现在我为大家来解答。
大家知道cpp中解析dictionary不困难如:
CCDictionary* metadataDict = (CCDictionary*)ret->objectForKey("walkAnim");
string texturePath("");
if (metadataDict)
{
texturePath = metadataDict->valueForKey("animationFrames")->getCString();
CCLOG("这是值: %s ", texturePath.c_str());
}
根据 JS端有原生对象dictionary功能方法可以解析映射过来的dictionary了 如:var ret= cc.FileUtils.getInstance().createCCDictionaryFile(“test.plist”);
var metadataDict =ret["walkAnim"];
debugLog("hello:"+metadataDict+":"+metadataDict["animationFrames"]);
点此链接实例代码下载:http://download.csdn.net/detail/ecaifu800/6721441
js: loginfo->hello:[object Object]:1,2,3,4,5,6,7,8