Cocos2dx-jsb 中Node的onEnter过程分析(1)

2024-04-06 03:58

本文主要是介绍Cocos2dx-jsb 中Node的onEnter过程分析(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Cocos2dx-jsb 中Node的onEnter过程分析(1):
1、
当一个子节点被接入到父节点上时,都会调用Node::addChild方法,
if( _running ){child->onEnter(); //调用子节点的onEnter方法// prevent onEnterTransitionDidFinish to be called twice when a node is added in onEnterif (_isTransitionFinished) //如果有场景又过度,则调用onEnterTransitionDidFinish方法,和上面的onEnter方法类似。{child->onEnterTransitionDidFinish();}}
2、
onEnter方法分析:
void Node::onEnter()
{if (_onEnterCallback) //如果有回到,则调用_onEnterCallback();○1#if CC_ENABLE_SCRIPT_BINDING  //如果绑定了脚本,则调用if (_scriptType == kScriptTypeJavascript){○2 if (ScriptEngineManager::sendNodeEventToJS(this, kNodeOnEnter))return;}
#endif○3 _isTransitionFinished = false;for( const auto &child: _children)child->onEnter();this->resume();_running = true;#if CC_ENABLE_SCRIPT_BINDINGif (_scriptType == kScriptTypeLua){ScriptEngineManager::sendNodeEventToLua(this, kNodeOnEnter);}
#endif
}3、
看函数的名字,发送节点事件给JS
ScriptEngineManager::sendNodeEventToJS(this, kNodeOnEnter)
bool ScriptEngineManager::sendNodeEventToJS(Node* node, int action)
{auto scriptEngine = getInstance()->getScriptEngine();//这里是为了防止反复调用,标记是不是从JS调用的if (scriptEngine->isCalledFromScript()){// Should only be invoked at root class NodescriptEngine->setCalledFromScript(false);}else{BasicScriptData data(node,(void*)&action);ScriptEvent scriptEvent(kNodeEvent,(void*)&data);if (scriptEngine->sendEvent(&scriptEvent))return true;}return false;
}
4、sendEvent: 
int ScriptingCore::sendEvent(ScriptEvent* evt)
{if (NULL == evt)return 0;// special type, can't use this code after JSAutoCompartmentif (evt->type == kRestartGame){restartVM();return 0;}JSAutoCompartment ac(_cx, _global.ref().get());
//这里会根据事件的类型调用不同的函数,我们这里的是kNodeEvent事件,
//我们这次只分析这个switch (evt->type){case kNodeEvent:{return handleNodeEvent(evt->data);}break;case kMenuClickedEvent:break;case kTouchEvent:{TouchScriptData* data = (TouchScriptData*)evt->data;return handleTouchEvent(data->nativeObject, data->actionType, data->touch, data->event);}break;case kTouchesEvent:{TouchesScriptData* data = (TouchesScriptData*)evt->data;return handleTouchesEvent(data->nativeObject, data->actionType, data->touches, data->event);}break;case kComponentEvent:{return handleComponentEvent(evt->data);}break;default:CCASSERT(false, "Invalid script event.");break;}return 0;
}5、handleNodeEvent这个函数是真正的调用Js
int ScriptingCore::handleNodeEvent(void* data)
{if (NULL == data)return 0;BasicScriptData* basicScriptData = static_cast<BasicScriptData*>(data);if (NULL == basicScriptData->nativeObject || NULL == basicScriptData->value)return 0;Node* node = static_cast<Node*>(basicScriptData->nativeObject);int action = *((int*)(basicScriptData->value));js_proxy_t * p = jsb_get_native_proxy(node);if (!p) return 0;int ret = 0;JS::RootedValue retval(_cx);jsval dataVal = INT_TO_JSVAL(1);if (action == kNodeOnEnter)
{
//根据不同的事件,如果JS又重载,调用不同的JS重载函数。if (isFunctionOverridedInJS(JS::RootedObject(_cx, p->obj.get()), "onEnter", js_cocos2dx_Node_onEnter)){ret = executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), "onEnter", 1, &dataVal, &retval);}resumeSchedulesAndActions(p);}else if (action == kNodeOnExit){if (isFunctionOverridedInJS(JS::RootedObject(_cx, p->obj.get()), "onExit", js_cocos2dx_Node_onExit)){ret = executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), "onExit", 1, &dataVal, &retval);}pauseSchedulesAndActions(p);}else if (action == kNodeOnEnterTransitionDidFinish){if (isFunctionOverridedInJS(JS::RootedObject(_cx, p->obj.get()), "onEnterTransitionDidFinish", js_cocos2dx_Node_onEnterTransitionDidFinish)){ret = executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), "onEnterTransitionDidFinish", 1, &dataVal, &retval);}}else if (action == kNodeOnExitTransitionDidStart){if (isFunctionOverridedInJS(JS::RootedObject(_cx, p->obj.get()), "onExitTransitionDidStart", js_cocos2dx_Node_onExitTransitionDidStart)){ret = executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), "onExitTransitionDidStart", 1, &dataVal, &retval);}}else if (action == kNodeOnCleanup) {cleanupSchedulesAndActions(p);}return ret;
}6、到此为止,○1○2两部分都分析完了,那第○3部分,什么时候调用呢?
第三部分的代码:_isTransitionFinished = false;for( const auto &child: _children)child->onEnter();this->resume();_running = true;
第三部分的其实是在JS中重载的onEnter函数:其实也就是我们的onEnter调用过程的测试代码:
onEnter : function (){cc.log("onEnter+++++++++++++++++++++++++1111111")this._super(); // 第○3部分是在这里调用的,下一篇再进行分析。cc.log("onEnter+++++++++++++++++++++++++2222222")
}

这篇关于Cocos2dx-jsb 中Node的onEnter过程分析(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878940

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重