凡人修真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