一 AnimateManager
表情管理类,保存了所有表情Animate
typedef std::map< String, Animate* > AnimateNameRegistry;
//All animate
AnimateNameRegistry d_animateNameMap;
//Animate use id as index.
AnimateIDRegistry d_animateIDMap;
//All animate
AnimateNameRegistry d_animateNameMap;
typedef std::map
< int, Animate* > AnimateIDRegistry;//Animate use id as index.
AnimateIDRegistry d_animateIDMap;
二 Animate
代表一个表情,比如笑脸,包含一组笑脸的图片
struct AnimateKey
{
const Image* d_image;
};
typedef std::vector< AnimateKey > AnimateKeyRegistry;
{
const Image* d_image;
};
typedef std::vector< AnimateKey > AnimateKeyRegistry;
其中一个比较重要的函数是
/*!
\brief
Get the frame use species time and time total.
const Image* getFrame(int time_elapsed, int time_total) const;
\brief
Get the frame use species time and time total.
\param time_now
Specifies the time current.
\param time_total
Specifies the total time length.
\return
The frame image that at the time. If the animate should stop or not start yet, return 0.
const Image* getFrame(int time_elapsed, int time_total) const;
能够根据实际便宜值,求对应的图片
另外一个函数
float Animate::getFrameAlpha( int time_elapsed, int time_total )
{
if( time_total == -1 )
time_total = d_totalTime;
if( d_bModeAlpha == false )
return 1;
int nTime = time_elapsed;
if( d_loopMode )
nTime = time_elapsed % time_total;
switch( d_loopType )
{
case 0: // 0 -- 255
break;
case 1: // 0 -- 255 -- 0
{
if( alpha < 0.5 )
alpha *= 2;
else
alpha = ( 1.0f - alpha ) * 2;
}
break;
case 2: // 255 -- 0
alpha = 1 - alpha;
break;
}
return alpha;
{
if( time_total == -1 )
time_total = d_totalTime;
if( d_bModeAlpha == false )
return 1;
int nTime = time_elapsed;
if( d_loopMode )
nTime = time_elapsed % time_total;
float alpha = float( nTime ) / float( time_total );
switch( d_loopType )
{
case 0: // 0 -- 255
break;
case 1: // 0 -- 255 -- 0
{
if( alpha < 0.5 )
alpha *= 2;
else
alpha = ( 1.0f - alpha ) * 2;
}
break;
case 2: // 255 -- 0
alpha = 1 - alpha;
break;
}
return alpha;
}
可以更新表情的alpha
三 FalagardAnimate
具体使用表情的控件,包含了Animate的指针
其中一个比较重要的函数是
void FalagardAnimate::updateSelf(float elapsed)
{
// 得到相应得播放了得时间
if( m_pAnimate )
{
if( m_bPlay )
{
int time_now = (int)(System::getSingleton().getCurTimeElapsed()*1000.0f);
const Image* pFrame = m_pAnimate->getFrame( time_now - m_nAnimateStart, -1 );
m_fAlpha = m_pAnimate->getFrameAlpha( time_now - m_nAnimateStart, -1 );
d_normalImage.setImage( pFrame ) ;
}
else
{
d_normalImage.setImage( NULL ) ;
}
requestRedraw();
}
}
{
// 得到相应得播放了得时间
if( m_pAnimate )
{
if( m_bPlay )
{
int time_now = (int)(System::getSingleton().getCurTimeElapsed()*1000.0f);
const Image* pFrame = m_pAnimate->getFrame( time_now - m_nAnimateStart, -1 );
m_fAlpha = m_pAnimate->getFrameAlpha( time_now - m_nAnimateStart, -1 );
d_normalImage.setImage( pFrame ) ;
}
else
{
d_normalImage.setImage( NULL ) ;
}
requestRedraw();
}
}
这个函数就可以更新图片了