cocos2dx 3.3 + QT5.3製做遊戲編輯器

歡迎轉載,但請註明本blog地址,謝謝_(:зゝ∠)_html

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

 

主要參考:github

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

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

 

準備windows

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

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

3. vs2013app

 

配置環境變量socket

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();
}

 

編譯運行,打完收工_(:зゝ∠)_

相關文章
相關標籤/搜索