cococos 2 d-x jsb/html 5にタッチエージェントを設定する方法

2691 ワード

公式の説明とは異なり、js bindingの多くのapiとch 5版は異なる.違うものに出会ったら、ソースコードを見て探すように努力しなければなりません.
主に以下のファイルです.cocos2d_specifics.cpp cocos2d_specifics.hpp ScriptingCore.cpp ScriptingCore.h
はい、くだらないことは言わないで、次はテーマを話します.
ch 5バージョンではタッチエージェントをjsbバージョンのapiとは異なるように設定し,ここではターゲットエージェントを例に挙げる.
ch 5バージョンの設定方法


cc.Director.getInstance().getTouchDispatcher().addTargetedDelegate(node, priority, true);

これで大丈夫だ,何も言うことはない
jsbバージョンの設定方法
上の文をjsbバージョンに置くとすぐに間違いを報告して、これはfunctionではないことを教えてあげます.そこで私たちは怒ってソースを見ました.
addTargetedDelegateを検索してcocos 2 d_specifics.cppで見つけた
 
void JSTouchDelegate::registerTargettedDelegate(int priority, bool swallowsTouches) { CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->addTargetedDelegate(this, priority, swallowsTouches); }

 
どこで呼び出されたか見てみましょう
 
JSBool js_cocos2dx_JSTouchDelegate_registerTargettedDelegate(JSContextcx, uint32_t argc, jsval vp) { if (argc >= 1) { jsval argv = JS_ARGV(cx, vp); JSObject jsobj = NULL; JSTouchDelegate *touch = new JSTouchDelegate(); touch->autorelease(); touch->registerTargettedDelegate((argc >= 1 ? JSVAL_TO_INT(argv[0]) : 0), (argc >= 2 ? JSVAL_TO_BOOLEAN(argv[1]) : true)); jsobj = (argc == 3 ? JSVAL_TO_OBJECT(argv[2]) : JSVAL_TO_OBJECT(JSVAL_VOID)); touch->setJSObject(jsobj); JSTouchDelegate::setDelegateForJSObject(jsobj, touch); return JS_TRUE; } JS_ReportError(cx, “wrong number of arguments: %d, was expecting >=1”, argc); return JS_FALSE; }

 
次にjs_が登録されている場所を見てみましょうcocos2dx_JSTouchDelegate_registerTargettedDelegate
はい、見つかりました.
JS_DefineFunction(cx, ns, "registerTargettedDelegate", js_cocos2dx_JSTouchDelegate_registerTargettedDelegate, 1, JSPROP_READONLY | JSPROP_PERMANENT);

だから私たちが使う方法はccです.registerTargettedDelegate()です.パラメータについては、上記のjs_を参照してください.cocos2dx_JSTouchDelegate_registerTargettedDelegateメソッド
最後の結論はjsbで
 
cc.Director.getInstance().getTouchDispatcher().addTargetedDelegate(node, priority, true);

 
統合版
ch 5とjsbで同様に有効であるために,現在のプラットフォームをコードで判断する.
 
var addTargetedDelegate = function (node, priority){

    if ("opengl" in sys.capabilities && "browser" != sys.platform){

        cc.registerTargettedDelegate(priority, true, node);

    }

    else {

        cc.Director.getInstance().getTouchDispatcher().addTargetedDelegate(node, priority, true);

    }

};

 
さて、本稿では、標準エージェントとログアウトエージェントも同様の処理方法で、自分で見ることができます.