Example #1
0
        /// <summary>
        /// 移除某个位置一定数量的物体
        /// </summary>
        /// <param name="pos"></param>
        /// <param name="count"></param>
        /// <returns>移除的物体组</returns>
        public ItemGroup RemoveItem(int pos, int count)
        {
            ItemGroup targetItemGroup  = _itemGroups[pos];
            ItemGroup removedItemGroup = new ItemGroup()
            {
                Item = targetItemGroup.Item
            };

            if (targetItemGroup.Count > count) // 有剩余
            {
                targetItemGroup.Count -= count;
                removedItemGroup.Count = count;
            }
            else // 无剩余
            {
                removedItemGroup.Count = targetItemGroup.Count;
                _itemGroups[pos]       = null;
            }

            return(removedItemGroup);
        }
Example #2
0
        /// <summary>
        /// 移动物品组
        /// </summary>
        /// <param name="originalPos">原位置</param>
        /// <param name="targetPos">目标位置</param>
        public void MoveItemGroup(int originalPos, int targetPos)
        {
            if (originalPos == targetPos)
            {
                return;
            }

            // 要移动的物品组
            ItemGroup originalItemGroup = _itemGroups[originalPos];
            ItemGroup targetItemGroup   = _itemGroups[targetPos];

            if (originalItemGroup == null)
            {
                Debug.LogError("要移动的位置不存在物品");
                return;
            }

            int maxStack = GameSetting.ItemMaxStack;

            if (targetItemGroup != null && Item.IsCanStack(originalItemGroup.Item, targetItemGroup.Item)) // 目标位置有可以堆叠的物品
            {
                int space = maxStack - targetItemGroup.Count;
                if (originalItemGroup.Count <= space) // 全部堆过去
                {
                    targetItemGroup.Count += originalItemGroup.Count;
                    RemoveItemGroup(originalPos);
                }
                else // 只能堆一部份
                {
                    targetItemGroup.Count   += space;
                    originalItemGroup.Count -= space;
                }
            }
            else
            {
                // 交换
                _itemGroups[originalPos] = targetItemGroup;
                _itemGroups[targetPos]   = originalItemGroup;
            }
        }
Example #3
0
        /// <summary>
        /// 添加物品到某个位置
        /// <param name="index">位置</param>
        /// <param name="item">物品</param>
        /// <param name="count">数量</param>
        /// <retures>剩余未添加的数量</retures>
        /// </summary>
        public int AddItem(int index, Item item, int count)
        {
            if (item == null)
            {
                Debug.LogError("要添加的物品为null");
            }
            ItemGroup itemGroup = _itemGroups[index];

            if (itemGroup == null) // 目标位置没有物品
            {
                ItemGroup newItemGroup = new ItemGroup()
                {
                    Item = item,
                };

                int addedCount;

                if (item.Stack) // 可以堆叠
                {
                    if (count <= GameSetting.ItemMaxStack)
                    {
                        addedCount = count;
                    }
                    else
                    {
                        addedCount = GameSetting.ItemMaxStack;
                    }
                }
                else // 不能堆叠
                {
                    addedCount = 1;
                }

                newItemGroup.Count = addedCount;

                _itemGroups[index] = newItemGroup;

                return(count - addedCount);
            }
            else // 目标位置有物品
            {
                if (Item.IsCanStack(item, itemGroup.Item)) // 可以堆叠
                {
                    int space = GameSetting.ItemMaxStack - itemGroup.Count;

                    if (count <= space) // 全部堆过去
                    {
                        itemGroup.Count += count;
                        return(0);
                    }
                    else // 只能堆一部份
                    {
                        itemGroup.Count += space;
                        return(count - space);
                    }
                }
                else
                {
                    return(count);
                }
            }
        }
Example #4
0
 /// <summary>
 /// 添加物品组到某个位置
 /// <param name="index">位置</param>
 /// <param name="itemGroup">物品组</param>
 /// <retures>剩余未添加的数量</retures>
 /// </summary>
 public int AddItemGroup(int index, ItemGroup itemGroup)
 {
     return(AddItem(index, itemGroup.Item, itemGroup.Count));
 }
Example #5
0
        /// <summary>
        /// 添加物品,从前往后(可以用另一种方式实现)
        /// <param name="item">物品</param>
        /// <param name="count">数量</param>
        /// <retures>剩余未添加的数量</retures>
        /// </summary>
        public int AddItem(Item item, int count)
        {
            if (count == 0)
            {
                return(0);
            }

            int last     = count;
            int maxStack = GameSetting.ItemMaxStack;

            //可以堆叠的物品组
            ItemGroup itemGroup = FindItemGroup(v => Item.IsCanStack(v.Item, item) && v.Count < maxStack);

            if (itemGroup == null) // 没有可以堆叠的地方
            {
                int emptyPos = FindFirstEmptyPos();

                if (emptyPos == -1)  // 没有空位置
                {
                    return(last);
                }

                //新物品组
                ItemGroup newItemGroup = new ItemGroup()
                {
                    Item  = item,
                    Count = 0
                };

                _itemGroups[emptyPos] = newItemGroup;

                if (item.Stack)
                {
                    if (last <= maxStack) // 可以放完
                    {
                        newItemGroup.Count = last;
                    }
                    else // 放不完,还要新格子
                    {
                        newItemGroup.Count = maxStack;
                        last -= maxStack;

                        return(AddItem(item, last));
                    }
                }
                else
                {
                    newItemGroup.Count = 1;
                    last -= 1;
                    return(AddItem(item, last));
                }
            }
            else // 有可以堆叠的地方
            {
                int space = maxStack - itemGroup.Count;
                if (space >= last) // 可以堆下
                {
                    itemGroup.Count += last;
                    last             = 0;
                }
                else // 堆不下
                {
                    itemGroup.Count += space;
                    last            -= space;

                    // 还没放完
                    return(AddItem(item, last));
                }
            }

            return(0);
        }