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