本文参照了红孩儿的文章:http://blog.csdn.net/honghaier/article/details/8009046
将cocos2d-x与MFC结合,主要目的就是在windows下编写编辑器,对于一款游戏来说,工具的重要性不言而喻,出于此目的,做了这方面的研究,主要参照了红孩儿的文章,将自己的一些实践步骤写出来。
首先创建工程
应用类型我选择对话框
直接点完成,项目创建完毕。
接下来添加一个picture控件,控件大小没关系,我是将其放在中间位置,如图:
然后修改picture的控件ID,如图:
ID随意,我改成了IDC_PIC_COCOS2DX。
然后给picture控件添加一个变量,在控件上右键,选择添加变量,如图:
变量名可以随便起,然后点击完成。
这样IDE会自动将声明代码添加到你的对话框类中,我的类声明文件是cocos2dx-uidlg.h,变化如下:
新生成的变量类型是CStatic,这个类无法完成我们的需求,所以我们要创建自己的类型。
右键工程=》添加=》类,选择MFC类,如图:
点击添加,填写类信息,如图:
点击完成,新类添加完毕。
将cocos2dx-uidlg.h文件中Ccocos2dxuiDlg::m_nPicCocos2dx类型修改为CCocos2DXWin
好了,编译一下,通过,如果你没有通过,那你需要检查一下之前的步骤。
接下来我们要实现CCocos2DXWin类,那么首先,我们要将cocos2dx的文件包含到工程中,
首先添加头文件,选择项目属性=》配置属性=》C/C++ =》常规 =》 附加包含目录,配置如图:
我的cocos2dx装在D盘下,在你的系统上,你要选择你的cocos2dx目录。
接下来设置链接库文件与路径,首先设置库搜索路径,选择项目属性=》配置属性=》链接器 =》常规 =》 附加库目录,配置如图:
然后设置需要链接的库,选择项目属性=》配置属性=》链接器 =》输入 =》 附加依赖项,如图:
最后要设置一下dll搜索路径,你也可以将其复制到工程目录下,但是由于后续我们要修改cocos2dx源代码,所以添加cocos2dx的编译目录,配置项目属性=》配置属性=》调试=》环境,如图:
接下来修改CCocos2DXWin类,
添加public方法
BOOL createCocos2dXWin();
添加变量
BOOL m_bInitCocos2dx;
此时CCocos2DXWin的头文件如下:
下面要开始实现Cocos2DXWin.cpp了
首先把cocos2dx包含进来:
#include "cocos2d.h"
using namespace cocos2d;
实现createCocos2dXWin函数,如下:
我们调用了CCApplication::sharedApplication()->run函数,并传入了参数,可这个函数现在并不存在,所以我们要修改cocos2dx引擎代码,将这个函数添加进去。
打开cocos2dx工程,找到CCApplication.h,如图:
添加我们需要的run函数:
int run(HWND hWnd,LPCTSTR szTitle,UINT width,UINT height);
然后在CCApplication.cpp中实现它
代码很简单,但是m_nLast变量与initInstance函数现在还没有,回到头文件中添加
LARGE_INTEGER
m_nLast;
virtual bool initInstance(HWND hWnd,UINT height);
然后在cpp文件中实现initInstance函数
函数的主要工作是调用了CCEGLView::Create函数,此函数还不存在,我们要添加
打开CCEGLView.h,添加函数
virtual bool Create(HWND hWnd,UINT w,UINTh);
在cpp中实现函数
改造到此,我们缺少WinProc函数,也就是处理windows消息函数,这个函数我们要添加到CCocos2DXWin中。
在类视图中选择CCocos2DXWin的属性
在属性列表中选择重写WindowProc,IDE会为我们在CCocos2DXWin.cpp中生成对应函数,做如下修改:
我们只是将消息传递给CCEGLView::WindowProc中,很简单。
现在大部分的改造都完成了,但是有一个问题,默认的CCApplication::run函数功能处理了windows消息,我们实现了自己的WindowProc函数来代替。但是run函数还调用了CCDirector::mainLoop函数,这个函数我们还没有调用,所以程序运行起来我们什么也看不到,解决方案就是在CCocos2DXWin中增加一个Timer,周期调用mainLoop。首先在CCocos2DXWin::createCocos2dXWin函数最后增加代码
SetTimer(1,1,NULL);
然后在CCocos2DXWin的属性中选择处理WM_TIMER消息,然后在OnTimer函数中实现如下内容:
接下来在CCApplication中实现renderWorld函数
函数的主要功能就是调用mainLoop。
接下来我们要增加清理函数,也就是要实现OnDestroy函数,实现CCocos2DXWin的WM_DESTROY消息
CCocos2DXWin类编写完毕,现在要对其初始化,也就是调用CCocos2DXWin::createCocos2dXWin函数,在Ccocos2dxuiDlg::OnInitDialog的最后加上调用
m_nPicCocos2dx.createCocos2dXWin();
好了,改造完毕,编译并运行,竟然段错误,调了一下代码,发现问题所在,原来在调用
CCApplication::sharedApplication函数时,函数只是将一个名叫sm_pSharedApplication的指针返回,这个指针初始化为NULL,在构造CCApplication时,才会将this赋值给它,所以我们需要初始化CCApplication,我将cocos2dx例子工程中的AppDelegate.h,AppDelegate.cpp,HelloWorldScene.h,HelloWorldScene.cpp赋值到工程下(当然,相关的png等资源也一并复制),然后在CCocos2DXWin中增加AppDelegate类型变量,如下:
在此编译并运行,效果如下:
集成完毕!
cocos2d-x版本:cocos2d-2.0-x-2.0.3
按照以上方法集成后,picture控件是无法响应消息的,消息都被dialog截获了。留言中有人问到了这个问题,
一直也没有时间,现在就简单的处理一下。
我们需要做的是判断鼠标在dialog中的坐标位置,如果位于picture区域,则将其发送给控件。
首先在Ccocos2dxuiDlg类中增加如下两个函数
Ccocos2dxuiDlg::isPointInCocos2dWin的功能是判断点是否在picture控件区域内
Ccocos2dxuiDlg::getCocos2dPt的功能是将windows下的坐标转换到cocos2dx下
然后在Ccocos2dxuiDlg增加用于处理鼠标事件的消息函数
这几个函数类似,都是首先判断鼠标点是否在picture控件区域内,然后转换坐标,最后将消息发送给控件。
经过以上的处理,cocos2dx就可以响应消息了。
我做的小例子如下:
做了个console窗口, 方便调试 :)
原文链接:https://www.f2er.com/cocos2dx/342523.html将cocos2d-x与MFC结合,主要目的就是在windows下编写编辑器,对于一款游戏来说,工具的重要性不言而喻,出于此目的,做了这方面的研究,主要参照了红孩儿的文章,将自己的一些实践步骤写出来。
首先创建工程
应用类型我选择对话框
直接点完成,项目创建完毕。
接下来添加一个picture控件,控件大小没关系,我是将其放在中间位置,如图:
然后修改picture的控件ID,如图:
ID随意,我改成了IDC_PIC_COCOS2DX。
然后给picture控件添加一个变量,在控件上右键,选择添加变量,如图:
变量名可以随便起,然后点击完成。
这样IDE会自动将声明代码添加到你的对话框类中,我的类声明文件是cocos2dx-uidlg.h,变化如下:
新生成的变量类型是CStatic,这个类无法完成我们的需求,所以我们要创建自己的类型。
右键工程=》添加=》类,选择MFC类,如图:
点击添加,填写类信息,如图:
点击完成,新类添加完毕。
将cocos2dx-uidlg.h文件中Ccocos2dxuiDlg::m_nPicCocos2dx类型修改为CCocos2DXWin
好了,编译一下,通过,如果你没有通过,那你需要检查一下之前的步骤。
接下来我们要实现CCocos2DXWin类,那么首先,我们要将cocos2dx的文件包含到工程中,
首先添加头文件,选择项目属性=》配置属性=》C/C++ =》常规 =》 附加包含目录,配置如图:
我的cocos2dx装在D盘下,在你的系统上,你要选择你的cocos2dx目录。
接下来设置链接库文件与路径,首先设置库搜索路径,选择项目属性=》配置属性=》链接器 =》常规 =》 附加库目录,配置如图:
然后设置需要链接的库,选择项目属性=》配置属性=》链接器 =》输入 =》 附加依赖项,如图:
最后要设置一下dll搜索路径,你也可以将其复制到工程目录下,但是由于后续我们要修改cocos2dx源代码,所以添加cocos2dx的编译目录,配置项目属性=》配置属性=》调试=》环境,如图:
接下来修改CCocos2DXWin类,
添加public方法
BOOL createCocos2dXWin();
添加变量
BOOL m_bInitCocos2dx;
此时CCocos2DXWin的头文件如下:
下面要开始实现Cocos2DXWin.cpp了
首先把cocos2dx包含进来:
#include "cocos2d.h"
using namespace cocos2d;
实现createCocos2dXWin函数,如下:
我们调用了CCApplication::sharedApplication()->run函数,并传入了参数,可这个函数现在并不存在,所以我们要修改cocos2dx引擎代码,将这个函数添加进去。
打开cocos2dx工程,找到CCApplication.h,如图:
添加我们需要的run函数:
int run(HWND hWnd,LPCTSTR szTitle,UINT width,UINT height);
然后在CCApplication.cpp中实现它
代码很简单,但是m_nLast变量与initInstance函数现在还没有,回到头文件中添加
LARGE_INTEGER
virtual bool initInstance(HWND hWnd,UINT height);
然后在cpp文件中实现initInstance函数
函数的主要工作是调用了CCEGLView::Create函数,此函数还不存在,我们要添加
打开CCEGLView.h,添加函数
virtual bool Create(HWND hWnd,UINT w,UINTh);
在cpp中实现函数
改造到此,我们缺少WinProc函数,也就是处理windows消息函数,这个函数我们要添加到CCocos2DXWin中。
在类视图中选择CCocos2DXWin的属性
在属性列表中选择重写WindowProc,IDE会为我们在CCocos2DXWin.cpp中生成对应函数,做如下修改:
我们只是将消息传递给CCEGLView::WindowProc中,很简单。
现在大部分的改造都完成了,但是有一个问题,默认的CCApplication::run函数功能处理了windows消息,我们实现了自己的WindowProc函数来代替。但是run函数还调用了CCDirector::mainLoop函数,这个函数我们还没有调用,所以程序运行起来我们什么也看不到,解决方案就是在CCocos2DXWin中增加一个Timer,周期调用mainLoop。首先在CCocos2DXWin::createCocos2dXWin函数最后增加代码
SetTimer(1,1,NULL);
然后在CCocos2DXWin的属性中选择处理WM_TIMER消息,然后在OnTimer函数中实现如下内容:
接下来在CCApplication中实现renderWorld函数
函数的主要功能就是调用mainLoop。
接下来我们要增加清理函数,也就是要实现OnDestroy函数,实现CCocos2DXWin的WM_DESTROY消息
CCocos2DXWin类编写完毕,现在要对其初始化,也就是调用CCocos2DXWin::createCocos2dXWin函数,在Ccocos2dxuiDlg::OnInitDialog的最后加上调用
m_nPicCocos2dx.createCocos2dXWin();
好了,改造完毕,编译并运行,竟然段错误,调了一下代码,发现问题所在,原来在调用
CCApplication::sharedApplication函数时,函数只是将一个名叫sm_pSharedApplication的指针返回,这个指针初始化为NULL,在构造CCApplication时,才会将this赋值给它,所以我们需要初始化CCApplication,我将cocos2dx例子工程中的AppDelegate.h,AppDelegate.cpp,HelloWorldScene.h,HelloWorldScene.cpp赋值到工程下(当然,相关的png等资源也一并复制),然后在CCocos2DXWin中增加AppDelegate类型变量,如下:
在此编译并运行,效果如下:
集成完毕!
cocos2d-x版本:cocos2d-2.0-x-2.0.3
按照以上方法集成后,picture控件是无法响应消息的,消息都被dialog截获了。留言中有人问到了这个问题,
一直也没有时间,现在就简单的处理一下。
我们需要做的是判断鼠标在dialog中的坐标位置,如果位于picture区域,则将其发送给控件。
首先在Ccocos2dxuiDlg类中增加如下两个函数
Ccocos2dxuiDlg::isPointInCocos2dWin的功能是判断点是否在picture控件区域内
Ccocos2dxuiDlg::getCocos2dPt的功能是将windows下的坐标转换到cocos2dx下
然后在Ccocos2dxuiDlg增加用于处理鼠标事件的消息函数
这几个函数类似,都是首先判断鼠标点是否在picture控件区域内,然后转换坐标,最后将消息发送给控件。
经过以上的处理,cocos2dx就可以响应消息了。
我做的小例子如下:
做了个console窗口, 方便调试 :)