cocos2dx 3.3 + QT5.3制作游戏编辑器

前端之家收集整理的这篇文章主要介绍了cocos2dx 3.3 + QT5.3制作游戏编辑器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

欢迎转载,但请注明本blog地址,谢谢_(:зゝ∠)_

http://www.cnblogs.com/marisa/p/4141862.html

主要参考:

http://blog.csdn.net/greatchina01/article/details/39579185

http://blog.csdn.net/yurenjimi/article/details/7427330

准备

1. qt-opensource-windows-x86-msvc2013_opengl-5.3.2.exe

2. qt-vs-addin-1.2.3-opensource.exe

3. vs2013

配置环境变量

1. 添加QTDIR为QT的安装路径,如:D:\Qt\Qt5.3.2\5.3\msvc2013_opengl

2. 添加PATH,%QTDIR%\bin

建立工程

(事先用cocos2dx创建一个HelloWorld工程)

1. 打开VS2013,新建QtApplication工程(需要勾选openGL模块)。

2. 拷贝Classes,cocos2d,Resources三个目录到QT工程的根目录下(.vcxproj文件所在目录)

3. 右键点击解决方添加工程libBox2d,libcocos2d,libSpine。

配置工程属性

基本就是照抄HelloWorld的工程属性:

1. 添加属性

视图->其他窗口->属性管理器->点击工程添加属性表(名字随意)

点击新建的属性表,在用户宏中添加宏:

名称: EngineRoot

值: $(ProjectDir)cocos2d\

2. 通用属性/引用

添加新引用,勾选libBox2d,libSpine三个工程。

3. 常规

输出目录:$(SolutionDir)$(Configuration).win32\

中间目录:$(Configuration).win32\

4. 调试

工作目录:$(ProjectDir)Resources

5. C/C++/常规

附加包含目录:

添加

$(EngineRoot)cocos\audio\include
$(EngineRoot)external
$(EngineRoot)external\chipmunk\include\chipmunk
$(EngineRoot)extensions
$(ProjectDir)Classes
$(ProjectDir)
$(EngineRoot)cocos\editor-support
$(EngineRoot)cocos
$(EngineRoot)cocos\platform
$(EngineRoot)cocos\platform\desktop
$(EngineRoot)external\glfw3\include\win32
$(EngineRoot)external\win32-specific\gles\include\OGLES

6. C/C++/预处理器

_DEBUG
_WINDOWS
_USE_MATH_DEFINES
GL_GLEXT_PROTOTYPES
CC_ENABLE_CHIPMUNK_INTEGRATION=1
COCOS2D_DEBUG=1
_CRT_SECURE_NO_WARNINGS
_SCL_SECURE_NO_WARNINGS
_VARIADIC_MAX=10
_USING_V110_SDK71_
_UNICODE

7. 链接器/常规

附加库目录:

$(SolutionDir)$(Configuration).win32\

8. 链接器/输入

附加依赖项:

opengl32.lib
glew32.lib
libzlib.lib
libpng.lib
libjpeg.lib
libtiff.lib
libwebp.lib
libiconv.lib
glfw3.lib
freetype250.lib
winmm.lib
ws2_32.lib
libchipmunk.lib
libBox2d.lib
libSpine.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib

9. 生成事件

链接事件

if not exist "$(OutDir)" mkdir "$(OutDir)"
xcopy /Y /Q "$(EngineRoot)external\websockets\prebuilt\win32\*.*" "$(OutDir)"

修改代码

测试:在MainWindow的构造函数中启动cocos2d,看是否能编译运行通过

#include "qttest.h"
#include Classes/AppDelegate.h"

QTTest::QTTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    AppDelegate app;
    cocos2d::Application::getInstance()->run();
}

QTTest::~QTTest()
{
}

上面的代码运行成功会先弹出cocos2d的HelloWorld界面,关掉后再弹出QT窗口。因为run函数里面是死循环,只有run退出了才会完成QTTest的构造。

这里只是检查下工程配置是否正确,如果可以正常编译和运行再继续_(:зゝ∠)_

制作编辑器

接下来才是正题,因为cocos2d-x 3.x版本window的创建用的是glfwCreateWindow(),拿到的窗口句柄是GLFWwindow*类型的_mainWindow。

老实说我不知道怎么拿这个GLFWwindow去创建一个QT窗口_(:зゝ∠)_

那怎么办?造轮子呗,参考了一个cocos2d-x 2.14版本的QtPort工程,于是打算这样搞:

1. 不用glfwCreateWindow创建窗口,用QGLwidget搞。那么需要继承GLViewImpl,重写create方法,另外还需重写输入接口。

2. 重写消息循环,用QTimer驱动。那么需要继承Application,同时还需多重继承QApplication,重写run方法

轮子我已经造了,代码放在:

https://github.com/gameboy12615/CocosQtPort

或者:

https://git.oschina.net/takamachimarisa/CocosQtPort

目前基本功能都有了,支持窗口自动缩放,不过key输入事件还没写。另外由于DesignResolutionSize不能改,导致窗口宽高比只能是固定的,因此窗口拉长后会空出一块。

当然做2D编辑器的话,在CCQGLView::Create()中把宽高比设大点就可以了。但是要做3D编辑器就有点不方面,具体可以自己体会(有好方法也求路过的大牛不吝赐教)_(:зゝ∠)_

嘛,先看效果

大概就是这个样子,下面说下轮子的用法

