凡人修真3D(6)背包
1.背包检测空位的时候要注意。直接上代码吧。
正确的做法:检测完之后,需要立刻附加到背包中,才能进行下一次检测。
for (SeqPlayerItemPtr::iterator iter = playerItems.begin(); iter != playerItems.end(); iter++) { if (toBag->haveSpace((*iter)->getTPlayerItem().itemCode, (*iter)->getTPlayerItem().itemAmount)) { fromBag->deleteItem((*iter)); toBag->addItem((*iter)); CPlayerItemHelper::updatePlayerItem(EUpdateTypeUpdate, gateEntity, toBag, (*iter), playerItemUpdates, tLogItems, -1, updateCode, player, logDetail); SeqPlayerItemPtr playerItemVec2; CBagHelper::tidyBag(updateCode, gateEntity, player, toBag, playerItemVec2, playerItemUpdates, tLogItems); CBagHelper::pushBagInfo(updateCode, gateEntity, toBag, playerItemVec2); } }
这不是唯一的写法。关键点是,在调用了haveSpace函数之后,需要添加了这个物品。如果在添加物品前,再次检测,就没有意义了。
例如:
for (SeqPlayerItemPtr::iterator iter = playerItems.begin(); iter != playerItems.end(); iter++) { if (haveSpace(getTPlayerItem().itemCode, getTPlayerItem().itemAmount)) { //xxx } } //xxx干其他东西 for (SeqPlayerItemPtr::iterator iter = playerItems.begin(); iter != playerItems.end(); iter++) { addItem((*iter));; }像这样,会出错,因为物品还没加进去,但是可能位置应该被占用了。
碰到这种情况,应该累加起来。
for (itemAmountMapIt = itemAmountMap.begin(); <span style="white-space:pre"> </span>itemAmountMapIt != itemAmountMap.end(); <span style="white-space:pre"> </span>++itemAmountMapIt) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>itemCodeAndAmountMap[itemAmountMapIt->second.itemCode] += itemAmountMapIt->second.amount; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>if (!bag->haveSpaces(itemCodeAndAmountMap)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CErrorCodeManager::throwException("ErrorGate_BagSlotNotEnough"); <span style="white-space:pre"> </span>}
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2