`
jgsj
  • 浏览: 960646 次
文章分类
社区版块
存档分类
最新评论

使用Qt动画框架设计角色的二维动画(二)

 
阅读更多

使用Qt动画框架设计角色的二维动画(二)
接上次的日志

上次发布demo虽然使用了大量的动画框架、有限状态机框架,但是仍有瑕疵。比如说在用户一直按下按键的时候角色会被“冻”住,但是角色的位置是移动的,这可能是使用QKeyEventTransition的一个副作用吧。在觉察到使用QKeyEventTransition不好使时,我开始着眼研究怎样将Qt按键的状态保存起来并且封装成让其余编码变得更加容易。为此我写了两篇日志。这篇日志是上篇有关按键日志的延续,也是其具体应用。

演示程序下载地址:这里

源代码下载地址:这里

代码有点儿长,我还是通过截图来讲讲实现的思路吧。

这里,我们的初音ミク可以上下左右移动,并且你一直按方向键也不会导致她被“冻”住。这是因为我首先将Qt按键的状态保存下来了,而且通过Control抽象类进行抽象,在窗口事件循环中我通过一个QTimer每隔16毫秒对场景中所有的元素进行更新,在初音ミク自身的Update()函数中负责对Control的子类DirectionControl进行更新,在DirectionConrtrol的更新代码中包含了对按键的响应。之所以选择每隔16毫秒更新一次是因为要满足60帧一秒,每帧的刷新时间只有1 / 60 = 0.0167秒,这里去掉零头就只剩下0.016秒,即16毫秒了。
角色初音ミク的父类Character维护着一个有限状态机和两个状态:站立和行走。这两个状态之间的相互转换是不同的,正如上篇文章所说,要从站立转到行走的状态,必须满足按下按键并且此时没有进行行走的动画,但是从行走状态到站立状态则是一瞬。即一旦动画完成即进行从行走到站立动画的转换,且此时没有动画。这里详细地讲述从站立到行走状态的转换,我没有使用QKeyEventTransition类,理由如前文所示。这里我使用了另外一个转换:QSignalTransition。原理很简单,我们在DirectionControl里判断按键以及触发的条件成功后emit一个信号到QSignalTransition就可以成功地触发从站立到行走状态的转换了。
听起来有点虚,看来还是需要通过代码才能领悟啊。那么如果你希望了解更多,这里有程序的源代码,可以下载运行。我的开发环境是:
Windows: WindowsXP(SP3) + MinGW4.4/MinGW4.7 + Qt4.8.3/Qt5.0.1 + QtCreator2.6/QtCreator2.7
Linux: Ubuntu12.10 + gcc4.7 + Qt4.8.1/Qt4.8.4/Qt5.0.1 + QtCreator2.6/QtCreator2.7
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics