【cocos2d-x从c++到js】13:回调函数2——JSCallbackWrapper
来源:互联网 发布:mysql distinct where 编辑:程序博客网 时间:2024/06/05 18:46
2014-01-26 16:14:18
标签:cocos2d-x js jsb
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://goldlion.blog.51cto.com/4127613/1354903
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class
JSCallbackWrapper:
public
cocos2d::Object {
public
:
JSCallbackWrapper();
virtual
~JSCallbackWrapper();
void
setJSCallbackFunc(jsval obj);
void
setJSCallbackThis(jsval thisObj);
void
setJSExtraData(jsval data);
const
jsval& getJSCallbackFunc()
const
;
const
jsval& getJSCallbackThis()
const
;
const
jsval& getJSExtraData()
const
;
protected
:
jsval _jsCallback;
jsval _jsThisObj;
jsval _extraData;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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]);
if
(argc >= 2) {
tmpCobj->setJSCallbackThis(argv[1]);
}
if
(argc == 3) {
tmpCobj->setJSExtraData(argv[2]);
}
CallFuncN *ret = CallFuncN::create([=](Node* sender){
const
jsval& jsvalThis = tmpCobj->getJSCallbackThis();
const
jsval& jsvalCallback = tmpCobj->getJSCallbackFunc();
const
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;
if
(jsvalCallback != JSVAL_VOID)
{
if
(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);
JS_AddValueRoot(cx, &senderVal);
JS_CallFunctionValue(cx, thisObj, jsvalCallback, 1, &senderVal, &retval);
JS_RemoveValueRoot(cx, &senderVal);
}
}
// 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, 0, argv[0]);
if
(argc > 1) {
JS_SetReservedSlot(proxy->obj, 1, argv[1]);
}
// if(argc == 3) {
// JS_SetReservedSlot(proxy->obj, 2, argv[2]);
// }
// test->execute();
return
JS_TRUE;
}
JS_ReportError(cx,
"Invalid number of arguments"
);
return
JS_FALSE;
}
1
2
3
4
5
6
7
8
9
10
CallFuncN * CallFuncN::create(
const
std::function<
void
(Node*)> &func)
{
auto
ret =
new
CallFuncN();
if
(ret && ret->initWithFunction(func) ) {
ret->autorelease();
return
ret;
}
CC_SAFE_DELETE(ret);
return
nullptr;
}
1
2
3
4
5
bool
CallFuncN::initWithFunction(
const
std::function<
void
(Node *)> &func)
{
_functionN = func;
return
true
;
}
1
2
3
4
5
6
7
8
void
CallFuncN::execute() {
if
(_callFuncN) {
(_selectorTarget->*_callFuncN)(_target);
}
else
if
(_functionN) {
_functionN(_target);
}
}
0 0
- 【cocos2d-x从c++到js】13:回调函数2——JSCallbackWrapper
- 【cocos2d-x从c++到js】13:回调函数2——JSCallbackWrapper
- 【cocos2d-x从c++到js】回调函数2——JSCallbackWrapper
- 【cocos2d-x从c++到js】回调函数2——JSCallbackWrapper
- 【cocos2d-x从c++到js】回调函数1——按键回调
- 【cocos2d-x从c++到js】回调函数1——按键回调
- 【cocos2d-x从c++到js】12:回调函数1——按键回调
- 【cocos2d-x从c++到js】12:回调函数1——按键回调
- 【cocos2d-x从c++到js】回调函数1——按键回调
- 【cocos2d-x从c++到js】回调函数1——按键回调
- 【cocos2d-x从c++到js】回调函数1——按键回调
- cocos2d-x 回调函数
- cocos2d-x 回调函数
- Cocos2d-x 回调函数
- cocos2d-x学习笔记——cocos2d-x3.0回调函数的变化
- cocos2d-x游戏开发回调函数
- cocos2d-x 回调函数详解
- cocos2d-x 回调函数详解
- hadoop学习7-
- CSS:自定义链接样式(设置链接不同状态下的字体颜色/背景色等)
- 学习博客、网站
- Unity3d-除了C#还需要学习什么语言?
- 酒店评价方案
- 【cocos2d-x从c++到js】13:回调函数2——JSCallbackWrapper
- HDFS性能压测工具浅析
- 在springmvc项目中使用poi导入导出excel
- Activity调用出错
- ubuntu破解加密rar压缩文件
- 【LeetCode】Palindrome Number
- Win7 + vs2012 + cocos2d-x2.2 配置开发环境
- 基于msOS-stm32系统选择的想法
- javax.mail.AuthenticationFailedException