Extracted from UniversalItemContainer.
提取UniversalItemContainer类。
This commit is contained in:
parent
7805a63174
commit
856a957c6a
|
@ -1,6 +1,6 @@
|
|||
[![Star History Chart](https://api.star-history.com/svg?repos=Cold-Mint/Traveller&type=Date)](https://star-history.com/#Cold-Mint/Traveller&Date)
|
||||
|
||||
English [简体中文](README_ZH.md) [にほんご](README_JP.md)
|
||||
English [简体中文](README_ZH.md) [にほんご](README_JA.md)
|
||||
|
||||
## Intro
|
||||
|
||||
|
@ -13,8 +13,8 @@ A pixel cross-platform roguelite game.
|
|||
| Task | status |
|
||||
| ----------------------------------------------------------- | ------------------ |
|
||||
| Randomly generated map | complete |
|
||||
| loot | In progress |
|
||||
| Support still out of the knapsack system | await |
|
||||
| loot | complete |
|
||||
| Support still out of the knapsack system | In progress |
|
||||
| Add AI agents to creatures | await |
|
||||
|
||||
## Screenshot
|
||||
|
|
|
@ -13,8 +13,8 @@
|
|||
| ミッション | じょうたい |
|
||||
| ----------------------------------------------------------- | ------------------ |
|
||||
| マップをランダムに生成します | 成し遂げる |
|
||||
| 戦利品 | 進行中です |
|
||||
| バックパックのシステムをサポートしています | すたんばい |
|
||||
| 戦利品 | 成し遂げる |
|
||||
| バックパックのシステムをサポートしています | 進行中です |
|
||||
| 生物にAIエージェントを追加します | すたんばい |
|
||||
## スクリーンショットです
|
||||
|
||||
|
@ -50,7 +50,7 @@ git clone https://github.com/Cold-Mint/Traveller.git
|
|||
|
||||
[GPL-3.0 license](LICENSE)
|
||||
|
||||
プロトコルの日本語訳を見ます:[GPL-3.0 license にほんご](LICENSE_JP)
|
||||
プロトコルの日本語訳を見ます:[GPL-3.0 license にほんご](LICENSE_JA)
|
||||
|
||||
商用に対応しており、誰でも修正、構築、販売、無料配布が可能です。このプロジェクトのすべての派生バージョンについて、GPLプロトコルに基づいて、あなたは**作者の著作権**を保持し、**ソースコードの修正を公開します**。
|
||||
|
12
README_ZH.md
12
README_ZH.md
|
@ -1,6 +1,6 @@
|
|||
[![Star History Chart](https://api.star-history.com/svg?repos=Cold-Mint/Traveller&type=Date)](https://star-history.com/#Cold-Mint/Traveller&Date)
|
||||
|
||||
[English](README.md) 简体中文 [にほんご](README_JP.md)
|
||||
[English](README.md) 简体中文 [にほんご](README_JA.md)
|
||||
|
||||
## 简介
|
||||
|
||||
|
@ -10,11 +10,11 @@
|
|||
|
||||
## 近期研发进度
|
||||
|
||||
| 任务 | 状态 |
|
||||
| ----------------------------------------------------------- | ------------------ |
|
||||
| 随机生成地图 | 完成 |
|
||||
| 战利品 | 进行中 |
|
||||
| 支持仍出的背包系统 | 等待 |
|
||||
| 任务 | 状态 |
|
||||
| ----------------------------------------------------------- |----|
|
||||
| 随机生成地图 | 完成 |
|
||||
| 战利品 | 完成 |
|
||||
| 支持仍出的背包系统 | 进行中 |
|
||||
| 为生物添加AI代理 | 等待 |
|
||||
|
||||
## 屏幕截图
|
||||
|
|
|
@ -161,7 +161,3 @@ locale/translations=PackedStringArray("res://locals/DeathInfo.en.translation", "
|
|||
[physics]
|
||||
|
||||
2d/default_gravity=480.0
|
||||
|
||||
[rendering]
|
||||
|
||||
renderer/rendering_method="mobile"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using System.Collections.Generic;
|
||||
using ColdMint.scripts.character;
|
||||
using ColdMint.scripts.utils;
|
||||
using Godot;
|
||||
|
||||
|
@ -8,87 +8,24 @@ namespace ColdMint.scripts.inventory;
|
|||
/// <para>HotBar</para>
|
||||
/// <para>快捷物品栏</para>
|
||||
/// </summary>
|
||||
public partial class HotBar : HBoxContainer, IItemContainer
|
||||
public partial class HotBar : HBoxContainer
|
||||
{
|
||||
private PackedScene? _itemSlotPackedScene;
|
||||
|
||||
private List<ItemSlotNode>? _itemSlotNodes;
|
||||
|
||||
/// <summary>
|
||||
/// <para>UnknownIndex</para>
|
||||
/// <para>未知位置</para>
|
||||
/// </summary>
|
||||
private const int UnknownIndex = -1;
|
||||
|
||||
//_selectIndex默认为0.
|
||||
private int _selectIndex;
|
||||
private UniversalItemContainer? _universalItemContainer;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
base._Ready();
|
||||
_universalItemContainer = new UniversalItemContainer
|
||||
{
|
||||
CharacterTemplate = new Player()
|
||||
};
|
||||
NodeUtils.DeleteAllChild(this);
|
||||
_itemSlotNodes = new List<ItemSlotNode>();
|
||||
_itemSlotPackedScene = GD.Load<PackedScene>("res://prefab/ui/ItemSlot.tscn");
|
||||
for (var i = 0; i < Config.HotBarSize; i++)
|
||||
{
|
||||
AddItemSlot(i);
|
||||
_universalItemContainer.AddItemSlot(this, i);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>Select the next item slot</para>
|
||||
/// <para>选择下一个物品槽</para>
|
||||
/// </summary>
|
||||
private void SelectTheNextItemSlot()
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var count = _itemSlotNodes.Count;
|
||||
if (count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var oldSelectIndex = _selectIndex;
|
||||
_selectIndex++;
|
||||
if (_selectIndex >= count)
|
||||
{
|
||||
_selectIndex = 0;
|
||||
}
|
||||
|
||||
SelectItemSlot(oldSelectIndex, _selectIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>Select the previous item slot</para>
|
||||
/// <para>选择上一个物品槽</para>
|
||||
/// </summary>
|
||||
private void SelectThePreviousItemSlot()
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var count = _itemSlotNodes.Count;
|
||||
if (count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var oldSelectIndex = _selectIndex;
|
||||
_selectIndex--;
|
||||
if (_selectIndex < 0)
|
||||
{
|
||||
_selectIndex = count - 1;
|
||||
}
|
||||
|
||||
SelectItemSlot(oldSelectIndex, _selectIndex);
|
||||
}
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
base._Process(delta);
|
||||
|
@ -96,14 +33,14 @@ public partial class HotBar : HBoxContainer, IItemContainer
|
|||
{
|
||||
//Mouse wheel down
|
||||
//鼠标滚轮向下
|
||||
SelectTheNextItemSlot();
|
||||
_universalItemContainer?.SelectTheNextItemSlot();
|
||||
}
|
||||
|
||||
if (Input.IsActionJustPressed("hotbar_previous"))
|
||||
{
|
||||
//Mouse wheel up
|
||||
//鼠标滚轮向上
|
||||
SelectThePreviousItemSlot();
|
||||
_universalItemContainer?.SelectThePreviousItemSlot();
|
||||
}
|
||||
|
||||
if (Input.IsActionJustPressed("hotbar_1"))
|
||||
|
@ -161,250 +98,15 @@ public partial class HotBar : HBoxContainer, IItemContainer
|
|||
/// <param name="shortcutKeyIndex"></param>
|
||||
private void SelectItemSlotByHotBarShortcutKey(int shortcutKeyIndex)
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
if (_universalItemContainer == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var safeIndex = GetSafeIndex(shortcutKeyIndex);
|
||||
if (safeIndex == UnknownIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SelectItemSlot(_selectIndex, safeIndex);
|
||||
_selectIndex = safeIndex;
|
||||
_universalItemContainer.SelectItemSlot(shortcutKeyIndex);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>Removes an item from the currently selected inventory</para>
|
||||
/// <para>移除当前选中的物品栏内的物品</para>
|
||||
/// </summary>
|
||||
/// <param name="number"></param>
|
||||
/// <returns></returns>
|
||||
public bool RemoveItemFromItemSlotBySelectIndex(int number)
|
||||
public IItemContainer? GetItemContainer()
|
||||
{
|
||||
return RemoveItemFromItemSlot(_selectIndex, number);
|
||||
}
|
||||
|
||||
public int GetItemSlotCount()
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return _itemSlotNodes.Count;
|
||||
}
|
||||
|
||||
public ItemSlotNode? GetItemSlotNode(int index)
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var safeIndex = GetSafeIndex(index);
|
||||
return _itemSlotNodes[safeIndex];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>Remove items from the item slot</para>
|
||||
/// <para>从物品槽内移除物品</para>
|
||||
/// </summary>
|
||||
/// <param name="itemSlotIndex">
|
||||
///<para>When this number is greater than the number of item slots, residual filtering is used.</para>
|
||||
///<para>当此数量大于物品槽的数量时,会使用余数筛选。</para>
|
||||
/// </param>
|
||||
/// <param name="number">
|
||||
///<para>The number of items removed</para>
|
||||
///<para>移除物品的数量</para>
|
||||
/// </param>
|
||||
public bool RemoveItemFromItemSlot(int itemSlotIndex, int number)
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var safeIndex = GetSafeIndex(itemSlotIndex);
|
||||
if (safeIndex == UnknownIndex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var itemSlot = _itemSlotNodes[safeIndex];
|
||||
return itemSlot.RemoveItem(number);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>Gets a secure subscript index</para>
|
||||
/// <para>获取安全的下标索引</para>
|
||||
/// </summary>
|
||||
/// <param name="itemSlotIndex"></param>
|
||||
/// <returns>
|
||||
///<para>-1 is returned on failure, and the index that does not result in an out-of-bounds subscript is returned on success</para>
|
||||
///<para>失败返回-1,成功返回不会导致下标越界的索引</para>
|
||||
/// </returns>
|
||||
private int GetSafeIndex(int itemSlotIndex)
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return UnknownIndex;
|
||||
}
|
||||
|
||||
var count = _itemSlotNodes.Count;
|
||||
if (count == 0)
|
||||
{
|
||||
//Prevents the dividend from being 0
|
||||
//防止被除数为0
|
||||
return UnknownIndex;
|
||||
}
|
||||
|
||||
return itemSlotIndex % count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>Select an item slot</para>
|
||||
/// <para>选中某个物品槽</para>
|
||||
/// </summary>
|
||||
private void SelectItemSlot(int oldSelectIndex, int newSelectIndex)
|
||||
{
|
||||
if (oldSelectIndex == newSelectIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_itemSlotNodes[oldSelectIndex].IsSelect = false;
|
||||
_itemSlotNodes[newSelectIndex].IsSelect = true;
|
||||
var oldItem = _itemSlotNodes[oldSelectIndex].GetItem();
|
||||
if (oldItem != null && oldItem is Node2D oldNode2D)
|
||||
{
|
||||
oldNode2D.ProcessMode = ProcessModeEnum.Disabled;
|
||||
oldNode2D.Hide();
|
||||
}
|
||||
|
||||
var item = _itemSlotNodes[newSelectIndex].GetItem();
|
||||
if (item == null)
|
||||
{
|
||||
if (GameSceneNodeHolder.Player != null)
|
||||
{
|
||||
GameSceneNodeHolder.Player.CurrentItem = null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item is Node2D node2D)
|
||||
{
|
||||
node2D.ProcessMode = ProcessModeEnum.Inherit;
|
||||
node2D.Show();
|
||||
if (GameSceneNodeHolder.Player != null)
|
||||
{
|
||||
GameSceneNodeHolder.Player.CurrentItem = node2D;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GameSceneNodeHolder.Player != null)
|
||||
{
|
||||
GameSceneNodeHolder.Player.CurrentItem = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public bool CanAddItem(IItem item)
|
||||
{
|
||||
return Matching(item) != null;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>Add an item to the HotBar</para>
|
||||
/// <para>在HotBar内添加一个物品</para>
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
public bool AddItem(IItem item)
|
||||
{
|
||||
var itemSlotNode = Matching(item);
|
||||
if (itemSlotNode == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return itemSlotNode.SetItem(item);
|
||||
}
|
||||
|
||||
public int GetSelectIndex()
|
||||
{
|
||||
return _selectIndex;
|
||||
}
|
||||
|
||||
public ItemSlotNode? GetSelectItemSlotNode()
|
||||
{
|
||||
if (_itemSlotNodes == null || _itemSlotNodes.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (_selectIndex < _itemSlotNodes.Count)
|
||||
{
|
||||
//Prevent subscripts from going out of bounds.
|
||||
//防止下标越界。
|
||||
return _itemSlotNodes[_selectIndex];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public ItemSlotNode? Matching(IItem item)
|
||||
{
|
||||
if (_itemSlotNodes == null || _itemSlotNodes.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
foreach (var itemSlotNode in _itemSlotNodes)
|
||||
{
|
||||
if (itemSlotNode.CanSetItem(item))
|
||||
{
|
||||
//If there is an item slot to put this item in, then we return it.
|
||||
//如果有物品槽可放置此物品,那么我们返回它。
|
||||
return itemSlotNode;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>Add items tank</para>
|
||||
/// <para>添加物品槽</para>
|
||||
/// </summary>
|
||||
private void AddItemSlot(int index)
|
||||
{
|
||||
if (_itemSlotNodes == null || _itemSlotPackedScene == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var itemSlotNode = NodeUtils.InstantiatePackedScene<ItemSlotNode>(_itemSlotPackedScene);
|
||||
if (itemSlotNode == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AddChild(itemSlotNode);
|
||||
itemSlotNode.IsSelect = index == _selectIndex;
|
||||
_itemSlotNodes.Add(itemSlotNode);
|
||||
return _universalItemContainer;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,6 @@
|
|||
namespace ColdMint.scripts.inventory;
|
||||
using Godot;
|
||||
|
||||
namespace ColdMint.scripts.inventory;
|
||||
|
||||
/// <summary>
|
||||
/// <para>item container</para>
|
||||
|
@ -54,7 +56,7 @@ public interface IItemContainer
|
|||
/// </summary>
|
||||
/// <returns></returns>
|
||||
int GetItemSlotCount();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>Gets the item slot for the specified location</para>
|
||||
/// <para>获取指定位置的物品槽</para>
|
||||
|
@ -82,4 +84,31 @@ public interface IItemContainer
|
|||
///<para>若没有槽可放置此物品,则返回null</para>
|
||||
/// </returns>
|
||||
ItemSlotNode? Matching(IItem item);
|
||||
|
||||
/// <summary>
|
||||
/// <para>AddItemSlot</para>
|
||||
/// <para>添加物品槽</para>
|
||||
/// </summary>
|
||||
/// <param name="rootNode"></param>
|
||||
/// <param name="index"></param>
|
||||
void AddItemSlot(Node rootNode, int index);
|
||||
|
||||
/// <summary>
|
||||
/// <para>SelectTheNextItemSlot</para>
|
||||
/// <para>选择下一个物品槽</para>
|
||||
/// </summary>
|
||||
void SelectTheNextItemSlot();
|
||||
|
||||
/// <summary>
|
||||
/// <para>SelectThePreviousItemSlot</para>
|
||||
/// <para>选择上一个物品槽</para>
|
||||
/// </summary>
|
||||
void SelectThePreviousItemSlot();
|
||||
|
||||
/// <summary>
|
||||
/// <para>选择物品槽</para>
|
||||
/// <para>SelectItemSlot</para>
|
||||
/// </summary>
|
||||
/// <param name="newSelectIndex"></param>
|
||||
void SelectItemSlot(int newSelectIndex);
|
||||
}
|
307
scripts/inventory/UniversalItemContainer.cs
Normal file
307
scripts/inventory/UniversalItemContainer.cs
Normal file
|
@ -0,0 +1,307 @@
|
|||
using System.Collections.Generic;
|
||||
using ColdMint.scripts.character;
|
||||
using ColdMint.scripts.utils;
|
||||
using Godot;
|
||||
|
||||
namespace ColdMint.scripts.inventory;
|
||||
|
||||
/// <summary>
|
||||
/// <para>UniversalItemContainer</para>
|
||||
/// <para>通用的物品容器</para>
|
||||
/// </summary>
|
||||
public class UniversalItemContainer : IItemContainer
|
||||
{
|
||||
private readonly PackedScene? _itemSlotPackedScene = GD.Load<PackedScene>("res://prefab/ui/ItemSlot.tscn");
|
||||
|
||||
private readonly List<ItemSlotNode>? _itemSlotNodes = new();
|
||||
|
||||
/// <summary>
|
||||
/// <para>Character</para>
|
||||
/// <para>角色</para>
|
||||
/// </summary>
|
||||
public CharacterTemplate? CharacterTemplate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>UnknownIndex</para>
|
||||
/// <para>未知位置</para>
|
||||
/// </summary>
|
||||
private const int UnknownIndex = -1;
|
||||
|
||||
//_selectIndex默认为0.
|
||||
private int _selectIndex;
|
||||
|
||||
public bool CanAddItem(IItem item)
|
||||
{
|
||||
return Matching(item) != null;
|
||||
}
|
||||
|
||||
public bool AddItem(IItem item)
|
||||
{
|
||||
var itemSlotNode = Matching(item);
|
||||
if (itemSlotNode == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return itemSlotNode.SetItem(item);
|
||||
}
|
||||
|
||||
public int GetSelectIndex()
|
||||
{
|
||||
return _selectIndex;
|
||||
}
|
||||
|
||||
public ItemSlotNode? GetSelectItemSlotNode()
|
||||
{
|
||||
if (_itemSlotNodes == null || _itemSlotNodes.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (_selectIndex < _itemSlotNodes.Count)
|
||||
{
|
||||
//Prevent subscripts from going out of bounds.
|
||||
//防止下标越界。
|
||||
return _itemSlotNodes[_selectIndex];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public bool RemoveItemFromItemSlotBySelectIndex(int number)
|
||||
{
|
||||
return RemoveItemFromItemSlot(_selectIndex, number);
|
||||
}
|
||||
|
||||
public int GetItemSlotCount()
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return _itemSlotNodes.Count;
|
||||
}
|
||||
|
||||
public ItemSlotNode? GetItemSlotNode(int index)
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var safeIndex = GetSafeIndex(index);
|
||||
return _itemSlotNodes[safeIndex];
|
||||
}
|
||||
|
||||
public bool RemoveItemFromItemSlot(int itemSlotIndex, int number)
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var safeIndex = GetSafeIndex(itemSlotIndex);
|
||||
if (safeIndex == UnknownIndex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var itemSlot = _itemSlotNodes[safeIndex];
|
||||
return itemSlot.RemoveItem(number);
|
||||
}
|
||||
|
||||
public ItemSlotNode? Matching(IItem item)
|
||||
{
|
||||
if (_itemSlotNodes == null || _itemSlotNodes.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
foreach (var itemSlotNode in _itemSlotNodes)
|
||||
{
|
||||
if (itemSlotNode.CanSetItem(item))
|
||||
{
|
||||
//If there is an item slot to put this item in, then we return it.
|
||||
//如果有物品槽可放置此物品,那么我们返回它。
|
||||
return itemSlotNode;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>Gets a secure subscript index</para>
|
||||
/// <para>获取安全的下标索引</para>
|
||||
/// </summary>
|
||||
/// <param name="itemSlotIndex"></param>
|
||||
/// <returns>
|
||||
///<para>-1 is returned on failure, and the index that does not result in an out-of-bounds subscript is returned on success</para>
|
||||
///<para>失败返回-1,成功返回不会导致下标越界的索引</para>
|
||||
/// </returns>
|
||||
private int GetSafeIndex(int itemSlotIndex)
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return UnknownIndex;
|
||||
}
|
||||
|
||||
var count = _itemSlotNodes.Count;
|
||||
if (count == 0)
|
||||
{
|
||||
//Prevents the dividend from being 0
|
||||
//防止被除数为0
|
||||
return UnknownIndex;
|
||||
}
|
||||
|
||||
return itemSlotIndex % count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>Add items tank</para>
|
||||
/// <para>添加物品槽</para>
|
||||
/// </summary>
|
||||
public void AddItemSlot(Node rootNode, int index)
|
||||
{
|
||||
if (_itemSlotNodes == null || _itemSlotPackedScene == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var itemSlotNode = NodeUtils.InstantiatePackedScene<ItemSlotNode>(_itemSlotPackedScene, rootNode);
|
||||
if (itemSlotNode == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
itemSlotNode.IsSelect = index == _selectIndex;
|
||||
_itemSlotNodes.Add(itemSlotNode);
|
||||
}
|
||||
|
||||
public void SelectTheNextItemSlot()
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var count = _itemSlotNodes.Count;
|
||||
if (count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var oldSelectIndex = _selectIndex;
|
||||
var newSelectIndex = _selectIndex + 1;
|
||||
if (newSelectIndex >= count)
|
||||
{
|
||||
newSelectIndex = 0;
|
||||
}
|
||||
|
||||
PrivateSelectItemSlot(oldSelectIndex, newSelectIndex);
|
||||
}
|
||||
|
||||
public void SelectThePreviousItemSlot()
|
||||
{
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var count = _itemSlotNodes.Count;
|
||||
if (count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var oldSelectIndex = _selectIndex;
|
||||
var newSelectIndex = _selectIndex - 1;
|
||||
if (newSelectIndex < 0)
|
||||
{
|
||||
newSelectIndex = count - 1;
|
||||
}
|
||||
|
||||
PrivateSelectItemSlot(oldSelectIndex, newSelectIndex);
|
||||
}
|
||||
|
||||
public void SelectItemSlot(int newSelectIndex)
|
||||
{
|
||||
if (newSelectIndex == _selectIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var safeIndex = GetSafeIndex(newSelectIndex);
|
||||
if (safeIndex == UnknownIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
PrivateSelectItemSlot(_selectIndex, newSelectIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>Select an item slot</para>
|
||||
/// <para>选中某个物品槽</para>
|
||||
/// </summary>
|
||||
private void PrivateSelectItemSlot(int oldSelectIndex, int newSelectIndex)
|
||||
{
|
||||
if (oldSelectIndex == newSelectIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_itemSlotNodes == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_itemSlotNodes[oldSelectIndex].IsSelect = false;
|
||||
_itemSlotNodes[newSelectIndex].IsSelect = true;
|
||||
var oldItem = _itemSlotNodes[oldSelectIndex].GetItem();
|
||||
if (oldItem is Node2D oldNode2D)
|
||||
{
|
||||
oldNode2D.ProcessMode = Node.ProcessModeEnum.Disabled;
|
||||
oldNode2D.Hide();
|
||||
}
|
||||
|
||||
var item = _itemSlotNodes[newSelectIndex].GetItem();
|
||||
switch (item)
|
||||
{
|
||||
case null:
|
||||
{
|
||||
if (CharacterTemplate != null)
|
||||
{
|
||||
CharacterTemplate.CurrentItem = null;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case Node2D node2D:
|
||||
{
|
||||
node2D.ProcessMode = Node.ProcessModeEnum.Inherit;
|
||||
node2D.Show();
|
||||
if (CharacterTemplate != null)
|
||||
{
|
||||
CharacterTemplate.CurrentItem = node2D;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
if (CharacterTemplate != null)
|
||||
{
|
||||
CharacterTemplate.CurrentItem = null;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
_selectIndex = newSelectIndex;
|
||||
}
|
||||
}
|
|
@ -58,7 +58,7 @@ public partial class PlayerSpawn : Marker2D
|
|||
{
|
||||
return;
|
||||
}
|
||||
playerNode.ItemContainer = GameSceneNodeHolder.HotBar;
|
||||
playerNode.ItemContainer = GameSceneNodeHolder.HotBar?.GetItemContainer();
|
||||
GameSceneNodeHolder.Player = playerNode;
|
||||
playerNode.Position = GlobalPosition;
|
||||
LogCat.LogWithFormat("player_spawn_debug", playerNode.ReadOnlyCharacterName, playerNode.Position);
|
||||
|
|
|
@ -2,7 +2,6 @@ using System;
|
|||
using ColdMint.scripts.camp;
|
||||
using ColdMint.scripts.character;
|
||||
using ColdMint.scripts.damage;
|
||||
using ColdMint.scripts.debug;
|
||||
using ColdMint.scripts.inventory;
|
||||
using Godot;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user