最近也是換了份新工作.搞棋牌平台了...標新立異呵呵.哥哥使用node.js來開發這套東東..公司什麼底子也沒有.在西安就這樣吧......
最近正在搞 撲克... 由於是伺服器很多邏輯都是js的所以..希望cocos2d-x的用戶端也可以js搞起..但是已經用c++寫的很多了.怎麼辦呢......這就牽扯js和c++的互動問題了.
需求:
1.c++可以註冊到javascript裡面函數.
2.然後js可以調用這個函數.
3.並且能收到這個函數的傳回值.
4.c++可以主動調用這個函數並傳入參數.
呵呵.寫到這塊是不是感覺和Lua神似了...對呀.JS也是指令碼..最近我的新寵. 回頭TS也要準備支援Js的調試的.盡請期待.書歸正傳..先談談.cocos2d-x搞什麼飛機了.讓c++可以使用js的...答案是.spidermonkey這個東東...哦.Firefox的js心臟啊..懂了吧..好了.這個蜘蛛猴子.被封裝的很友好了.所以咱們直接可以用cocos2d-x的ScriptingCore::getInstance()來擷取到有用的東東.當然註冊函數這個cocos2d-x沒給...還有好多函數是個
直接return 0 我去..看代碼沒把我笑死哈哈...
有圖有真相...哥哥從來不騙人.!~好了.不說這個了..如果說寫代碼的時候感覺見鬼了..看看源碼還是有好處的.
1.如果想在c++裡面註冊一個JS函數..需要使用JS_DefineFunction.這個函數是 蜘蛛猴的函數..咱們可以直接使用的.比如我想鬧個叫TS_Out的函數.然後有n個參數.那麼就可以這樣寫.
void TSScriptJS::Init(){ ScriptingCore* sc = ScriptingCore::getInstance(); JSFunction* pF = JS_DefineFunction(sc->getGlobalContext(), sc->getGlobalObject(), "TS_JSOut", TSScriptJS::TS_JSOut, 0, JSPROP_READONLY | JSPROP_PERMANENT);}
下面是回調:
JSBool TSScriptJS::TS_JSOut( JSContext *cx, uint32_t argc, jsval *vp ){ if (argc > 0) { JSString *string = NULL; JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &string); if (string) { JSStringWrapper wrapper(string); //這塊就有值了 } } return JS_TRUE;}
然後JS裡面就可以這樣調用了.
TS_JSOut("Timeshift This is Awesome Engine!");
呵呵原諒我的自戀.....
2.c++可以主動調用這個函數並傳入參數.這個功能非常重要.因為c++為主要的開發中,主要是需要js的這種互動操作的.就是說..c++需要js裡面的值
jsval TSScriptJS::JSCallFuncName(const char *name, int count, ...){ ScriptingCore* sc = ScriptingCore::getInstance(); int argc = count; jsval res; jsval *argv = new jsval[count]; va_list insvalist; va_start(insvalist,count); for (int i = 0; i < count; ++i) { argv[i] = std_string_to_jsval(sc->getGlobalContext(),std::string(va_arg(insvalist,const char *))); } va_end(insvalist) ; JS_CallFunctionName(sc->getGlobalContext(), sc->getGlobalObject(), name, argc, argv, &res); delete [] argv; return res ;}
這個帥的掉渣的函數意思就是說..哦 name就是函數名字了. count就是有幾個參數.然後後面我為了方便都傳入的字串..您可以隨心而樂的.如果不怕麻煩..呵呵.
然後會返回一個 jsval.這個是個非常強大結構..他可以是任何類型的東西.spidermonke給了很多函數.cocos2d-x也給了很多來轉化這個類型到熟知的c++類型.
jsval pR = TSScriptJS::GetSingleTon()->JSCallFuncName("TS_JSMain",3,"haha!","hoho!","heihei!"); JSString* pS = JS_ValueToString(ScriptingCore::getInstance()->getGlobalContext(), pR); JSStringWrapper pW(pS); CCLog(pW.get().c_str());
好了現在定義這個叫做 TS_JSMain的函數在JS中吧.
function TS_JSMain(v1,v2,v3) { try { cc.log(v1+v2+v3); } catch(e) { cc.log("出事了!!" + e); return; } return "TimeShift is Awesome!";}
好了變數什麼的讀取和寫值.請見下一節..!