v3.5 已构建工程升级指南

从 v3.5 开始,Mac 和 Windows 平台的 AppDelegate 已移入引擎内部实现,可以通过重载 AppDelegate 的方式来兼容之前版本的用法;game.cpp 也进行了调整,已有工程需要重新构建进行升级。

工程升级

检查工程目录下 native/engine 目录是否存在。如果存在,需要删除文件夹,删除前需要做好备份(这个目录如果存在,重新构建时不会自动更新);不存在,则直接构建即可。

自定义代码迁移方法

之前在 AppDelegate 添加的代码,可以通过下文定制平台和 AppDelegate 进行升级;自定义的 game.cpp 可以通过接口更替即可升级。

平台与 AppDelegate 的定制方法

Mac 为例:

1、自定义AppDelegate(参考文件名:MyAppdelegate.h,MyAppdelegate.mm)

  1. @interface MyAppDelegate : NSObject<AppDelegate>
  2. // 定义需要重写的方法
  3. - (void)applicationWillResignActive:(UIApplication *)application;
  4. @end
  5. @implementation MyAppDelegate
  6. - (void)applicationWillResignActive:(UIApplication *)application {
  7. // 注意:调用父类的方法
  8. [super applicationWillResignActive:application]
  9. }
  10. @end

2、自定义平台(参考文件名:CustomMacPlatform.h)

  1. #include "platform/BasePlatform.h"
  2. #include "MyAppDelegate.h"
  3. class CustomMacPlatform : public MacPlatform {
  4. public:
  5. // 重写平台初始化方法
  6. int32_t init() override {
  7. // 调用父类的方法
  8. return MacPlatform::init();
  9. }
  10. // 这里进入 oc 的消息循环,直到程序退出
  11. int32_t run(int argc, const char** argv) {
  12. id delegate = [[MyAppDelegate alloc] init];
  13. NSApplication.sharedApplication.delegate = delegate;
  14. return NSApplicationMain(argc, argv);
  15. }
  16. }

3、加载自定义平台(参考文件名:main.mm)

  1. #include "CustomMacPlatform.h"
  2. int main(int argc, const char * argv[]) {
  3. CustomMacPlatform platform;
  4. if (platform.init()) {
  5. return -1;
  6. }
  7. return platform.run(argc, (const char**)argv);
  8. }

game.cpp 迁移方法

  • 设置js加密秘钥:jsb_set_xxtea_key -> 设置 _xxteaKey 成员变量; 或 调用 setXXTeaKey
  • 设置调试: jsb_enable_debugger -> 设置 _debuggerInfo 结构, 或 调用 setDebugIpAndPort
  • 设置异常回调:setExceptionCallback -> 重写 handleException 接口
  • 运行自定义脚本:jsb_run_script -> 调用 runScript
  • 可以通过使用 engine 来添加需要监听的事件, -> getEngine()->addEventCallback(WINDOW_OSEVENT, eventCb);
  • 自定义的游戏 CustomGame,需要注册到引擎 CC_REGISTER_APPLICATION(CustomGame) 进行加载;
  • game 继承于 cc::BaseGame, 而 cc::BaseGame 继承于 CocosApplication,因此可以重写部分实现,增加自定义逻辑;

Native 文件修改

  • 替换引用的头文件:#include "cocos/platform/Application.h" —> #include "application/ApplicationManager.h"
  • 使用方式变更:cc::Application::getInstance()->getScheduler() -> CC_CURRENT_ENGINE()->getScheduler()
  • 有自定义 jsb 接口的情况:native_ptr_to_seval 替换为 nativevalue_to_se

Android 升级指南

JAVA 修改

  • game/AppActivity.java 以及 game/InstantActivity.javaonCreate 方法中删除如下代码:

    1. // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
    2. if (!isTaskRoot()) {
    3. // Android launched another instance of the root activity into an existing task
    4. // so just quietly finish and go away, dropping the user back into the activity
    5. // at the top of the stack (ie: the last state of this task)
    6. // Don't need to finish it again since it's finished in super.onCreate .
    7. return;
    8. }
  • app/AndroidManifest.xml 执行下列操作:

    • 删除 application 标签中的下列代码:android:taskAffinity=""
    • application 标签中增加下列代码:android:exported="true"
  • app/build.gradle 修改下列代码:

    1. "${RES_PATH}/assets" -> "${RES_PATH}/data"

CMakeLists.txt 修改

  • android/CMakeLists.txt

    • LIB_NAME 变更为 CC_LIB_NAME
    • PROJ_SOURCES 变更为 CC_PROJ_SOURCES
    • 增加 set(CC_PROJECT_DIR ${CMAKE_CURRENT_LIST_DIR})
    • 增加 set(CC_COMMON_SOURCES)
    • 增加 set(CC_ALL_SOURCES)
    • 删除下列代码:

      1. ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/Game.h
      2. ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/Game.cpp
      3. add_library(${LIB_NAME} SHARED ${PROJ_SOURCES})
      4. target_link_libraries(${LIB_NAME}
      5. "-Wl,--whole-archive" cocos2d_jni "-Wl,--no-whole-archive"
      6. cocos2d
      7. )
      8. target_include_directories(${LIB_NAME} PRIVATE
      9. ${CMAKE_CURRENT_LIST_DIR}/../common/Classes
      10. )
    • 增加代码:

      1. cc_android_before_target(${CC_LIB_NAME})
      2. add_library(${CC_LIB_NAME} SHARED ${CC_ALL_SOURCES})
      3. # 此处添加用户依赖库 AAA target_link_libraries(${CC_LIB_NAME} AAA)
      4. # 此处添加用户自定义文件 xxx/include target_include_directories(${CC_LIB_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/xxx/include)
      5. cc_android_after_target(${CC_LIB_NAME})
  • common/CMakeLists.txt

    • cocos2d-x-lite/ 修改为 engine/native/
    • 文件末尾增加代码:

      1. list(APPEND CC_COMMON_SOURCES
      2. ${CMAKE_CURRENT_LIST_DIR}/Classes/Game.h
      3. ${CMAKE_CURRENT_LIST_DIR}/Classes/Game.cpp
      4. )