天龙源码分析 - cegui 实现表情

一 AnimateManager

表情管理类,保存了所有表情Animate

        typedef std::map <  String, Animate *   >  AnimateNameRegistry;
        
// 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;

 

 

其中一个比较重要的函数是

         /* !
        \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;

    
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();
        }
        
    }

 

这个函数就可以更新图片了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值