这是我做的游戏里一段交换物品栏物品位置的代码。不同物品栏之间不能随便交换。但是可以与背包栏内相同类型的物品交换。
可能要删除,在这里备份一下。
bool check_switch_item_position_valid(HeroItemBarType item1Type, int item1Index, HeroItemBarType item2Type, int item2Index){
//不同的栏之间不能进行交换,除非至少有一个是背包栏
if(item1Type != item2Type && item1Type != HeroItemBarType::BACKPACK_BAR && item2Type != HeroItemBarType::BACKPACK_BAR ){
return false;
}
//如果是不同栏之间交换并且至少有一个是背包栏
if(item1Type != item2Type){
//如果是背包栏有物品移动到非背包栏就要检查类型是否符合
//第一个物品是背包里的
if(item1Type==HeroItemBarType::BACKPACK_BAR){
char name[MAX_NAME_LENGTH] = {0};
bool ret = m_baseBackPack.search_item_name(name,item1Index);
if(ret){
ItemBase *item = ItemFactory::get_instance()->get_a_sample_item(name);
switch (item2Type)
{
case CONSUMABLE_BAR:
//消耗品栏
if(item->get_Item_type() != ItemType::CONSUMABLE){
return false;
}
break;
case EQUIPMENT_BAR:
//装备栏
if(item->get_Item_type() != ItemType::EQUIPMENT){
return false;
}
break;
default:
break;
}
}
}
//另一种情况,第二个物品是背包里的
if(item2Type==HeroItemBarType::BACKPACK_BAR){
char name[MAX_NAME_LENGTH] = {0};
bool ret = m_baseBackPack.search_item_name(name,item2Index);
if(ret){
ItemBase *item = ItemFactory::get_instance()->get_a_sample_item(name);
switch (item1Type)
{
case CONSUMABLE_BAR:
//消耗品栏
if(item->get_Item_type() != ItemType::CONSUMABLE){
return false;
}
break;
case EQUIPMENT_BAR:
//装备栏
if(item->get_Item_type() != ItemType::EQUIPMENT){
return false;
}
break;
default:
break;
}
}
}
}
return true;
}
bool switch_item_position(HeroItemBarType item1Type, int item1Index, HeroItemBarType item2Type, int item2Index){
bool validOperation = check_switch_item_position_valid(item1Type, item1Index, item2Type, item2Index);
if(validOperation){
//缓存物品
char item1Name[MAX_NAME_LENGTH] = {0};
int item1Number = 0;
bool hasItem1 = false;
char item2Name[MAX_NAME_LENGTH] = {0};
int item2Number = 0;
bool hasItem2 = false;
//取出物品
switch(item1Type){
case HeroItemBarType::CONSUMABLE_BAR:
hasItem1 = m_consumableBackPack.take_out_all_item(item1Name,item1Number,item1Index);
break;
case HeroItemBarType::EQUIPMENT_BAR:
hasItem1 = m_equipmentBackPack.take_out_all_item(item1Name,item1Number,item1Index);
break;
case HeroItemBarType::BACKPACK_BAR:
hasItem1 = m_baseBackPack.take_out_all_item(item1Name,item1Number,item1Index);
break;
default:
break;
}
switch(item2Type){
case HeroItemBarType::CONSUMABLE_BAR:
hasItem2 = m_consumableBackPack.take_out_all_item(item2Name,item2Number,item2Index);
break;
case HeroItemBarType::EQUIPMENT_BAR:
hasItem2 = m_equipmentBackPack.take_out_all_item(item2Name,item2Number,item2Index);
break;
case HeroItemBarType::BACKPACK_BAR:
hasItem2 = m_baseBackPack.take_out_all_item(item2Name,item2Number,item2Index);
break;
default:
break;
}
//交换位置放入物品
if(hasItem2){
switch(item1Type){
case HeroItemBarType::CONSUMABLE_BAR:
m_consumableBackPack.put_in_specified_number_item_base(item2Name,item2Number,item1Index);
break;
case HeroItemBarType::EQUIPMENT_BAR:
m_equipmentBackPack.put_in_specified_number_item_base(item2Name,item2Number,item1Index);
break;
case HeroItemBarType::BACKPACK_BAR:
m_baseBackPack.put_in_specified_number_item_base(item2Name,item2Number,item1Index);
break;
default:
break;
}
}
if(hasItem1){
switch(item2Type){
case HeroItemBarType::CONSUMABLE_BAR:
m_consumableBackPack.put_in_specified_number_item_base(item1Name,item1Number,item2Index);
break;
case HeroItemBarType::EQUIPMENT_BAR:
m_equipmentBackPack.put_in_specified_number_item_base(item1Name,item1Number,item2Index);
break;
case HeroItemBarType::BACKPACK_BAR:
m_baseBackPack.put_in_specified_number_item_base(item1Name,item1Number,item2Index);
break;
default:
break;
}
}
}
return validOperation;
}还有一段移除上面的背包代码后,直接从周围开启宝箱和捡起物品的代码
bool pick_drop_items(){
bool ret = false;
//获取所有周围宝箱
std::vector<TreasureBox*> tbList = DropItemManager::get_instance()->get_treasure_box_list(m_spritePositionAndSize);
//遍历所有周围宝箱
for(auto &any:tbList){
BonusItemList itemList;
//打开宝箱
bool hasItem = any->take_bonus(itemList);
//获取到了物品
if(hasItem){
for(int i=0;i<itemList.ItemNumber;i++){
//根据item名字获取样本示例指针
auto sample = ItemFactory::get_instance()->get_a_sample_item(itemList.Items[i].ItemName);
//自动判断加入2种背包栏
if(sample->get_Item_type()==ItemType::CONSUMABLE){
m_consumableBackPack.put_in_specified_number_item_auto_position(itemList.Items[i].ItemName,itemList.Items[i].ItemNumber);
}else if(sample->get_Item_type()==ItemType::EQUIPMENT){
m_equipmentBackPack.put_in_specified_number_item_auto_position(itemList.Items[i].ItemName,itemList.Items[i].ItemNumber);
}
}
ret = true;
}
}
//遍历所有掉落物
std::vector<DropItem*> diList = DropItemManager::get_instance()->get_drop_item_list(m_spritePositionAndSize);
//遍历所有周围宝箱
for(auto &any:diList){
char itemName[MAX_NAME_LENGTH] = {0};
int itemNumber = 0;
//打开宝箱
bool hasItem = any->take_bonus_item(itemName,itemNumber);
//获取到了物品
if(hasItem){
//根据item名字获取样本示例指针
auto sample = ItemFactory::get_instance()->get_a_sample_item(itemName);
//自动判断加入2种背包栏
if(sample->get_Item_type()==ItemType::CONSUMABLE){
m_consumableBackPack.put_in_specified_number_item_auto_position(itemName,itemNumber);
}else if(sample->get_Item_type()==ItemType::EQUIPMENT){
m_equipmentBackPack.put_in_specified_number_item_auto_position(itemName,itemNumber);
}
ret = true;
}
}
//返回结果 是否得到物品
return ret;
}