Cocos2d-x的SprideMonkey的JavaScript與C++的互動(一) – 函數操作

來源:互聯網
上載者:User

最近也是換了份新工作.搞棋牌平台了...標新立異呵呵.哥哥使用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!";}

好了變數什麼的讀取和寫值.請見下一節..!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.