本文整理汇总了C++中CUtlVector::Sort方法的典型用法代码示例。如果您正苦于以下问题:C++ CUtlVector::Sort方法的具体用法?C++ CUtlVector::Sort怎么用?C++ CUtlVector::Sort使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CUtlVector
的用法示例。
在下文中一共展示了CUtlVector::Sort方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SetAwardsInEvent
void CGEStats::SetAwardsInEvent( IGameEvent *pEvent )
{
// Ignore awards when only 1 person is playing
if ( GEMPRules()->GetNumActivePlayers() < 2 )
return;
CUtlVector<GEStatSort*> vAwards;
GEStatSort *award;
int i;
// Prevent divide by zero
if ( m_iRoundCount == 0 )
m_iRoundCount = 1;
for ( i=0; i < GE_AWARD_GIVEMAX; i++ )
{
// Check for valid award
if ( AwardIDToIdent(i) )
{
award = new GEStatSort;
// See if we are going to give this one out, if so store it, if not erase the dummy var
if ( GetAwardWinner(i, *award) )
vAwards.AddToTail( award );
else
delete award;
}
}
// Sort our ratios from High to Low
vAwards.Sort( &CGEStats::StatSortHigh );
char eventid[16], eventwinner[16];
CBaseEntity *pPlayer;
for ( i=0; i < vAwards.Count(); i++ )
{
// Never give out more than 6 awards
if ( i == 6 )
break;
pPlayer = m_pPlayerStats[ vAwards[i]->idx ]->GetPlayer();
if ( !pPlayer )
continue;
Q_snprintf( eventid, 16, "award%i_id", i+1 );
Q_snprintf( eventwinner, 16, "award%i_winner", i+1 );
pEvent->SetInt( eventid, vAwards[i]->m_iAward );
pEvent->SetInt( eventwinner, pPlayer->entindex() );
}
vAwards.PurgeAndDeleteElements();
}
示例2: RenderSprites
void CLightingEditor::RenderSprites()
{
CMatRenderContextPtr pRenderContext( materials );
pRenderContext->Bind( m_matSprite_Light );
CUtlVector< def_light_t* > hSortedLights;
hSortedLights.AddVectorToTail( m_hEditorLights );
hSortedLights.Sort( DefLightSort );
FOR_EACH_VEC( hSortedLights, i )
{
def_light_t *pLight = hSortedLights[ i ];
Vector origin = pLight->pos;
float flC3[3] = { 0 };
float flMax = MAX( 1, MAX( pLight->col_diffuse[0],
MAX( pLight->col_diffuse[1], pLight->col_diffuse[2] ) ) );
for ( int i = 0; i < 3; i++ )
flC3[i] = clamp( pLight->col_diffuse[i] / flMax, 0, 1 );
DrawHalo( m_matSprite_Light, origin, LIGHT_BOX_SIZE, flC3 );
}
示例3: GetFavoriteWeapon
bool CGEStats::GetFavoriteWeapon( int iPlayer, GEWeaponSort &fav )
{
if ( iPlayer < 0 || iPlayer >= m_pPlayerStats.Count() )
return false;
GEPlayerStats *stats = m_pPlayerStats[iPlayer];
CBasePlayer *pPlayer = ToBasePlayer( m_pPlayerStats[iPlayer]->GetPlayer() );
if ( !pPlayer || !stats )
return false;
// We want raw kills, NOT score
int playerFrags = pPlayer->FragCount();
float roundtime = gpGlobals->curtime - m_flRoundStartTime;
// Avoid divide by zero!
if ( roundtime == 0.0f )
roundtime = 0.5f;
CUtlVector<GEWeaponSort*> weapons;
float killPercent;
for ( int i=WEAPON_NONE+1; i < WEAPON_RANDOM; i++ ) // Go up to WEAPON_RANDOM to exclude tokens.
{
GEWeaponSort *entry = new GEWeaponSort;
if ( GEGameplay()->IsInFinalIntermission() )
{
entry->m_iPercentage = stats->m_iMatchWeapons[i];
}
else
{
// Avoid divide by zero!
if ( playerFrags == 0 )
killPercent = 0.0f;
else
killPercent = (float)stats->m_iWeaponsKills[i] / (float)playerFrags;
if ( roundtime < 1.0f )
entry->m_iPercentage = 0;
else
entry->m_iPercentage = 100 * ( ((float)stats->m_iWeaponsHeldTime[i] / roundtime) + killPercent );
}
entry->m_iWeaponID = i;
weapons.AddToTail( entry );
}
weapons.Sort( &CGEStats::WeaponSort );
// Only give them a fav weapon if they have a percentage
fav.m_iPercentage = weapons[0]->m_iPercentage;
if ( fav.m_iPercentage )
fav.m_iWeaponID = weapons[0]->m_iWeaponID;
else
fav.m_iWeaponID = WEAPON_NONE;
#ifdef _DEBUG
DevMsg( "%s's weapon stats:\n", pPlayer->GetPlayerName() );
DevMsg( "Frags: %i, Roundtime: %0.2f\n", playerFrags, roundtime );
for ( int i=0; i < WEAPON_MAX-2; i++ )
{
if ( weapons[i]->m_iPercentage )
DevMsg( "%s : %i\n", WeaponIDToAlias( weapons[i]->m_iWeaponID ), weapons[i]->m_iPercentage );
}
DevMsg( "Favorite Weapon: %s\n", WeaponIDToAlias( fav.m_iWeaponID ) );
#endif
weapons.PurgeAndDeleteElements();
return true;
}
示例4: GetAwardWinner
bool CGEStats::GetAwardWinner( int iAward, GEStatSort &winner )
{
CUtlVector<GEStatSort*> stats;
if ( GEMPRules()->GetNumActivePlayers() < 2 )
return false;
// Reset any previous inclinations
winner.m_iAward = -1;
winner.m_iStat = 0;
CGEPlayer *pPlayer = NULL;
// First parse out all the award to player information
for ( int i=0; i < m_pPlayerStats.Count(); i++ )
{
// Don't try to give awards to invalid players
pPlayer = m_pPlayerStats[i]->GetPlayer();
if ( !pPlayer )
continue;
if ( pPlayer->GetTeamNumber() == TEAM_SPECTATOR )
continue;
GEStatSort *entry = new GEStatSort;
entry->idx = i;
// If this is the last report, then take the match stats, average them over the rounds, and use that as our stat
if ( GEGameplay()->IsInFinalIntermission() )
entry->m_iStat = m_pPlayerStats[i]->GetMatchStat( iAward ) / m_iRoundCount;
else
entry->m_iStat = m_pPlayerStats[i]->GetRoundStat( iAward );
stats.AddToTail( entry );
}
// Make sure after our checks we have at least two players to do awards for
if ( stats.Count() < 2 )
return false;
float playerrat = (float)(stats.Count() + GE_STATS_PLAYERRATIO) / (float)stats.Count();
if ( GetAwardSort(iAward) == GE_SORT_HIGH )
stats.Sort( &CGEStats::StatSortHigh );
else
{
stats.Sort( &CGEStats::StatSortLow );
// Since we are sorting low we have to invert our player ratio
playerrat = 1 / playerrat;
}
// Prevent divide by zero and inflation
if ( stats[1]->m_iStat == 0 )
stats[1]->m_iStat = 1;
float statrat = (float)stats[0]->m_iStat / (float)stats[1]->m_iStat;
// Low sort should have a ratio less than the inverted playerrat
if ( GetAwardSort(iAward) == GE_SORT_HIGH ? statrat > playerrat : statrat < playerrat )
{
// Prevent divide by zero
if ( statrat == 0 )
statrat = 1;
winner.idx = stats[0]->idx;
winner.m_iStat = (GetAwardSort(iAward) == GE_SORT_HIGH ? statrat : 1/statrat) * 1000; // 3 decimal precision
winner.m_iAward = iAward;
stats.PurgeAndDeleteElements();
return true;
}
stats.PurgeAndDeleteElements();
return false;
}