当前位置:首页 > Windows程序 > 正文

【续】强行在C# Winform中渲染Cocos2d

2021-05-24 Windows程序

  上一篇讲了怎么把Cocos2d-x 3.6渲染进MFC窗体,这里来讲一下怎么在C# Winform中做到同样的功能。如果你不熟悉MFC的使用但对C# Winform比较在行,请往下看。

  这一篇是作为上一篇的副属文,所以文中提到的部分操作需要在上一篇中找……博主懒逼不在这复制粘贴了。

【核心思想】

  同上一章不同的是,C#是托管环境,并不能直接用“类.方法()”这样的形式来访问Cocos层的代码。我们需要在其间建立一个DLL层(C++编写)作为Cocos层的接口,让C#通过接口来控制Cocos层。

【需要的工具】

  1、    安装了C#组件的Visual Studio 2013

  2、    Cocos2d-x 3.6

  3、    GLFW (下载地址:点我)

  4、    CMake(下载地址:点我)

【操作步骤】

  1、    创建C# Winform项目

    .NET的版本随意,使用默认的及以上即可。

    

技术分享

  2、    拷贝必要文件

    参考上一篇

  3、    创建空的C++项目

    这个是DLL项目VS2013创建的C++ DLL项目默认是Win8.1平台的,不知道里面装了什么奇怪的东西进去……于是手动创建干净的DLL项目。项目名称自定,我使用的是“App”

    

技术分享

    添加完成后,将App项目设为C#项目的依赖项。

  4、    在解决方案中加入Cocos项目

    将libcocos2d,,libbox2d,libspine加入解决方案中,并把libcocos2d设为App项目的依赖项。

  5、    修改C++项目的属性

    在属性管理器(视图——属性管理器)中为项目添加cocos2dx的两个属性表。属性表位于解决方案目录\cocos2d\cocos\2d:

    

    常规页面,按照打框处设置:

    

技术分享

    调试页面,设置工作目录:

    

技术分享

    

    附加包含目录中加入:

    $(EngineRoot)cocos\audio\include
    $(EngineRoot)external
    $(EngineRoot)external\chipmunk\include\chipmunk
    $(EngineRoot)extensions
    ..\Classes
    ..
    %(AdditionalIncludeDirectories)
    $(_COCOS_HEADER_WIN32_BEGIN)
    $(_COCOS_HEADER_WIN32_END)

  

    预处理器定义中加入:

    _WIN32
    _WINDOWS
    COCOS2D_DEBUG=1
    _CRT_SECURE_NO_WARNINGS

    附加库目录中加入:

    $(_COCOS_LIB_PATH_WIN32_BEGIN)

    $(_COCOS_LIB_PATH_WIN32_END)

  

    附加依赖项加入:

    $(_COCOS_LIB_WIN32_BEGIN)

    $(_COCOS_LIB_WIN32_END)

    libcocos2d.lib

  6、    修改GLFW

    同上一篇

  7、    修改Cocos层

    同上一篇,以及修改CCFileUtils-win32.cpp 59行的方法:

static void _checkPath() { if (0 == s_resourcePath.length()) { char pathBuffer[MAX_PATH] = { 0 }; WCHAR wszPath[MAX_PATH] = { 0 }; int nNum = WideCharToMultiByte(CP_ACP, 0, wszPath, GetCurrentDirectory(sizeof(wszPath), wszPath), pathBuffer, MAX_PATH, NULL, NULL); pathBuffer[nNum] = ‘\\‘; s_resourcePath = pathBuffer; } }

  

  8、    为C++项目添加代码

    首先添加一个标准DLL源文件dllmain.cpp(名字必须是这个):

// dllmain.cpp : Defines the entry point for the DLL application. #include <windows.h> BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: //instance will be deleted automatically break; } return TRUE; }

  

    然后将Classes文件夹中的源码加入到项目中:

    

技术分享

    最后添加接口(文件名自定,我使用的API.h和API.cpp),头文件:

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70399.html