zoukankan      html  css  js  c++  java
  • 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:QtQt5.3.25.3msvc2013_opengl

    2. 添加PATH,%QTDIR%in

    建立工程

    (事先用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)cocosaudioinclude
    $(EngineRoot)external
    $(EngineRoot)externalchipmunkincludechipmunk
    $(EngineRoot)extensions
    $(ProjectDir)Classes
    $(ProjectDir)
    $(EngineRoot)cocoseditor-support
    $(EngineRoot)cocos
    $(EngineRoot)cocosplatform
    $(EngineRoot)cocosplatformdesktop
    $(EngineRoot)externalglfw3includewin32
    $(EngineRoot)externalwin32-specificglesincludeOGLES

    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)externalwebsocketsprebuiltwin32*.*" "$(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();
    }
    

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

  • 相关阅读:
    论自己电脑如何搭建服务器
    nodejs + express + art-template + mongodb简单项目
    npm和yarn使用
    Linux内核编译
    Linux 网络编程
    Linux进程管理
    LeetCode1576. 替换所有的问号
    LeetCode392. 判断子序列
    LeetCode674. 最长连续递增序列
    剑指 Offer 48. 最长不含重复字符的子字符串
  • 原文地址:https://www.cnblogs.com/marisa/p/4141862.html
Copyright © 2011-2022 走看看