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, 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制作游戏编辑器的更多相关文章
- Unity中制作游戏的快照游戏支持玩家拍快照
		
Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...
 - Unity制作游戏中的场景
		
Unity制作游戏中的场景 1.2.3 场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...
 - 使用Unity制作游戏关卡的教程(一)
		
转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...
 - 123457123456#0#-----com.threeapp.MakerHanBao01----儿童汉堡制作游戏
		
----com.threeapp.MakerHanBao01----儿童汉堡制作游戏
 - 笔记:利用 Cocos2dx 3.2 与 Box2D制作一个跑酷游戏(上)
		
最近写lua写得没有力气了,所以想让脑袋放松一下,刚好看到有人在用swift做游戏: Swift游戏实战-跑酷熊猫 于是脑子一短路,就想到了利用这些素材来做一个游戏. 本来不想记笔记的,但是由于选择物 ...
 - 用Python制作游戏外挂(上)
		
源地址:http://eyehere.net/2012/python-game-bot-autopy-1/ 悲剧成我这样的人,我知道肯定不止我一个,所以我一点都不悲伤:-( 所以我打开了4399小游戏 ...
 - 关于Cocos Studio制作游戏资源
		
没想到,Cocos Studio居然是做游戏资源的,而且可以做骨骼动画,虽然我还不会做,只能自己一个人慢慢研究了.学长以前说,Coocs Studio只是用来打包项目成Apk的,没有什么卵用,刚开始我 ...
 - 一步步用python制作游戏外挂【转】
		
转自:http://www.cnblogs.com/xsmhero/archive/2013/01/03/2842973.html 玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过 ...
 - [译]Godot系列教程五 - 制作Godot编辑器插件
		
制作插件 下文仅针对2.1版本. 关于插件 插件是为编辑器扩展出更多有用工具的重要方式.它可以完全用GDScript和标准场景开发,甚至都不需重新加载编辑器就可生效.不像模块,你无需创建C++代码.也 ...
 
随机推荐
- DCOM EXCE权限配置问题
			
检索COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005: 关于以上这个问题,博主在百度上 ...
 - python基础(1)
			
1.python中三元表达式 类比于C.C++.Java中都有的三目运算符,python中使用下面语句实现三元表达式 true_part if condition else false_part. c ...
 - 移动端web开发中对点透的处理,以及理解fastclick如何做到去除300ms延迟
			
一.点透问题以及处理办法 开发中遇到一个问题,就是点击layer弹出框的取消按钮之后,按钮下方的click事件就直接触发了.直接看代码: $('.swiper-slide').on('click', ...
 - 首届.NET Core开源峰会
			
首届.NET Core开源峰会 代号:dnc 2018 亮点:去中心化.社区驱动 开源峰会 时间:2018年5月20日 周日 地点:在线峰会.远程参与 形式:每个主题5分钟-15分钟闪电演讲 演讲方式 ...
 - JavaScript正则表达式模式匹配(4)——使用exec返回数组、捕获性分组和非捕获性分组、嵌套分组
			
使用exec返回数组 var pattern=/^[a-z]+\s[0-9]{4}$/; var str='google 2012'; alert(pattern.exec(str)); //返回一个 ...
 - vuex存储和本地存储(localstorage、sessionstorage)的区别
			
1.最重要的区别:vuex存储在内存,localstorage则以文件的方式存储在本地 2.应用场景:vuex用于组件之间的传值,localstorage则主要用于不同页面之间的传值. 3.永久性:当 ...
 - Laravel-admin 使用Layer相册功能
			
使用Laravel-admin后台,Laravel-admin已经集成了很多前端组件,但是在手册中也没有发现能够展示相册的插件,而本人比较喜欢Layer弹窗的插件所以想使用Layer来进行效果展示 通 ...
 - geotrellis使用(四十)优雅的处理请求超过最大层级数据
			
前言 要说清楚这个题目对我来说可能都不是一件简单的事情,我简单尝试. 研究 GIS 的人应该都清楚在 GIS 中最常用的技术是瓦片技术,无论是传统的栅格瓦片还是比较新颖的矢量瓦片,一旦将数据切好瓦片就 ...
 - PHP echo和print 语句
			
PHP echo 和 print 语句 在 PHP 中有两个基本的输出方式: echo 和 print. 本章节中我们会详细讨论两个语句的用法,并在实例中演示如何使用 echo 和 print. P ...
 - Docker命令查询
			
基本语法 docker [OPTIONS] COMMAND [arg...] 一般来说,Docker 命令可以用来管理 daemon,或者通过 CLI 命令管理镜像和容器.可以通过 man docke ...