Qt+Box2D自我分析

来源:百度文库 编辑:神马文学网 时间:2024/04/26 22:17:49

宿舍终于有网了,宿舍终于有人了,自己一个人过了半个月的日子,现在终于结束了,呵呵~~回到学校,回到公司,继续天天上班的生活,感觉还是很有规律的,比较有意思。

    先说说编程上的事儿:

    1:最近发现Qt的QGraphicsWidget体系可以很好的融合Box2D物理引擎,从而可以模拟真实的碰撞,加速度等效果。这个还是很不错的!Box2D是一个物理引擎库,不过它是纯粹的引擎,并不含任何图形支持,你可以自己选择图形库。而选择用Qt还是有好处的,因为Box2D库本身就是用C++写的,用同样是C++写的Qt来融合使用在编程上无须做太大的改动。有高人给出了一些用Box2D实现的具体例子http://www.cnbeta.com/articles/78115.htm 。

     我今天下午尝试着在windows下用二者去使用了一下,最终实现了一个demo。这里边遇到很多问题,我也尝试着去解答:(具体安装过程和使用过程我这有总结,有兴趣可以发一份给大家玩玩)

      ①:为什么图形库是用QGraphicsWidget体系,而不用更常见的QWidget体系?

这个其实也很好理解,因为一个现实中的物体的移动不仅仅包括平移,还有旋转和各种不规则转动。而对于一个QWidget窗口,是无法实现包括旋转在内的一些操作的,而仅仅只能平移。但是对于QGraphicsWidget则不存在这个问题。  同样这个也是为什么在S60开发中用QGraphicsWidget体系而不用QWidget体系的原因,毕竟手机程序有个:横竖屏切换在那。

     ②如何将Qt与Box2D融合到一起使用?

      原理是这样的:我们用Box2D创建一个模拟现实世界中的物体,由于Box2D没有图形界面,所以我们可以理解为:创建成功的这个物体是透明的,但它依旧是确实存在的,类似“透明人”那种。 那这在程序demo时显然没有任何实际意义,所以我们需要给这个透明的物体上点颜色,而上颜色方法就是:在这个物体的后边做一个跟它同样大小尺寸的有颜色的窗口,使得二者重合,并且使得二者动作同步,这样我们就可以看到这个物体啦!

     那问题的关键就是:如何使得二者(Qt的窗口 与 Box2D的物体)实现同步?如果二者是一个平行并列的关系:显然很难实现这一点,但如果是父子关系则简单的多了,只要确定了父子关系,则同步的问题便完全可以交给sys来处理,而不需要我们来管理实现。所以其实现方式就是:建一个QGraphics**Item类的派生类来作为这个物体类,而把Box2D物体作为该类的一个私有数据成员,而后再创建时:让两者的尺寸一样,位置重合即可!

    ③如何实现物体的更新?

比如:一个物体要做自由落体运动,如何更新其位置?是sys更新还是我们认为来做?

其实:既然Box2D号称一个物体引擎,那么物体的更新就是它一手来实现的,我们只要调个函数来启动这个更新即可。可是我实际做的时候:当启动这个更新过程之后:在显示上却没有任何更新!  实际是这样的:Box2D启动更新之后:一个窗口本来在A位置,显示上也是在A位置;当更新过后,其实这个窗口已经摆到了B位置,只不过在显示上还没有刷新而已,所以你看到它还是在A位置,我们之需要手动来重设一下这个窗口的位置即可,亦即:先取得这个窗口的实际位置,而后把其setPosition()到这个实际的位置来完成画面刷新即可!

  ④ Box2D + Qt能否用在Symbian S60上?

这个我查了一下,首先Box2D是一个开源的引擎,在Windows和Linux下都是可以编译可以使用的,这个没有任何问题。但是对于symbian 目前官方还没有给出支持的可编译的源码,但是国外有高人通过直接修改linux下的Box2D源码给移植到symbian下使用并且给出了demo(万分敬佩!),可以他没有给出自己修改过后的源码,如果有时间我倒很希望自己也动手来直接修改移动移植到symbian下。

   不管怎么说:至少这个搭配体系可以使用在windows下,linux下。那对于智能手机而言:Maemo系统,MeGoo系统,Windows Mobile系统应该都是不成问题的!对于Android我不是很了解,哪位仁兄如果研究过这个,可以尝试着做一下,看看可不可以。 有时间我一定在N900上写一个看看效率如何。

    对于Qt和Box2D的融合使用就说到这,我觉得还是很有意思的,呵呵~以前宋总推荐我玩过一个蜡笔的游戏(这个游戏和上边给出的链接的15个例子中的魔法笔Magic Pen原理一样),我想过:实现起来难点只有一个,有时间也可以做一个简单的demo,复杂的那就需要大量美工和创意的支持了,呵呵~

    大家也可以直接去Qt Lib官网上查看这方面的信息:http://labs.trolltech.com/blogs/2010/02/26/qt-box2d-is-easy

     再说说在公司做项目时遇到的一些有意思的问题吧:

    1:填充一个widget的背景一般我们都用三种方法:qss,palette,paintEvent().但是这三种方法如果混合着使用会有什么问题呢?有时候你的设置会不生效!我不知道这个问题是一个系统级的bug还是中间有个什么说法。所以我推荐在一个项目中还是统一风格的只使用其中一种的好。

    2:如何改变QTextEdit的背景图片?把这个QTextEdit对象再放到一个scene中呢?呵呵~没事可以试一下。当然:如果仅仅是放一个背景图片,这个还是很简单的,但是如果你在编辑框中写的文字超过了一屏幕,那这个图片会平铺重复的覆盖在编辑框中的,如何让这个图片不动不重复不跟着文字的翻屏一起翻屏呢?可以还是使用调色板,但是方式要改变一下。而如果放到了scene中:则需要在放进去之前和放进去之后都要设置!

      其实原理还是很简单的:我尝试了一下,如果你直接设置编辑框的背景图片,则它必然会随着文字的翻屏而翻屏重复!那为了让背景图片固定不动,我们可以把这个编辑框的背景设置为透明,从而显示在用户面前的是其后边窗口的样式,而后我们将其后边窗口的该位置覆盖刷上这张背景图片即可!

    3:对于一个自动变化的动画过程,你可以使用QTimer定时器来一步步往前刷,也可以用TImerEvent()来一步步刷,但是用这两种方法给人的感觉很不连续,而且非常消耗系统资源,在windows上还好,但是在S60等手机操作系统上这个则是一个致命的缺点,动画断断续续的,给人感觉就是效率出了问题! 我在做项目过程中要实现不同虚拟键盘的切换,我希望这个切换有一个动画过程在里边,这里使用了时间线timeline这个理论,实际测试证明:其效率还是很高的,尤其在手机上跑起来和在Windows上跑没什么区别,一样的连续和快速,所以遇到这种情况我还是推荐用时间线,具体就是QTimeLine这个类。 当然:你也可以使用状态机机制,类似flash那样,但是这个概念是在4.6.2以后才引入的,我所做那个项目要兼顾4.6以前版本的QT,所以没有使用这个。

      年后我还遇到了很多很有意思的小问题,不过都是一些需要点小技巧来解决东西。一点点积累这种东西吧,貌似这就是传说中的经验~~~