欢迎转载,但请注明本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, libcocos2d, 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

#include "cocos2d.h"
#include "CocosQtPort/CCQApplication.h"
#include "../ccgeditor.h" class AppDelegate : private cocos2d::CCQApplication
{
public:
AppDelegate(int argc, char *argv[]) : cocos2d::CCQApplication(argc, argv) {};
virtual ~AppDelegate();
......
protected:
CCGEditor _mainWindow;
};

AppDelegate.cpp

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

5. 修改CCGEditor,代码如下:

CCGEditor.h

#ifndef CCGEDITOR_H
#define CCGEDITOR_H #include <QtWidgets/QMainWindow>
#include "ui_ccgeditor.h" class AppDelegate;
namespace Ui {
class CCGEditor;
} class CCGEditor : public QMainWindow
{
Q_OBJECT public:
CCGEditor(QWidget *parent = 0);
~CCGEditor(); void setGLView(QWidget *glWidget); protected:
void closeEvent(QCloseEvent *); private:
Ui::CCGEditorClass ui;
AppDelegate *_appDelegate;
QWidget *_glWidget;
}; #endif // CCGEDITOR_H

CCGEditor.cpp

#include "ccgeditor.h"
#include "Classes/AppDelegate.h"
#include "Classes/CocosQtPort/CCQGLView.h" #include <QTimer>
#include <QDockWidget> CCGEditor::CCGEditor(QWidget *parent)
: QMainWindow(parent),
_appDelegate(NULL),
_glWidget(NULL)
{
ui.setupUi(this);
} CCGEditor::~CCGEditor()
{ } void CCGEditor::closeEvent(QCloseEvent *)
{
cocos2d::Director::getInstance()->end();
qApp->quit();
} void CCGEditor::setGLView(QWidget *glWidget)
{
_glWidget = glWidget; if (_glWidget)
{
ui.SceneWidget->setWidget(_glWidget);
setCentralWidget(ui.SceneWidget);
}
}

6. 修改main.cpp

#include "ccgeditor.h"
#include <QtWidgets/QApplication> #include "Classes/AppDelegate.h"
#include "Classes/CocosQtPort/CCQGLView.h"
#include "cocos2d.h" USING_NS_CC; int main(int argc, char *argv[])
{
AppDelegate app(argc, argv);
return cocos2d::CCQApplication::getInstance()->run();
}

编译运行,打完收工_(:зゝ∠)_

cocos2dx 3.3 + QT5.3制作游戏编辑器的更多相关文章

  1. Unity中制作游戏的快照游戏支持玩家拍快照

    Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...

  2. Unity制作游戏中的场景

    Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...

  3. 使用Unity制作游戏关卡的教程(一)

    转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...

  4. 123457123456#0#-----com.threeapp.MakerHanBao01----儿童汉堡制作游戏

    ----com.threeapp.MakerHanBao01----儿童汉堡制作游戏

  5. 笔记:利用 Cocos2dx 3.2 与 Box2D制作一个跑酷游戏(上)

    最近写lua写得没有力气了,所以想让脑袋放松一下,刚好看到有人在用swift做游戏: Swift游戏实战-跑酷熊猫 于是脑子一短路,就想到了利用这些素材来做一个游戏. 本来不想记笔记的,但是由于选择物 ...

  6. 用Python制作游戏外挂(上)

    源地址:http://eyehere.net/2012/python-game-bot-autopy-1/ 悲剧成我这样的人,我知道肯定不止我一个,所以我一点都不悲伤:-( 所以我打开了4399小游戏 ...

  7. 关于Cocos Studio制作游戏资源

    没想到,Cocos Studio居然是做游戏资源的,而且可以做骨骼动画,虽然我还不会做,只能自己一个人慢慢研究了.学长以前说,Coocs Studio只是用来打包项目成Apk的,没有什么卵用,刚开始我 ...

  8. 一步步用python制作游戏外挂【转】

    转自:http://www.cnblogs.com/xsmhero/archive/2013/01/03/2842973.html 玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过 ...

  9. [译]Godot系列教程五 - 制作Godot编辑器插件

    制作插件 下文仅针对2.1版本. 关于插件 插件是为编辑器扩展出更多有用工具的重要方式.它可以完全用GDScript和标准场景开发,甚至都不需重新加载编辑器就可生效.不像模块,你无需创建C++代码.也 ...

随机推荐

  1. java HTTP请求工具

    package HttpRequestTest; import java.io.BufferedReader; import java.io.InputStream; import java.io.I ...

  2. java 学习笔记2 面向对象(上)

    类和对象 类是某一批对象的抽象,可以把类理解成某种概念.对象是一个具体存在的实体.类和对象是面向对象的核心. 类定义的是多个实例的特征,类不是具体存在,实例才是具体存在. 定义类(class)的语法: ...

  3. 最小费用最大流(luogu P3381 【模板】最小费用最大流)

    题目链接 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S. ...

  4. ACM Misha and Changing Handles

    Misha hacked the Codeforces site. Then he decided to let all the users change their handles. A user ...

  5. jQuery – AJAX get() 和 post() 方法

    jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...

  6. 作业02-Java基本语法与类库

    1. 本周学习总结 以几个关键词描述本周的学习内容.并将关键词之间的联系描述或绘制出来. 原则:少而精,自己写.即使不超过5行也可,但请一定不要简单的复制粘贴. 2. 书面作业 1. String-使 ...

  7. RunLoop总结:RunLoop基础知识

    没有实际应用场景,很难理解一些抽象空洞的东西,所以前面几篇文章先介绍了RunLoop的几个使用场景. 另外AsyncDisplayKit中也有大量使用RunLoop的示例. 关于实际的使用RunLoo ...

  8. Hibernate之SchemaExport的使用

    @Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport ...

  9. Objective-C特有类型——id

    Objective-C特有类型--id OC里,id和int.double等一样,是一个类型 不同的是: id是一个万能指针,能指向/操作任何OC对象 相当于 (NSObject *) 用法 id i ...

  10. 【安卓开发】用PageTransformer打造更好的动画效果

    Android的ViewPager类已经变成一个相当流行的Android应用组件了.它简单直观,并且提供了极好的功能.你可以经常在设置向导,图片画廊种看到它,它还是分开应用内容的良好方式. 标准的Vi ...