1. 参考前面1~9步用VS2013创建一个QT Application项目,我这里命名为CCGEditor,因此主窗口类是CCGEditor.h和CCGEditor.cpp这两个文件

2. 用QT设计师创建一个QDockWidget(随便什么QWidget都可以)用来放cocos2d的窗口。我这里是SceneWidget,代码中可以直接用ui.SceneWidget来获取到。

3. 拷贝CocosQtPort到Classes目录下。

4. 修改AppDelegate,使其继承自cocos2d::CCQApplication,并使用CCQGLView创建glview,代码如下:

AppDelegate.h

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "cocos2d.h"@H_502_307@
#include "CocosQtPort/CCQApplication.h"@H_502_307@
#include "../ccgeditor.h"@H_502_307@
class@H_502_307@ AppDelegate :@H_502_307@ private@H_502_307@ cocos2d::CCQApplication@H_502_307@
{@H_502_307@
public@H_502_307@ :@H_502_307@
@H_502_307@ AppDelegate(@H_502_307@ int@H_502_307@ argc,@H_502_307@ char@H_502_307@ *argv[]) : cocos2d::CCQApplication(argc,argv) {};@H_502_307@
@H_502_307@ virtual@H_502_307@ ~AppDelegate();@H_502_307@
......@H_502_307@
protected@H_502_307@ :@H_502_307@
CCGEditor _mainWindow;@H_502_307@
};@H_502_307@

AppDelegate.cpp

13
14
15
16
#include "AppDelegate.h"@H_502_307@
#include "HelloWorldScene.h"@H_502_307@
#include "CocosQtPort/CCQGLView.h"@H_502_307@
......@H_502_307@
bool@H_502_307@ AppDelegate::applicationDidFinishLaunching() {@H_502_307@
@H_502_307@ // initialize director@H_502_307@
auto@H_502_307@ director = Director::getInstance();@H_502_307@
glview = CCQGLView::getInstance();@H_502_307@
glview->setBgColor(Color4B(50,50,255));@H_502_307@
director->setOpenGLView(glview);@H_502_307@
_mainWindow.setGLView(glview->getGLWidget());@H_502_307@
_mainWindow.show();@H_502_307@
......@H_502_307@
}@H_502_307@

5. 修改CCGEditor,代码如下:

CCGEditor.h

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef CCGEDITOR_H@H_502_307@
#define CCGEDITOR_H@H_502_307@
#include <QtWidgets/QMainWindow>@H_502_307@
#include "ui_ccgeditor.h"@H_502_307@
AppDelegate;@H_502_307@
namespace@H_502_307@ Ui {@H_502_307@
CCGEditor;@H_502_307@
}@H_502_307@
CCGEditor :@H_502_307@ QMainWindow@H_502_307@
{@H_502_307@
Q_OBJECT@H_502_307@
:@H_502_307@
CCGEditor(QWidget *parent = 0);@H_502_307@
~CCGEditor();@H_502_307@
void@H_502_307@ setGLView(QWidget *glWidget);@H_502_307@
:@H_502_307@
closeEvent(QCloseEvent *);@H_502_307@
:@H_502_307@
Ui::CCGEditorClass ui;@H_502_307@
AppDelegate *_appDelegate;@H_502_307@
QWidget *_glWidget;@H_502_307@
};@H_502_307@
#endif // CCGEDITOR_H@H_502_307@

CCGEditor.cpp

31
32
33
34
35
36
#include "ccgeditor.h"@H_502_307@
#include "Classes/AppDelegate.h"@H_502_307@
#include "Classes/CocosQtPort/CCQGLView.h"@H_502_307@
#include <QTimer>@H_502_307@
#include <QDockWidget>@H_502_307@
CCGEditor::CCGEditor(QWidget *parent)@H_502_307@
: QMainWindow(parent),@H_502_307@
_appDelegate(NULL),@H_502_307@
_glWidget(NULL)@H_502_307@
{@H_502_307@
ui.setupUi(@H_502_307@ this@H_502_307@ );@H_502_307@
}@H_502_307@
CCGEditor::~CCGEditor()@H_502_307@
{@H_502_307@
}@H_502_307@
CCGEditor::closeEvent(QCloseEvent *)@H_502_307@
{@H_502_307@
cocos2d::Director::getInstance()->end();@H_502_307@
qApp->quit();@H_502_307@
}@H_502_307@
CCGEditor::setGLView(QWidget *glWidget)@H_502_307@
{@H_502_307@
_glWidget = glWidget;@H_502_307@
if@H_502_307@ (_glWidget)@H_502_307@
{@H_502_307@
ui.SceneWidget->setWidget(_glWidget);@H_502_307@
setCentralWidget(ui.SceneWidget);@H_502_307@
}@H_502_307@
6. 修改main.cpp

14
#include <QtWidgets/QApplication>@H_502_307@
#include "Classes/AppDelegate.h"@H_502_307@
#include "Classes/CocosQtPort/CCQGLView.h"@H_502_307@
#include "cocos2d.h"@H_502_307@
USING_NS_CC;@H_502_307@
main(@H_502_307@ *argv[])@H_502_307@
{@H_502_307@
AppDelegate app(argc,argv);@H_502_307@
return@H_502_307@ cocos2d::CCQApplication::getInstance()->run();@H_502_307@
编译运行,打完收工_(:зゝ∠)_



from:http://www.cnblogs.com/marisa/p/4141862.html

原文链接:https://www.f2er.com/cocos2dx/340270.html

猜你在找的Cocos2d-x相关文章