cocos2dx 封装到qtwidget中

项目需要,将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();
}

注意事项:

以上情况有两个问题没有解决,第一个是鼠标点击和拖动事件会根据窗口的位置进行偏移;

第二个是键盘事件不会触发,需要重写来手动调用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值