项目需要,将cocos2dx集成到qtwidget中,网上搜了很多资源,发现都没有完善的cocos2dx封装到qt中的,其实看过很多博客都没有实现,但是那天看到
http://www.cnblogs.com/zouzf/p/4423256.html
然后对qtwidget的关系有了新的认识。
核心正如推荐连接中推荐一样
使用
QWindow* _glWindow = QWindow::fromWinId((WId) _glView); QWidget* _glWidget = QWidget::createWindowContainer(_glWindow, parent); _glWidget->setParent(this);,附上自己写的代码
NS_CC_END;NS_CC_BEGIN;
class Cocos2dWidget : public QWidget
{
Q_OBJECT
public:
Cocos2dWidget(QWidget *parent);
Cocos2dWidget(QWidget*parent = 0, const char * name = 0);
~Cocos2dWidget();
//void setGeometry(int ax, int ay, int aw, int ah);
void paintEvent(QPaintEvent *evt);
void timerEvent(QTimerEvent* evt);
void mousePressEvent(QMouseEvent* evt);
void keyPressEvent(QKeyEvent *evt);
void initCocos2d(); //这里用于cocos2d的初始化
//void resizeEvent(QResizeEvent* evt);//窗口可能缩放
private:
void updateDraw(); //用一个定时器调用,实现刷新
TestView* eglView;
CCDirector *pDirector;
CCScene * pScene;
int cocosTimerId;
HelloWorld * layer;
CCParticleSun * m_emitter;
CCActionInterval *pEffect;
public slots:
void translate();
void particleDemo();
void effectDemo();
private:
};
附上cpp文件
USING_NS_CC;
Cocos2dWidget::Cocos2dWidget(QWidget* parent, const char* name) :QWidget(parent, Qt::MSWindowsOwnDC)
{
qDebug() << QString::number(parent->winId()) << " " << QString::number(this->winId());
this->setWindowTitle("Editor");
this->setAccessibleName("Editor");
initCocos2d();
m_emitter = NULL;
}
Cocos2dWidget::~Cocos2dWidget()
{
killTimer(cocosTimerId);
pScene->release();
}
void Cocos2dWidget::initCocos2d()
{
AppDelegate app;
pDirector = CCDirector::sharedDirector();
HWND handle = reinterpret_cast<HWND>((HWND)this->winId());
eglView = new TestView(handle);
GLView * view = eglView->getView();
//eglView->getView()->setWindowed(200, 200);
// initialize director
pDirector->setOpenGLView(view);
// turn on display FPS
pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
// layer = HelloWorld::create();
//pScene = HelloWorld::scene(layer);
pScene = HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
HWND hand = view->getWin32Window();
WId id = (WId)hand;
QWindow* window = QWindow::fromWinId(id);
QWidget* wiget = QWidget::createWindowContainer(window);
wiget->setParent(this);
cocosTimerId = startTimer(1.0 / 60.0 * 1000);//设置定时器,调用cocos2d刷新
}
void Cocos2dWidget::paintEvent(QPaintEvent *evt){
Q_UNUSED(evt);
updateDraw();
}
void Cocos2dWidget::timerEvent(QTimerEvent *evt){
Q_UNUSED(evt);
if (evt->timerId() == cocosTimerId)
{
updateDraw();
}
}
void Cocos2dWidget::updateDraw(){
HWND hWnd = (HWND)this->winId();
CCEGLView* pMainWnd = eglView->getView();
//ShowWindow(pMainWnd->getHWnd(), SW_SHOW);
ShowWindow(pMainWnd->getWin32Window(), SW_SHOW);
//绘制场景
CCDirector::sharedDirector()->mainLoop();
}
注意事项:
以上情况有两个问题没有解决,第一个是鼠标点击和拖动事件会根据窗口的位置进行偏移;
第二个是键盘事件不会触发,需要重写来手动调用