C++导出自定义Node,如何传递数据到js?

目前能想到两种方式:

  1. 使用ScriptingCore::getInstance()->evalString(script);,局限是需要向某个全局的位置指定回调函数,比如:

// 在js的某组件onLoad函数中
_G.callback = this.onCallback.bind(this);
// 在C++的需要回调的地方
ScriptingCore::getInstance()->evalString("_G.callback(123)");

  1. 使用CustomEvent发送,在js端接收消息:

// C++
Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(“callback_from_cpp”, “123”);
// js
cc.game.on(“callback_from_cpp”, e => { cc.log(e); });
dispatchCustomEvent的第二个参数是void*,我能想到传基本类型,像const char*,目测传结构体的话应该是在js端接收不到的吧.

在写问题的时候其实已经梳理了一遍思路,至少能达到传数据的目的了,但还是想弄得更清楚一些:

  1. 使用CustomEvent时有办法可以传结构体或者数组吗?
  2. 有没有更直观的方法,比如在js端直接传一个回调函数.(可能是我想多了)

感谢.

c++发送字符串,js收到后用eval

说出来你可能不信,game_on_hide也就是cc.game.EVENT_HIDE,这个消息可以在js端收到,但是自己随意定的"custom_event"消息用相同的方式收不到.不知道是什么问题…

你看你的监听方式和game_on_hide的监听方式是不是一样的啊?

是绑定的吧?回调函数设置是可以绑定的,下面这种类型的 API 就可以自动绑定

void setVersionCompareHandle(const std::function<bool(const std::string& versionA, const std::string& versionB)>& handle) 
{
    _versionCompareHandle = handle;
};

其中 std::function 类型的参数会自动绑定为 JS 层的回调函数,使用的时候:

object.setVersionCompareHandle(function (versionA, versionB) {
    return versionA > versionB;
});

参数注意一下,只支持已知类型的数据,比如:

  1. 已绑定的类
  2. 基础数据类型
  3. 已知转换函数的类型(引擎转换函数定义在 cocos/scripting/js-bindings/manual/js_manual_conversions.h 中)

正是这样,有专门注册一个listener来处理:

// 先注册一个监听器
cc.eventManager.addCustomListener(cc.game.EVENT_SHOW, function() {
    cc.game.emit(cc.game.EVENT_SHOW, cc.game);
});
// 再响应事件
cc.game.on(cc.game.EVENT_SHOW, function() {
    cc.log('on game show');
});

目测不容易取得CustomEvent的内容:

cc.eventManager.addCustomListener('on_custom_cpp_event', function(e) {
    // 这个e是cpp传出的CustomEvent,具体内容我不知道如何取出.
    cc.game.emit(cc.game.EVENT_SHOW, e);
});
// 然后可以响应这个自定义事件了
cc.game.on('on_custom_cpp_event', function() {
    cc.log(''on_custom_cpp_event'');
});

苦于没有办法取得事件内容,目前还是使用ScriptingCore::getInstance()->evalString的方式.

直接回调已测试,非常好用:+1:

1赞