码迷,mamicode.com
首页 > Windows程序 > 详细

Cocos2dx集成于windows桌面窗口程序的步骤

时间:2015-02-09 20:14:29      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果。

对于cocos2dx开发的程序,这个需求可以描述为:

 

实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场景,而其他部分保持该操作系统原生ui的功能。

 

这里以windows桌面程序为例,描述如何实现这一点,cocos2dx版本为2.2.5

代码用qt实现,但是没有用到太多qt的东西,windows api通用。

1 创建工程。这里我们依然使用cocos2dx提供的工程生成器创建工程,以得到完美的cocos2dx+box2d的环境。

2 将qt环境引入工程。将qt的include目录和lib目录加到项目设置中的c++目录中,然后加上qt的对应lib。

3 在某个widget上显示qt场景。

    这一段比较关键,首先我们的代码应该以qt为主框架,因此删除main函数中CCEGLView初始化部分

//eglView->setViewName("test");
//eglView->setFrameSize(480, 320);

    注意必须保留appdelegate,因为cocos2dx运行需要有这个。

    接着创建qapp:

    QApplication qapp(count, NULL);

    在最后,我们在main函数调用

    CCApplication::sharedApplication()->run();

    而不是调用qt的主循环,因为这个run里还要执行一些cocos2dx的初始化方法。而qt主循环不调用则不影响。

    然后我们得修改cocos2dx源代码了,首先修改CCEGLView,增加一个方法CreateByHWND,里面基本复制Create,唯独创建窗口一块删除,直接用参数提供的hWND赋值。

    然后增加一个静态方法sharedOpenGLViewCreateByHWND,里面基本复制sharedOpenGLView,只是不调用create,调用我们刚才写的CreateByHWND。

    接着就可以开始我们的外部调用了。

    首先获得目标widget的winId,这个过程将widget转化成了native。然后将获得的winId(其实就是hWnd)传入 sharedOpenGLViewCreateByHWND,创建出Cocosdx的绘图表面EGLView。

    为了得到连续的刷新,定义一个定时器,每次时间触发代码:

    CCDirector::sharedDirector()->drawScene();

 

    遇到的问题:

    1 显示一个大黑框,这是因为没有设置frameSize,在定位的时候,getVisibleSize全部返回了0,0。这里我们需要在创建完EGLView之后调用一句:

    eglView->setFrameSize(w->size().width(), w->size().height());

        把widget的size设上去。

    2 游戏画面不占全部widget,有偏移。这是因为setFrameSize调用了centerWindow,centerWindow会根据屏幕来定位到中间,对此我们需要把centerwindow注释不执行。

     

4 实现事件传向cocos2Dx

   由于我们自己创建了窗体,因此没有使用cocos2dx的WndProc,解决方案是在CCApplication的主循环中处理消息的部分加上:


TranslateMessage(&msg);
DispatchMessage(&msg);

CCEGLView::sharedOpenGLView()->WindowProc(msg.message, msg.wParam, msg.lParam);   //加上此句

Cocos2dx集成于windows桌面窗口程序的步骤

标签:

原文地址:http://www.cnblogs.com/eaglelun/p/4282151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!