資源簡介
Qt的動畫框架是Qt4.6新添加的一個(gè)重要的特性,有了它,開發(fā)人員可以制作激動人心的動畫界面,而不必局限于單調(diào)的固定窗口了,可以說,這是其它界面庫少見的功能,帶來的則是Qt的另一大優(yōu)勢。最近我花了大概三、四天的時(shí)間研究Qt動畫框架的內(nèi)容,這讓我感到Qt人員精心的設(shè)計(jì)給了我們一套非常規(guī)范并且易懂的代碼,如果另外的一名開發(fā)者也對Qt動畫框架有所了解,那么他可以毫不費(fèi)力地看懂我的代碼,并且從代碼中了解設(shè)計(jì)思想。
代碼片段和文件信息
#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?)//?設(shè)定位置動畫
{
????QPointF?point?=?pos(?)?deltaPt;
????switch?(?dir?)
評論
共有 條評論