【cocos2d-x从c++到js】回调函数1——按键回调
发布时间:2020-12-14 17:10:29 所属栏目:百科 来源:网络整理
导读:上一篇我们讲了按键回调,这一次我们来说说各种逻辑上的回调函数。 Cocos2d-x里面一共有三大类回调函数,第一是按键回调CCMenu相关的,第二类是定时器相关的回调 Schedule,第三类是Action相关的回调CallFunc。这些回调从最初的引擎版本中就存在着,一直到现
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
// cc.CallFunc.create( func,this,[data])
// cc.CallFunc.create( func )
static
JSBool js_callFunc(JSContext *cx,uint32_t argc,jsval *vp)
{
if
(argc >= 1 && argc <= 3) {
jsval *argv = JS_ARGV(cx,vp);
std::shared_ptr<JSCallbackWrapper> tmpCobj(
new
JSCallbackWrapper());
tmpCobj->setJSCallbackFunc(argv[0]);
(argc >= 2) {
tmpCobj->setJSCallbackThis(argv[1]);
}
(argc == 3) {
tmpCobj->setJSExtraData(argv[2]);
}
CallFuncN *ret = CallFuncN::create([=](Node* sender){
jsval& jsvalThis = tmpCobj->getJSCallbackThis();
jsval& jsvalCallback = tmpCobj->getJSCallbackFunc();
jsval& jsvalExtraData = tmpCobj->getJSExtraData();
bool
hasExtraData = !JSVAL_IS_VOID(jsvalExtraData);
JSObject* thisObj = JSVAL_IS_VOID(jsvalThis) ? nullptr : JSVAL_TO_OBJECT(jsvalThis);
JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET
js_proxy_t *proxy = js_get_or_create_proxy<cocos2d::Node>(cx,sender);
jsval retval;
(jsvalCallback != JSVAL_VOID)
{
(hasExtraData)
{
jsval valArr[2];
valArr[0] = OBJECT_TO_JSVAL(proxy->obj);
valArr[1] = jsvalExtraData;
JS_AddValueRoot(cx,valArr);
JS_CallFunctionValue(cx,thisObj,jsvalCallback,2,valArr,&retval);
JS_RemoveValueRoot(cx,valArr);
}
else
{
jsval senderVal = OBJECT_TO_JSVAL(proxy->obj);
}
// I think the JSCallFuncWrapper isn't needed.
// Since an action will be run by a cc.Node,it will be released at the Node::cleanup.
// By James Chen
// JSCallFuncWrapper::setTargetForNativeNode(node,(JSCallFuncWrapper *)this);
});
js_proxy_t *proxy = js_get_or_create_proxy<cocos2d::CallFunc>(cx,ret);
JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(proxy->obj));
JS_SetReservedSlot(proxy->obj,argv[0]);
(argc > 1) {
// if(argc == 3) {
// JS_SetReservedSlot(proxy->obj,argv[2]);
// }
// test->execute();
return
JS_TRUE;
}
JS_ReportError(cx,
"Invalid number of arguments"
);
JS_FALSE;
}
|
10
CallFuncN * CallFuncN::create(
std::function<
(Node*)> &func)
{
auto
ret =
CallFuncN();
(ret && ret->initWithFunction(func) ) {
ret->autorelease();
ret;
}
CC_SAFE_DELETE(ret);
nullptr;
5
CallFuncN::initWithFunction(
(Node *)> &func)
_functionN = func;
return
true
;
8
(_callFuncN) {
(_selectorTarget->*_callFuncN)(_target);
}
else
(_functionN) {
_functionN(_target);
}
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!