2012/06/11

cocos2d-x qt 版簡單測試


基礎工作


下載安裝qt
http://qt.nokia.com/downloads
下載 cocos2d-x qtport(非官方)
https://github.com/honghui/cocos2d-x/tree/QtPort
從這篇討論挖出來的
http://www.cocos2d-x.org/boards/6/topics/8043
Walzer推的 缺點只是不是cocos2d-x最新版
基於之後可能會要求OpenGL程式庫
http://glew.sourceforge.net/
可以真的有需要再載

編譯cocos2d-x
基本上就是build-win32.bat 給他按下去
qtport比較不同的是有cocos2dx\proj.qt\libcocos2d.pro 這個專案
可以編譯 qt版的 libcocos2d
基本上編譯完就是會有會在debug.qt或release.qt中
看了一下似乎是沒有cocosdension跟lua的部分 應可以用win32版即可(未確認)
完成後直接使用QTCreater開一個新專案

個人是將cocos2d-x 中的HelloWorld專案AppDelegate與HelloWorldScen copy過來驗證
修改main.cpp如下
int main(int argc, char *argv[])
{
AppDelegate app(argc, argv);
return cocos2d::CCApplication::sharedApplication().run();
}
(基本上跟cocos2d-x專案差不多)

之後是修改AppDelegate的initInstance中QT的部分
原本是像這樣
CCEGLView * pMainWnd = new CCEGLView();
CC_BREAK_IF(! pMainWnd|| ! pMainWnd->Create(480, 320));
但因為要做編輯器所以將GLWidget抓出來
就變成下面這樣
CCEGLView * pMainWnd = new CCEGLView();
GLWidget *m_window = new GLWidget(400, 300, CCDirector::sharedDirector());
m_window->setWindowFlags(m_window->windowFlags()& ~Qt::WindowMaximizeButtonHint);
m_window->setFixedSize(400, 300);
pMainWnd->SetWindow(m_window);

之後可以將GLWidget用在後面處理的部分

編譯時要處理的部分
主要就是要將libcocos2d使用QT prooject的add library加入到.pro
將需要用到的標頭黨都給他include進來 大概如下
INCLUDEPATH += $PWD/../../honghui-cocos2d-x-799880b/cocos2dx
INCLUDEPATH += $PWD/../../honghui-cocos2d-x-799880b/cocos2dx/include
INCLUDEPATH += $PWD/../../honghui-cocos2d-x-799880b/cocos2dx/platform
INCLUDEPATH += $PWD/../../honghui-cocos2d-x-799880b/cocos2dx/platform/qt
run environment需要將需要的.dll設定到PATH中

在編譯執行時可能會有幾個問題
1.
LNK2001: 無法解析的外部符號 "protected: virtual bool __thiscall QGLWidget::event(class QEvent *)" (?event@QGLWidget@@MAE_NPAVQEvent@@@Z)
等等跟QGLWidget相關錯誤

沒有指定使用qt的OpenGL
QT += core gui opengl

2.
error: C1189: #error : "Can not recognize the target platform, compling under a unsupported platform?"
專案要定義為QT用
DEFINES += __QT__

就嘗試經驗感覺並不好處理
一開始遇到resource找不到的問題

在Resource設置方面要放在跟exe檔相同的資料夾中
不確定是否個人專案設定錯誤或者是本身設定就是這樣
不過考慮到如果是要做編輯器應該會做成專案或者是指定特定資源資料夾的方式
所以基本上之後再設定resource path應該無大礙

線程管理
以下是後來改的一個簡單程式
點擊上面的按鈕會在下方的GLWidget中加一個CCLabelTTF並隨機放置
一開始會像這樣


後來發現是跟線程有關
You can not invoke any cocos2d-x function or from a thread.
http://www.cocos2d-x.org/boards/6/topics/9258?r=9277#message-9277

另外有關於QGLWidget的線程管理
http://qt-project.org/doc/qt-4.8/QGLWidget.html#threading
更詳盡的文章 http://labs.qt.nokia.com/2011/06/03/threaded-opengl-in-4-8/

參考CCGLWidget
void GLWidget::update()
{
glewInit();
makeCurrent();

if (m_director)
m_director->mainLoop();

doneCurrent();
}

所以可以在取得QGLWidget後呼叫
makeCurrent();
doneCurrent();

前後包住OpenGL的操作即可


基本上這樣應該可以開始製作編輯器了
但QT還不熟
仍須努力

Ref:
qt 中文簡易教學
http://program-lover.blogspot.com/2008/09/qt-tutorial.html

3 則留言 :

匿名 提到...

QT版本做編輯器
是個很棒的點子耶

匿名 提到...

請問有如何使用mingw來build的教學嗎?

Unknown 提到...

mingw我個人沒有用過...官方論壇相關資料也是滿少的..只能說抱歉囉