游戏交换物品栏代码

⌚Time: 2026-01-03 16:00:00

👨‍💻Author: Jack Ge

这是我做的游戏里一段交换物品栏物品位置的代码。不同物品栏之间不能随便交换。但是可以与背包栏内相同类型的物品交换。

可能要删除,在这里备份一下。



    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;
    }