CocosApplication 是 Cocos Creator 引擎的核心组件之一,主要负责管理应用程序的生命周期和初始化引擎,它是 Cocos Creator 引擎与原生平台之间的桥梁。
CocosApplication 类的主要职责包括:
- 初始化引擎
- 管理应用程序生命周期(启动、暂停、恢复、关闭)
- 处理脚本执行和异常
- 创建和管理窗口
- 注册和处理引擎事件
CocosApplication 类构造和析构
构造函数
CocosApplication::CocosApplication() {
_engine = BaseEngine::createEngine();
}
这是 CocosApplication 类的构造函数,它通过调用 BaseEngine::createEngine() 创建了一个引擎实例。这个引擎实例是整个 Cocos Creator 引擎的核心,负责管理游戏循环、渲染、资源加载等关键功能。
CocosApplication.cpp:31:35
析构函数
CocosApplication::~CocosApplication() {
unregisterAllEngineEvents();
}
析构函数调用了 unregisterAllEngineEvents() 方法,用于注销所有注册的引擎事件,确保在应用程序关闭时正确清理资源。
CocosApplication.cpp:36:40
unregisterAllEngineEvents 方法
void CocosApplication::unregisterAllEngineEvents() {
if (_engine != nullptr) {
_engine->off(_engineEvents);
}
}
这个方法用于注销所有引擎事件监听器,防止内存泄漏。它检查引擎实例是否存在,如果存在则移除所有事件监听。
CocosApplication.cpp:41:46
init 方法分析
init 方法是 CocosApplication 类中最重要的方法之一,负责初始化整个应用程序和引擎。让我们详细分析这个方法的实现:
int CocosApplication::init() {
if (_engine->init()) {
return -1;
}
unregisterAllEngineEvents();
_systemWindow = CC_GET_MAIN_SYSTEM_WINDOW();
_engineEvents = _engine->on<BaseEngine::EngineStatusChange>([this](BaseEngine * /*emitter*/, BaseEngine::EngineStatus status) {
switch (status) {
case BaseEngine::ON_START:
this->onStart();
break;
case BaseEngine::ON_RESUME:
this->onResume();
break;
case BaseEngine::ON_PAUSE:
this->onPause();
break;
case BaseEngine::ON_CLOSE:
this->onClose();
break;
default:
CC_ABORT();
}
});
se::ScriptEngine *se = se::ScriptEngine::getInstance();
jsb_init_file_operation_delegate();
se->setExceptionCallback(
std::bind(&CocosApplication::handleException, this, // NOLINT(modernize-avoid-bind)
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
jsb_register_all_modules();
#if CC_EDITOR
auto isolate = v8::Isolate::GetCurrent();
se->start(isolate);
#else
se->start();
#endif
#if (CC_PLATFORM == CC_PLATFORM_IOS)
auto logicSize = _systemWindow->getViewSize();
IScreen *screen = _engine->getInterface<IScreen>();
float pixelRatio = screen->getDevicePixelRatio();
uint32_t windowId = _systemWindow->getWindowId();
events::Resize::broadcast(logicSize.width * pixelRatio, logicSize.height * pixelRatio, windowId);
#endif
return 0;
}
CocosApplication.cpp:47:90
init 方法详解
-
引擎初始化
if (_engine->init()) { return -1; }首先调用引擎的
init()方法进行初始化。如果初始化失败,返回 -1 表示错误。 -
事件注销
unregisterAllEngineEvents();在重新注册事件之前,先注销所有已有的引擎事件。
-
获取系统窗口
_systemWindow = CC_GET_MAIN_SYSTEM_WINDOW();通过宏
CC_GET_MAIN_SYSTEM_WINDOW()获取主系统窗口接口,用于后续的窗口操作。 -
注册引擎状态变化事件
_engineEvents = _engine->on<BaseEngine::EngineStatusChange>([this](BaseEngine * /*emitter*/, BaseEngine::EngineStatus status) { switch (status) { case BaseEngine::ON_START: this->onStart(); break; case BaseEngine::ON_RESUME: this->onResume(); break; case BaseEngine::ON_PAUSE: this->onPause(); break; case BaseEngine::ON_CLOSE: this->onClose(); break; default: CC_ABORT(); } });注册引擎状态变化事件监听器。当引擎状态发生变化时(启动、暂停、恢复、关闭),会调用相应的处理方法。
-
获取脚本引擎实例
se::ScriptEngine *se = se::ScriptEngine::getInstance();获取脚本引擎实例,用于执行 JavaScript 代码。
-
初始化文件操作委托
jsb_init_file_operation_delegate();初始化文件操作委托,为 JavaScript 提供文件操作能力。
-
设置异常回调
se->setExceptionCallback( std::bind(&CocosApplication::handleException, this, // NOLINT(modernize-avoid-bind) std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));设置脚本引擎的异常回调函数,当 JavaScript 代码抛出异常时会调用
handleException方法。 -
注册所有模块
jsb_register_all_modules();注册所有 JavaScript 模块,使 JavaScript 代码可以访问 C++ 实现的功能。
-
启动脚本引擎
#if CC_EDITOR auto isolate = v8::Isolate::GetCurrent(); se->start(isolate); #else se->start(); #endif启动脚本引擎。在编辑器模式下需要传递 V8 的 isolate 实例。
-
iOS 特定初始化
#if (CC_PLATFORM == CC_PLATFORM_IOS) auto logicSize = _systemWindow->getViewSize(); IScreen *screen = _engine->getInterface<IScreen>(); float pixelRatio = screen->getDevicePixelRatio(); uint32_t windowId = _systemWindow->getWindowId(); events::Resize::broadcast(logicSize.width * pixelRatio, logicSize.height * pixelRatio, windowId); #endif对于 iOS 平台,进行特定的初始化操作,包括获取视图大小、像素比例,并广播窗口大小变化事件。
其他重要方法
run 方法
int32_t CocosApplication::run(int argc, const char **argv) {
CC_UNUSED_PARAM(argc);
CC_UNUSED_PARAM(argv);
return _engine->run();
}
run 方法启动应用程序的主循环。它忽略传入的命令行参数,并调用引擎的 run() 方法启动游戏循环。
CocosApplication.cpp:91:96
pause 和 resume 方法
void CocosApplication::pause() {
_engine->pause();
}
void CocosApplication::resume() {
_engine->resume();
}
这两个方法分别用于暂停和恢复应用程序。它们直接调用引擎的相应方法。
CocosApplication.cpp:97:104
restart 方法
void CocosApplication::restart() {
_engine->restart();
}
restart 方法用于重启应用程序,调用引擎的 restart() 方法。
CocosApplication.cpp:121:124
close 方法
void CocosApplication::close() {
_systemWindow->closeWindow();
}
close 方法用于关闭应用程序窗口,调用系统窗口的 closeWindow() 方法。
CocosApplication.cpp:133:136
事件处理方法
onStart, onResume, onPause, onClose 方法
void CocosApplication::onStart() {
// TODO(cc): Handling engine start events
}
void CocosApplication::onPause() {
// TODO(cc): Handling pause events
}
void CocosApplication::onResume() {
// TODO(cc): Handling resume events
}
void CocosApplication::onClose() {
_engine->close();
}
这些方法是引擎状态变化事件的处理函数。当引擎状态变为启动、暂停、恢复或关闭时,会调用相应的方法。目前这些方法的实现是空的,需要在子类中重写以实现具体的功能。
CocosApplication.cpp:140:158
辅助方法
setDebugIpAndPort 方法
void CocosApplication::setDebugIpAndPort(const ccstd::string &serverAddr, uint32_t port, bool isWaitForConnect) {
// Enable debugger here
jsb_enable_debugger(serverAddr, port, isWaitForConnect);
}
设置调试器的 IP 地址和端口,启用调试功能。
CocosApplication.cpp:159:164
runScript 方法
void CocosApplication::runScript(const ccstd::string &filePath) {
jsb_run_script(filePath);
}
执行指定路径的脚本文件。
CocosApplication.cpp:166:169
handleException 方法
void CocosApplication::handleException(const char *location, const char *message, const char *stack) {
// Send exception information to server like Tencent Bugly.
CC_LOG_ERROR("\nUncaught Exception:\n - location : %s\n - msg : %s\n - detail : \n %s\n", location, message, stack);
}
处理脚本引擎抛出的异常,记录错误信息。
CocosApplication.cpp:170:176
setXXTeaKey 方法
void CocosApplication::setXXTeaKey(const ccstd::string &key) {
jsb_set_xxtea_key(key);
}
设置 XXTEA 加密密钥。
CocosApplication.cpp:177:180
createWindow 方法 (Windows/Linux/Mac 平台)
#if CC_PLATFORM == CC_PLATFORM_WINDOWS || CC_PLATFORM == CC_PLATFORM_LINUX || CC_PLATFORM == CC_PLATFORM_QNX || CC_PLATFORM == CC_PLATFORM_MACOS
void CocosApplication::createWindow(const char *title, int32_t w,
int32_t h, int32_t flags) {
_systemWindow->createWindow(title, w, h, flags);
}
void CocosApplication::createWindow(const char *title,
int32_t x, int32_t y, int32_t w,
int32_t h, int32_t flags) {
_systemWindow->createWindow(title, x, y, w, h, flags);
}
#endif
为 Windows、Linux 和 Mac 平台定义了创建窗口的方法。
CocosApplication.cpp:181:193
总结
CocosApplication 是 Cocos Creator 引擎与原生平台交互的核心文件之一。它定义的 CocosApplication 类负责管理应用程序的生命周期,初始化引擎,处理脚本执行和异常,以及创建和管理窗口。
init 方法是这个类中最重要的方法,它完成了以下关键任务:
- 初始化引擎
- 注册引擎状态变化事件
- 初始化脚本引擎
- 设置异常处理
- 注册所有 JavaScript 模块
- 启动脚本引擎
- 处理平台特定的初始化(如 iOS)
通过这些功能,CocosApplication 类为 Cocos Creator 引擎提供了一个稳定的基础,使得开发者可以专注于游戏逻辑的实现,而不需要关心底层的平台细节。

457

被折叠的 条评论
为什么被折叠?



