一 天龙伤害显示是通过配置表实现不同伤害显示的,里面记载了各种伤害的显示速度,加速度,颜色等信息
<
Property Name
=
"
XSpeed
"
Value
=
"
type:0 value:0
"
/>
<!--
X轴初始移动速度
-->
< Property Name = " YSpeed " Value = " type:0 value:-200 " /> <!-- Y轴初始移动速度 -->
< Property Name = " XAcceleration " Value = " type:0 value:0 " /> <!-- X轴初始移动加速度 -->
< Property Name = " YAcceleration " Value = " type:0 value:100 " /><!-- Y轴初始移动加速度 -->
< Property Name = " MaxLife " Value = " type:0 value:2000 " /> <!-- 生存期,多长时间后消失,毫秒 -->
< Property Name = " AlphaMode " Value = " type:0 value:1 " /> <!-- 是渐渐透明消失还是忽然消失,1为渐渐消失,0为透明度不变,生存期过后消失 -->
< Property Name = " XPos " Value = " type:0 value:0 " /> <!-- 产生时的相对于初始值的X位置偏移 -->
< Property Name = " YPos " Value = " type:0 value:0 " /> <!-- 产生时的相对于初始值的Y位置偏移 -->
< Property Name = " YSpeed " Value = " type:0 value:-200 " /> <!-- Y轴初始移动速度 -->
< Property Name = " XAcceleration " Value = " type:0 value:0 " /> <!-- X轴初始移动加速度 -->
< Property Name = " YAcceleration " Value = " type:0 value:100 " /><!-- Y轴初始移动加速度 -->
< Property Name = " MaxLife " Value = " type:0 value:2000 " /> <!-- 生存期,多长时间后消失,毫秒 -->
< Property Name = " AlphaMode " Value = " type:0 value:1 " /> <!-- 是渐渐透明消失还是忽然消失,1为渐渐消失,0为透明度不变,生存期过后消失 -->
< Property Name = " XPos " Value = " type:0 value:0 " /> <!-- 产生时的相对于初始值的X位置偏移 -->
< Property Name = " YPos " Value = " type:0 value:0 " /> <!-- 产生时的相对于初始值的Y位置偏移 -->
二 所有伤害会添加到一个manager里面,添加一个新的伤害时,会遍历所有伤害,找到一个未占用的位置。
if
( pBeHit
->
m_nUseTempPos )
{
// 判断是不是已经占用位置了
std::list < CBeHitBoard * > ::iterator it;
int bTemp[ CEGUI::MAX_TEMP_TYPE_NUMBER ];
for ( int i = 0 ; i < CEGUI::MAX_TEMP_TYPE_NUMBER; i ++ )
bTemp[ i ] = false ;
for ( it = m_listBeHitBoard.begin(); it != m_listBeHitBoard.end(); it ++ )
{
CBeHitBoard * pItem = ( * it );
// 如果同是自己的类型
if ( pBeHit -> m_nMoveType == pItem -> m_nMoveType )
{
if ( abs( int ( pItem -> m_nStartY - pBeHit -> m_nStartY ) ) < 50 )
{
bTemp[ pItem -> m_nTempPosIndex ] = true ;
}
}
}
for ( int i = 0 ; i < CEGUI::MAX_TEMP_TYPE_NUMBER;i ++ )
{
if ( ! bTemp[ i ] )
{
pBeHit -> m_nTempPosIndex = i;
pBeHit -> m_nStartX += CBeHitBoardManager::GetMe() -> m_TempPoint[ i ].d_x;
pBeHit -> m_nStartY += CBeHitBoardManager::GetMe() -> m_TempPoint[ i ].d_y;
break ;
}
}
}
{
// 判断是不是已经占用位置了
std::list < CBeHitBoard * > ::iterator it;
int bTemp[ CEGUI::MAX_TEMP_TYPE_NUMBER ];
for ( int i = 0 ; i < CEGUI::MAX_TEMP_TYPE_NUMBER; i ++ )
bTemp[ i ] = false ;
for ( it = m_listBeHitBoard.begin(); it != m_listBeHitBoard.end(); it ++ )
{
CBeHitBoard * pItem = ( * it );
// 如果同是自己的类型
if ( pBeHit -> m_nMoveType == pItem -> m_nMoveType )
{
if ( abs( int ( pItem -> m_nStartY - pBeHit -> m_nStartY ) ) < 50 )
{
bTemp[ pItem -> m_nTempPosIndex ] = true ;
}
}
}
for ( int i = 0 ; i < CEGUI::MAX_TEMP_TYPE_NUMBER;i ++ )
{
if ( ! bTemp[ i ] )
{
pBeHit -> m_nTempPosIndex = i;
pBeHit -> m_nStartX += CBeHitBoardManager::GetMe() -> m_TempPoint[ i ].d_x;
pBeHit -> m_nStartY += CBeHitBoardManager::GetMe() -> m_TempPoint[ i ].d_y;
break ;
}
}
}
三 update里面更新信息
m_nXSpeed
+=
(
float
( m_nXAcceleration )
/
1000
)
*
g_pTimer
->
GetDeltaTime();
m_nYSpeed += ( float ( m_nYAcceleration ) / 1000 ) * g_pTimer -> GetDeltaTime();
m_nStartX += ( float ( m_nXSpeed ) / 1000 ) * g_pTimer -> GetDeltaTime();
m_nStartY += ( float ( m_nYSpeed ) / 1000 ) * g_pTimer -> GetDeltaTime();
m_nLife -= ( int )g_pTimer -> GetDeltaTime();
if ( m_bAlphaMode )
m_fAlpha = float ( m_nLife ) / float ( m_nMaxLife );
if ( m_bDoubleHit )
{
if ( m_bZoomOn )
{
m_fScale += m_fDoubleTime / g_pTimer -> GetDeltaTime();
if ( m_fScale > CBeHitBoardManager::GetMe() -> getDoubleSize() )
m_bZoomOn = false ;
}
else
{
m_fScale -= m_fDoubleTime / g_pTimer -> GetDeltaTime();
}
if ( m_fScale < CBeHitBoardManager::GetMe() -> getDoubleEndSize() )
{
m_fScale = CBeHitBoardManager::GetMe() -> getDoubleEndSize();
m_bDoubleHit = false ;
}
((CEGUI::IFalagardBeHitBoard * )(CEGUI::FalagardBeHitBoard * )m_pWindow ) -> setTextScale( m_fScale, m_fScale );
}
if ( m_nLife > 0 )
{
CEGUI::Point fPos;
// CEGUI::Size size = CEGUI::System::getSingleton().getRenderer()->getSize();
fPos.d_x = float ( m_nStartX ); // / size.d_width;
fPos.d_y = float ( m_nStartY ); // / size.d_height;
((CEGUI::IFalagardBeHitBoard * )(CEGUI::FalagardBeHitBoard * )m_pWindow ) -> setDisplayCenter( fPos.d_x, fPos.d_y );
if ( m_bAlphaMode )
m_pWindow -> setAlpha( m_fAlpha );
}
m_nYSpeed += ( float ( m_nYAcceleration ) / 1000 ) * g_pTimer -> GetDeltaTime();
m_nStartX += ( float ( m_nXSpeed ) / 1000 ) * g_pTimer -> GetDeltaTime();
m_nStartY += ( float ( m_nYSpeed ) / 1000 ) * g_pTimer -> GetDeltaTime();
m_nLife -= ( int )g_pTimer -> GetDeltaTime();
if ( m_bAlphaMode )
m_fAlpha = float ( m_nLife ) / float ( m_nMaxLife );
if ( m_bDoubleHit )
{
if ( m_bZoomOn )
{
m_fScale += m_fDoubleTime / g_pTimer -> GetDeltaTime();
if ( m_fScale > CBeHitBoardManager::GetMe() -> getDoubleSize() )
m_bZoomOn = false ;
}
else
{
m_fScale -= m_fDoubleTime / g_pTimer -> GetDeltaTime();
}
if ( m_fScale < CBeHitBoardManager::GetMe() -> getDoubleEndSize() )
{
m_fScale = CBeHitBoardManager::GetMe() -> getDoubleEndSize();
m_bDoubleHit = false ;
}
((CEGUI::IFalagardBeHitBoard * )(CEGUI::FalagardBeHitBoard * )m_pWindow ) -> setTextScale( m_fScale, m_fScale );
}
if ( m_nLife > 0 )
{
CEGUI::Point fPos;
// CEGUI::Size size = CEGUI::System::getSingleton().getRenderer()->getSize();
fPos.d_x = float ( m_nStartX ); // / size.d_width;
fPos.d_y = float ( m_nStartY ); // / size.d_height;
((CEGUI::IFalagardBeHitBoard * )(CEGUI::FalagardBeHitBoard * )m_pWindow ) -> setDisplayCenter( fPos.d_x, fPos.d_y );
if ( m_bAlphaMode )
m_pWindow -> setAlpha( m_fAlpha );
}