• 大小: 8.48MB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2023-10-08
  • 语言: 其他
  • 标签: Qt  动画  

资源简介

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

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include “DirectionControl.h“
#include “Character.h“

/*---------------------------------------------------------------------------*/
Character::Character( const Gameobject* pParent ): Gameobject( pParent )
{
    setobjectName( tr( “Character“ ) );
    m_frameRect = QRectF( 0.0 0.0 32.0 48.0 );
    m_AnimateTime = 1000;

    // 创建方向控制
    Control* pDirectionControl = new DirectionControl( this );
    m_pActiveControl =
            findChild( tr( “DirectionControl“ ) );
    Q_ASSERT( m_pActiveControl != 0 );

    // 初始化有限状态机
    m_Machine.addState( &m_Stand );
    m_Machine.addState( &m_Walk );

    // 设定帧动画
    m_pframeAniGrp = new QSequentialAnimationGroup;
    for ( int i = 0; i < 4; ++i )
    {
        m_pframeAnima[i] = new QPropertyAnimation( this “frameRect“ );
        m_pframeAnima[i]->setDuration( m_AnimateTime / 4 );
        m_pframeAniGrp->addAnimation( m_pframeAnima[i] );
    }

    // 初始化和设定位置动画
    m_pPosAnima = new QPropertyAnimation( this “pos“ );
    m_pPosAnima->setDuration( m_AnimateTime );

    // 用动画组将帧动画和位置动画结合起来
    m_pParallelGrp = new QParallelAnimationGroup;
    m_pParallelGrp->addAnimation( m_pframeAniGrp );
    m_pParallelGrp->addAnimation( m_pPosAnima );

    // 创建从stand到walk的转换(transition)
    QSignalTransition* pWalkTransition = new QSignalTransition( pDirectionControl
                                                                SIGNAL( TriggerTransition( ) )
                                                                &m_Stand );
    pWalkTransition->setTargetState( &m_Walk );
    pWalkTransition->addAnimation( m_pParallelGrp );

    // 创建从walk到stand的转换(transition)
    QSignalTransition* pStandTransition = new QSignalTransition( m_pParallelGrp
                                                                 SIGNAL( finished( ) )
                                                                 &m_Walk );
    pStandTransition->setTargetState( &m_Stand );

    SetDirection( _Right_ );// 朝向右
    m_Machine.setInitialState( &m_Stand );// 设置初始状态
    m_Machine.start( );
}
/*---------------------------------------------------------------------------*/
Character::~Character( void )
{

}
/*---------------------------------------------------------------------------*/
void Character::Init( void )
{

}
/*---------------------------------------------------------------------------*/
void Character::Release( void )
{

}
/*---------------------------------------------------------------------------*/
void Character::Update( void )
{
    m_pActiveControl->Update( );
}
/*---------------------------------------------------------------------------*/
void Character::OnCollision( void )
{
    //qDebug( “OnCollision.“ );
}
/*---------------------------------------------------------------------------*/
QRectF Character::boundingRect( void ) const
{
    return QR

评论

共有 条评论