Add whether the item is selected.Adjust the display logic of the backpack UI.
加入物品是否被选择。调整背包UI的显示逻辑。
This commit is contained in:
parent
a58ddeb039
commit
1e5b466c6f
|
@ -6,10 +6,10 @@ uid="uid://cc0k86apkvut7"
|
|||
|
||||
[deps]
|
||||
|
||||
files=["res://locals/Slogan.zh.translation", "res://locals/Slogan.en.translation", "res://locals/Slogan.ja.translation"]
|
||||
files=["res://locals/slogan.zh.translation", "res://locals/slogan.en.translation", "res://locals/slogan.ja.translation"]
|
||||
|
||||
source_file="res://locals/Slogan.csv"
|
||||
dest_files=["res://locals/Slogan.zh.translation", "res://locals/Slogan.en.translation", "res://locals/Slogan.ja.translation"]
|
||||
source_file="res://locals/slogan.csv"
|
||||
dest_files=["res://locals/slogan.zh.translation", "res://locals/slogan.en.translation", "res://locals/slogan.ja.translation"]
|
||||
|
||||
[params]
|
||||
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
using ColdMint.scripts.character;
|
||||
using ColdMint.scripts.inventory;
|
||||
using ColdMint.scripts.item;
|
||||
using ColdMint.scripts.loader.uiLoader;
|
||||
using ColdMint.scripts.map.events;
|
||||
using ColdMint.scripts.utils;
|
||||
using Godot;
|
||||
|
||||
namespace ColdMint.scripts;
|
||||
|
@ -85,4 +88,36 @@ public static class GameSceneNodeHolder
|
|||
///<para>背包Ui容器内存放的是背包ui节点的容器。当用户使用背包时,会从背包ui容器内将其背包对于的节点展示出来。</para>
|
||||
/// </remarks>
|
||||
public static Control? BackpackUiContainer { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>Hide the knapsack node in the knapsack Ui if the knapsack UI is displayed</para>
|
||||
/// <para>如果背包Ui处于显示状态,那么隐藏背包UI内的背包节点</para>
|
||||
/// </summary>
|
||||
public static void HideBackpackUiContainerIfVisible()
|
||||
{
|
||||
if (BackpackUiContainer == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!BackpackUiContainer.Visible)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
NodeUtils.ForEachNode<PacksackUi>(BackpackUiContainer, node =>
|
||||
{
|
||||
|
||||
//If the child node is not visible, the traversal continues.
|
||||
//如果子节点不可见,则继续遍历。
|
||||
if (!node.Visible)
|
||||
return false;
|
||||
//Until you find a visible node, hide it, and return true, ending the loop.
|
||||
//直到找到可见的节点,隐藏该节点,然后返回true,结束遍历。
|
||||
node.Hide();
|
||||
return true;
|
||||
|
||||
});
|
||||
}
|
||||
}
|
|
@ -264,6 +264,7 @@ public partial class Player : CharacterTemplate
|
|||
}
|
||||
|
||||
ThrowItem(ItemContainer.GetSelectIndex(), 1, GetThrowVelocity());
|
||||
GameSceneNodeHolder.HideBackpackUiContainerIfVisible();
|
||||
CurrentItem = null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@ public partial class HotBar : HBoxContainer
|
|||
{
|
||||
//Mouse wheel down
|
||||
//鼠标滚轮向下
|
||||
GameSceneNodeHolder.HideBackpackUiContainerIfVisible();
|
||||
_itemContainer?.SelectTheNextItemSlot();
|
||||
}
|
||||
|
||||
|
@ -52,6 +53,7 @@ public partial class HotBar : HBoxContainer
|
|||
{
|
||||
//Mouse wheel up
|
||||
//鼠标滚轮向上
|
||||
GameSceneNodeHolder.HideBackpackUiContainerIfVisible();
|
||||
_itemContainer?.SelectThePreviousItemSlot();
|
||||
}
|
||||
|
||||
|
@ -110,11 +112,11 @@ public partial class HotBar : HBoxContainer
|
|||
/// <param name="shortcutKeyIndex"></param>
|
||||
private void SelectItemSlotByHotBarShortcutKey(int shortcutKeyIndex)
|
||||
{
|
||||
GameSceneNodeHolder.HideBackpackUiContainerIfVisible();
|
||||
if (_itemContainer == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_itemContainer.SelectItemSlot(shortcutKeyIndex);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,12 @@ public interface IItemContainer : IEnumerable<ItemSlotNode>
|
|||
/// <returns></returns>
|
||||
bool AddItem(IItem item);
|
||||
|
||||
/// <summary>
|
||||
/// <para>Whether this item container supports checking</para>
|
||||
/// <para>此物品容器是否支持选中</para>
|
||||
/// </summary>
|
||||
public bool SupportSelect { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>Determines the number of items that can be received from the specified pile</para>
|
||||
/// <para>判断能从指定物品堆中接收的物品数量</para>
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
using System;
|
||||
using ColdMint.scripts.item;
|
||||
using ColdMint.scripts.item.itemStacks;
|
||||
using ColdMint.scripts.map.events;
|
||||
using ColdMint.scripts.utils;
|
||||
using Godot;
|
||||
|
||||
|
@ -21,7 +19,6 @@ public partial class ItemSlotNode : MarginContainer
|
|||
private bool _isSelect;
|
||||
private Texture2D? _backgroundTexture;
|
||||
private Texture2D? _backgroundTextureWhenSelect;
|
||||
public Action<ItemStackChangeEvent>? ItemStackChangeEvent;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
|
@ -37,7 +34,7 @@ public partial class ItemSlotNode : MarginContainer
|
|||
|
||||
public override Variant _GetDragData(Vector2 atPosition)
|
||||
{
|
||||
if (_iconTextureRect == null || _itemStack == null)
|
||||
if (_isSelect || _iconTextureRect == null || _itemStack == null)
|
||||
{
|
||||
//Drag is not allowed if there is no icon or no pile of items.
|
||||
//如果没有图标或者没有物品堆,那么不允许拖动。
|
||||
|
@ -78,7 +75,6 @@ public partial class ItemSlotNode : MarginContainer
|
|||
return false;
|
||||
}
|
||||
|
||||
//TODO:This is where we infer whether the two piles can merge.在这里推断两个物品堆是否可以融合。
|
||||
return _itemStack == null;
|
||||
}
|
||||
|
||||
|
@ -105,6 +101,7 @@ public partial class ItemSlotNode : MarginContainer
|
|||
//尝试获取源物品堆时返回null。
|
||||
return;
|
||||
}
|
||||
|
||||
ReplaceItemStack(itemStack);
|
||||
}
|
||||
|
||||
|
@ -411,11 +408,6 @@ public partial class ItemSlotNode : MarginContainer
|
|||
private void SetItemStack(IItemStack? itemStack)
|
||||
{
|
||||
_itemStack = itemStack;
|
||||
var stackChangeEvent = new ItemStackChangeEvent
|
||||
{
|
||||
ItemStack = itemStack
|
||||
};
|
||||
ItemStackChangeEvent?.Invoke(stackChangeEvent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -429,6 +421,4 @@ public partial class ItemSlotNode : MarginContainer
|
|||
_iconTextureRect.Texture = _itemStack?.Icon;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -36,6 +36,9 @@ public class UniversalItemContainer : IItemContainer
|
|||
//_selectIndex默认为0.
|
||||
private int _selectIndex;
|
||||
|
||||
|
||||
public bool SupportSelect { get; set; } = true;
|
||||
|
||||
public bool CanAddItem(IItem item)
|
||||
{
|
||||
return Match(item) != null;
|
||||
|
@ -78,12 +81,17 @@ public class UniversalItemContainer : IItemContainer
|
|||
|
||||
public int GetSelectIndex()
|
||||
{
|
||||
if (!SupportSelect)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return _selectIndex;
|
||||
}
|
||||
|
||||
public ItemSlotNode? GetSelectItemSlotNode()
|
||||
{
|
||||
if (_itemSlotNodes == null || _itemSlotNodes.Count == 0)
|
||||
if (!SupportSelect || _itemSlotNodes == null || _itemSlotNodes.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
@ -98,11 +106,35 @@ public class UniversalItemContainer : IItemContainer
|
|||
return null;
|
||||
}
|
||||
|
||||
public IItem? PickItemFromItemSlotBySelectIndex() => PickItemFromItemSlot(_selectIndex);
|
||||
public IItem? PickItemFromItemSlotBySelectIndex()
|
||||
{
|
||||
if (!SupportSelect)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public IItemStack? PickItemsFromItemSlotBySelectIndex(int value) => PickItemsFromItemSlot(_selectIndex, value);
|
||||
return PickItemFromItemSlot(_selectIndex);
|
||||
}
|
||||
|
||||
public int RemoveItemFromItemSlotBySelectIndex(int number) => RemoveItemFromItemSlot(_selectIndex, number);
|
||||
public IItemStack? PickItemsFromItemSlotBySelectIndex(int value)
|
||||
{
|
||||
if (!SupportSelect)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return PickItemsFromItemSlot(_selectIndex, value);
|
||||
}
|
||||
|
||||
public int RemoveItemFromItemSlotBySelectIndex(int number)
|
||||
{
|
||||
if (!SupportSelect)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return RemoveItemFromItemSlot(_selectIndex, number);
|
||||
}
|
||||
|
||||
public int GetItemSlotCount()
|
||||
{
|
||||
|
@ -232,7 +264,15 @@ public class UniversalItemContainer : IItemContainer
|
|||
return null;
|
||||
}
|
||||
|
||||
if (SupportSelect)
|
||||
{
|
||||
itemSlotNode.IsSelect = (_itemSlotNodes.Count) == _selectIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
itemSlotNode.IsSelect = false;
|
||||
}
|
||||
|
||||
_itemSlotNodes.Add(itemSlotNode);
|
||||
// itemSlotNode.ItemStackChangeEvent += @event =>
|
||||
// {
|
||||
|
@ -265,7 +305,7 @@ public class UniversalItemContainer : IItemContainer
|
|||
|
||||
public void SelectTheNextItemSlot()
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
if (!SupportSelect || _itemSlotNodes == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -288,7 +328,7 @@ public class UniversalItemContainer : IItemContainer
|
|||
|
||||
public void SelectThePreviousItemSlot()
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
if (!SupportSelect || _itemSlotNodes == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -311,7 +351,7 @@ public class UniversalItemContainer : IItemContainer
|
|||
|
||||
public void SelectItemSlot(int newSelectIndex)
|
||||
{
|
||||
if (newSelectIndex == _selectIndex)
|
||||
if (!SupportSelect || newSelectIndex == _selectIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -331,6 +371,11 @@ public class UniversalItemContainer : IItemContainer
|
|||
/// </summary>
|
||||
private void PrivateSelectItemSlot(int oldSelectIndex, int newSelectIndex)
|
||||
{
|
||||
if (!SupportSelect)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (oldSelectIndex == newSelectIndex)
|
||||
{
|
||||
return;
|
||||
|
|
|
@ -57,6 +57,7 @@ public partial class Packsack : PickAbleTemplate
|
|||
{
|
||||
base._Ready();
|
||||
ItemContainer = new UniversalItemContainer();
|
||||
ItemContainer.SupportSelect = false;
|
||||
//When the backpack is created, the item slot is generated.
|
||||
//当背包被创建时,物品槽就被生成出来了。
|
||||
for (var i = 0; i < NumberSlots; i++)
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
using ColdMint.scripts.item.itemStacks;
|
||||
|
||||
namespace ColdMint.scripts.map.events;
|
||||
|
||||
/// <summary>
|
||||
/// <para>ItemStackChangeEvent</para>
|
||||
/// <para>物品堆改变事件</para>
|
||||
/// </summary>
|
||||
public class ItemStackChangeEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// <para>Changed ItemStack</para>
|
||||
/// <para>改变后的物品堆</para>
|
||||
/// </summary>
|
||||
public IItemStack? ItemStack { get; set; }
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using ColdMint.scripts.debug;
|
||||
using ColdMint.scripts.item;
|
||||
|
@ -36,6 +37,39 @@ public static class NodeUtils
|
|||
return deleteNumber;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>Traverse the child nodes of type T under the parent node</para>
|
||||
/// <para>遍历父节点下T类型的子节点</para>
|
||||
/// </summary>
|
||||
/// <param name="parent"></param>
|
||||
/// <param name="func">
|
||||
///<para>A function that handles callbacks and returns true to terminate the traversal of the node</para>
|
||||
///<para>用于处理回调的函数,返回true终止遍历节点</para>
|
||||
/// </param>
|
||||
/// <typeparam name="T">
|
||||
///<para>When the type is specified as Node, all child nodes are returned.</para>
|
||||
///<para>当指定类型为Node时,将返回所有子节点。</para>
|
||||
/// </typeparam>
|
||||
public static void ForEachNode<T>(Node parent, Func<T,bool> func) where T : Node
|
||||
{
|
||||
var count = parent.GetChildCount();
|
||||
if (count <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
var node = parent.GetChild(i);
|
||||
if (node is not T t) continue;
|
||||
if (func.Invoke(t))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>All child nodes are removed asynchronously</para>
|
||||
/// <para>异步删除所有子节点</para>
|
||||
|
|
Loading…
Reference in New Issue
Block a user