凡人修真3D(4)神装
1.for循环的iter如果不是之后特殊要求用到,千万不要提出来,要养成习惯,
Message::Db::Tables::SeqTGodEquip::const_iterator it = seqTGodEquip.begin(); for ( ; it != seqTGodEquip.end(); ++it )
2.自动购买其实并不需要真的购买,扣钱就行了。现在这样先要加上物品,然后再删除,操作麻烦,而且背包满了就不能用了。
int bagAmount = normalItemAmount + limiteItemAmount;
if( bagAmount < levelConfig->_consumeItemAmount )
{
if ( autoBuy )
{
int buyAmount = levelConfig->_consumeItemAmount - bagAmount;
CShopManager::instance()->buyItem( gateEntity, 10003, levelConfig->_consumeItemCode,
buyAmount, updateCode, Message::Public::EPlayerItemPosTypeBag );
CGodEquipHelper::getConsumeItems( tItem, bagPtr, consumeItemPtrs, normalItemAmount, limiteItemAmount );
}
else
{
Common::CErrorCodeManager::throwException( "ErrorGate_BagItemNotEnough" );
}
}3.SeqPairInt的扩展性差很多,既然都用到两个字段了,可以考虑用map了。这个效率的问题有空得研究一下。不过100几十个的插入应该不会很慢,可能有差别,都可以忽略。
不过说到这个。启动程序,load配置的时候,那个效率一般是不那么重要的。而且可以把一些经常用到的,对于配置的计算,放到GameConfigData里面。或者插入会慢点,但是load完之后,就不需要了,但是之后读取SeqPairInt肯定是比map慢很多的。
typedef std::vector< std::pair< int, int > > SeqPairInt;
//星配置
struct SGodEquipStar
: virtual public cdf::CRefShared
{
SGodEquipStar()
:_exp( 0 ),
_consumeItemCode( 0 ),
_consumeItemAmount( 0 )
{}
int _exp; //本星经验值
int _consumeItemCode; //培养每次消耗物品编码
int _consumeItemAmount; //培养每次消耗物品数量
DictIntInt _baseAttribute; //本星基础属性
SeqPairInt _expAttribute; //每次培养加成属性
};
另外,对于长些常用的类型,已经累计了很多公共的函数,可以直接使用,而且都是优化过的。例如CUtil里面的。
for ( SeqPairInt::const_iterator seqIt = seqPair.begin(); seqIt != seqPair.end(); ++seqIt )
{
DictIntInt::iterator mapIt = mapInt.find(seqIt->first);
if ( mapIt == mapInt.end() )
{
mapInt[seqIt->first] = static_cast<int>( seqIt->second * ( scale / 100 ) );
}
else
{
mapIt->second += static_cast<int>( seqIt->second * ( scale / 100 ) );
}
}5.随机函数,没什么特别操作就用CUtil::myRand().里面有一些检测的东西。
for ( GameConfigData::SeqPairInt::const_iterator seqIt = levelConfig->_expFullConfig.begin();
seqIt != levelConfig->_expFullConfig.end(); ++seqIt )
{
//暴击触发
if ( expScale >= seqIt->first )
{
int fullProb = rand() % 10000 + 1;
if ( fullProb < seqIt->second )
{
exp = levelConfig->_exp;
}
break;
}
}6.对了,在抛错的地方,记得加上中文注释。
if ( GameConfigData::CGodEquipConfigManager::instance()->checkLevelMax( playerGodEquip.level ) )
{
Common::CErrorCodeManager::throwException( "ErrorGate_GodEquipLevelMax" );//已达最大阶数
}
7.凌晨5点更新,可以用公共的函数。
static const int Hour5Second = 5 * 3600;//5小时的秒数
bool Common::CUtil::sameDay(const cdf::CDateTime& d1, const cdf::CDateTime& d2, int skewingSecond)
{
cdf::CDateTime d1Temp = d1 - cdf::CInterval(skewingSecond, 0);
cdf::CDateTime d2Temp = d2 - cdf::CInterval(skewingSecond, 0);
return (d1Temp.getTotalDay() == d2Temp.getTotalDay());
}
bool Common::CUtil::sameWeekForSomeTime( const cdf::CDateTime& d1, const cdf::CDateTime& d2 , int skewingSecond /*= 0*/ )
{
cdf::CDateTime d1Temp = d1 - cdf::CInterval(skewingSecond, 0);
cdf::CDateTime d2Temp = d2 - cdf::CInterval(skewingSecond, 0);
// std::string str1 = d1Temp.asString();
// std::string str2 = d2Temp.asString();
int day1 = d1Temp.getTotalDay();
int dayOfWeek = d1Temp.getDayOfWeek();
if (dayOfWeek == 0)
{
dayOfWeek = 7;
}
int begin = day1 -( dayOfWeek - 1 );
int end = day1 + ( 7 - dayOfWeek );
if (d2Temp.getTotalDay() >= begin && d2Temp.getTotalDay() <= end)
{
return true;
}
else
{
return false;
}
}
把五小时的秒数传进来就行了。不用写那么多检测的。。。
例如这样写,不是同一天,就要更新了。
void CGodEquipHelper::checkGodEquipExpEx( const CPlayerPtr& player )
{
if ( player->getTPlayerGodEquip().expEx > 0 )
{
if (!CUtil::sameDay(player->getTPlayerGodEquip().expExTime, cdf::CDateTime(), Second5Hours))
{
player->getTPlayerGodEquip().expEx = 0;
player->getSaveInfo(ETPlayerGodEquip).changeFlag = true;
}
}
}
struct SGodEquipSpSkin
{
int skinCode;
int refineLevel;这个东西,完全没必要嘛。可能以后要加字段,到时再加也改不了多少东西。
9.有空还是弄个管理类吧,像神翼那样。
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2

浙公网安备 33010602011771号