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

资源简介

Qt的动画框架是Qt4.6新添加的一个重要的特性,有了它,开发人员可以制作激动人心的动画界面,而不必局限于单调的固定窗口了,可以说,这是其它界面库少见的功能,带来的则是Qt的另一大优势。最近我花了大概三、四天的时间研究Qt动画框架的内容,这让我感到Qt人员精心的设计给了我们一套非常规范并且易懂的代码,如果另外的一名开发者也对Qt动画框架有所了解,那么他可以毫不费力地看懂我的代码,并且从代码中了解设计思想。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include “Character.h“
/*---------------------------------------------------------------------------*/
Character::Character( const QString& fileName Gameobject* parent
                      QWidget* pWidget ): Gameobject( parent )
{
    m_AnimateTime = 1000;// 即1秒
    m_pWidget = pWidget;
    m_Image.load( fileName );       // 载入图片
    m_frameRect.setRect( 0 0 m_Image.width( ) / 4 m_Image.height( ) / 4 );
    SetDirection( _Right_ );        // 朝向右
    Init( );
}
/*---------------------------------------------------------------------------*/
void Character::paint( QPainter* pPainter const QstyleOptionGraphicsItem* pOption
                       QWidget* pWidget )
{
    pPainter->drawPixmap( QPoint( 0 -16 ) m_Image m_frameRect );
    Gameobject::paint( pPainter pOption pWidget );
}
/*---------------------------------------------------------------------------*/
QRectF Character::boundingRect( void ) const
{
    return QRect( 0 -16 32 48 );// 没有其它特殊的效果将返回帧框
}
/*---------------------------------------------------------------------------*/
void Character::SetDirection( int dir )
{
    int rectY = 2;
    switch ( dir )
    {
    case _Up_: rectY = 3; break;
    case _Down_: rectY = 0; break;
    case _Left_: rectY = 1; break;
    case _Right_: rectY = 2; break;
    }
    m_frameRect = QRect( m_frameRect.x( )
                         rectY * m_Image.height( ) / 4
                         m_frameRect.width( )
                         m_frameRect.height( ) );
}
/*---------------------------------------------------------------------------*/
static qreal OneEasingFunction( qreal progress )
{
    Q_UNUSED( progress )
    return 1.0;
}
/*---------------------------------------------------------------------------*/
void Character::SetframeAnimation( int dir )
{
    int rectY = 2;
    switch ( dir )
    {
    case _Up_: rectY = 3; break;
    case _Down_: rectY = 0; break;
    case _Left_: rectY = 1; break;
    case _Right_: rectY = 2; break;
    }

    QRect rect[4];
    QEasingCurve curve( QEasingCurve::Custom );
    curve.setCustomType( OneEasingFunction );
    for ( int i = 0; i < 4; ++i )
    {
        rect[i] = QRect( m_frameRect.width( ) * i rectY * m_Image.height( ) / 4
                         m_frameRect.width( ) m_frameRect.height( ) );
    }
    for ( int i = 0; i < 4; ++i )
    {
        m_pFPA[i]->setStartValue( rect[i] );
        m_pFPA[i]->setEndValue( rect[( i + 1 ) % 4] );
        m_pFPA[i]->setEasingCurve( curve );
        m_pFPA[i]->setDuration( m_AnimateTime / 4 );
    }
}
/*---------------------------------------------------------------------------*/
void Character::SetPosAnimation( int dir )// 设定位置动画
{
    QPointF point = pos( ) deltaPt;
    switch ( dir )

评论

共有 条评论