Skip to content

Commit cb40558

Browse files
committed
[增加]1. 增加背包的基础功能
1 parent 551758e commit cb40558

File tree

13 files changed

+395
-3
lines changed

13 files changed

+395
-3
lines changed

Assets/Hotfix/Events.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// GameFrameX 组织下的以及组织衍生的项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
2+
//
3+
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE 文件。
4+
//
5+
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
6+
7+
using GameFrameX.Event.Runtime;
8+
using GameFrameX.Runtime;
9+
10+
namespace Hotfix.Events
11+
{
12+
/// <summary>
13+
/// 背包数量变化或者道具变化事件
14+
/// </summary>
15+
public sealed class BagChangedEventArgs : GameEventArgs
16+
{
17+
public static readonly string EventId = typeof(BagChangedEventArgs).FullName;
18+
19+
public override void Clear()
20+
{
21+
}
22+
23+
public override string Id
24+
{
25+
get { return EventId; }
26+
}
27+
28+
/// <summary>
29+
/// 创建背包数量变化或者道具变化事件
30+
/// </summary>
31+
/// <returns></returns>
32+
public static BagChangedEventArgs Create()
33+
{
34+
var eventArgs = ReferencePool.Acquire<BagChangedEventArgs>();
35+
return eventArgs;
36+
}
37+
}
38+
}

Assets/Hotfix/Events/BagChangedEventArgs.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Hotfix/Manager/BagManager.cs

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Cysharp.Threading.Tasks;
14
using GameFrameX.Network.Runtime;
25
using GameFrameX.Runtime;
6+
using Hotfix.Config;
7+
using Hotfix.Config.Tables;
8+
using Hotfix.Events;
39
using Hotfix.Proto;
410

511
namespace Hotfix.Manager
@@ -9,14 +15,101 @@ namespace Hotfix.Manager
915
/// </summary>
1016
public sealed class BagManager : GameFrameworkSingleton<BagManager>, IMessageHandler
1117
{
18+
private readonly Dictionary<int, BagItem> _itemDic = new Dictionary<int, BagItem>();
19+
20+
public List<BagItem> GetItems()
21+
{
22+
return _itemDic.Values.ToList();
23+
}
24+
1225
/// <summary>
1326
/// 监听道具变化通知
1427
/// </summary>
1528
/// <param name="msg"></param>
1629
[MessageHandler(typeof(NotifyBagInfoChanged), nameof(NotifyBagInfoChanged))]
1730
private void NotifyBagInfoChanged(NotifyBagInfoChanged msg)
1831
{
19-
Log.Debug(msg);
32+
foreach (var keyValuePair in msg.ItemDic)
33+
{
34+
if (_itemDic.TryGetValue(keyValuePair.Key, out var item))
35+
{
36+
item.Count = keyValuePair.Value.Count;
37+
if (_itemDic[keyValuePair.Key].Count <= 0)
38+
{
39+
_itemDic.Remove(keyValuePair.Key);
40+
}
41+
}
42+
else
43+
{
44+
_itemDic[keyValuePair.Key] = new BagItem() { ItemId = keyValuePair.Key, Count = keyValuePair.Value.Count };
45+
}
46+
}
47+
48+
GameApp.Event.Fire(this, BagChangedEventArgs.Create());
49+
}
50+
51+
/// <summary>
52+
/// 请求背包信息
53+
/// </summary>
54+
public async UniTask RequestGetBagInfo()
55+
{
56+
var respBagInfo = await GameApp.Network.GetNetworkChannel("network").Call<RespBagInfo>(new ReqBagInfo());
57+
if (respBagInfo.ErrorCode != default)
58+
{
59+
return;
60+
}
61+
62+
foreach (var item in respBagInfo.ItemDic)
63+
{
64+
_itemDic[item.Key] = new BagItem() { ItemId = item.Key, Count = item.Value };
65+
}
66+
}
67+
68+
/// <summary>
69+
/// 请求使用道具
70+
/// </summary>
71+
/// <param name="itemId">道具ID</param>
72+
/// <param name="count">道具数量</param>
73+
public async UniTask RequestUseItem(int itemId, long count = 1)
74+
{
75+
var respUseItem = await GameApp.Network.GetNetworkChannel("network").Call<RespUseItem>(new ReqUseItem() { ItemId = itemId, Count = count });
76+
if (respUseItem.ErrorCode != default)
77+
{
78+
return;
79+
}
80+
81+
if (_itemDic.TryGetValue(respUseItem.ItemId, out var value))
82+
{
83+
value.Count -= respUseItem.Count;
84+
if (value.Count <= 0)
85+
{
86+
_itemDic.Remove(respUseItem.ItemId);
87+
}
88+
}
89+
90+
GameApp.Event.Fire(this, BagChangedEventArgs.Create());
91+
}
92+
93+
/// <summary>
94+
/// 获取指定类型的道具
95+
/// </summary>
96+
/// <param name="bagType">背包类型</param>
97+
/// <returns></returns>
98+
public List<BagItem> GetBagItemsByType(ItemType bagType)
99+
{
100+
var result = new List<BagItem>(_itemDic.Count);
101+
var tbItemConfig = GameApp.Config.GetConfig<TbItemConfig>();
102+
var itemType = bagType;
103+
foreach (var bagItem in _itemDic)
104+
{
105+
var itemConfig = tbItemConfig.Get(bagItem.Key);
106+
if (itemConfig.IsNotNull() && itemConfig.Type == itemType)
107+
{
108+
result.Add(bagItem.Value);
109+
}
110+
}
111+
112+
return result;
20113
}
21114

22115
/// <summary>
@@ -26,7 +119,7 @@ public BagManager()
26119
{
27120
Register();
28121
}
29-
122+
30123
/// <summary>
31124
/// 注册消息。请勿多次调用
32125
/// </summary>

Assets/Hotfix/UI/Logic/UIBag.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
// GameFrameX 组织下的以及组织衍生的项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
2+
//
3+
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE 文件。
4+
//
5+
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
6+
7+
using System.Collections.Generic;
8+
using FairyGUI;
9+
using GameFrameX.Event.Runtime;
10+
using Hotfix.Config;
11+
using Hotfix.Config.Tables;
12+
using Hotfix.Events;
13+
using Hotfix.Manager;
14+
using Hotfix.Proto;
15+
16+
namespace Hotfix.UI
17+
{
18+
public partial class UIBag
19+
{
20+
private class ItemTypeData
21+
{
22+
/// <summary>
23+
/// 道具类型
24+
/// </summary>
25+
public ItemType Type { get; }
26+
27+
/// <summary>
28+
/// 分类名称
29+
/// </summary>
30+
public string Name { get; }
31+
32+
public ItemTypeData(ItemType type, string name)
33+
{
34+
Type = type;
35+
Name = name;
36+
}
37+
}
38+
39+
private List<ItemTypeData> Tabs = new List<ItemTypeData>();
40+
List<object> _bagItems = new List<object>();
41+
private BagItem _selectBagItem = null;
42+
43+
public override void OnOpen(object userData)
44+
{
45+
_bagItems = new List<object>();
46+
Tabs = new List<ItemTypeData>
47+
{
48+
new ItemTypeData(ItemType.Item, "道具"),
49+
new ItemTypeData(ItemType.Equip, "装备"),
50+
new ItemTypeData(ItemType.Fragment, "碎片"),
51+
new ItemTypeData(ItemType.Material, "材料"),
52+
new ItemTypeData(ItemType.Expendable, "消耗品"),
53+
};
54+
55+
GameApp.Event.CheckSubscribe(BagChangedEventArgs.EventId, OnBagChangedEventArgs);
56+
57+
base.OnOpen(userData);
58+
m_content.m_list.onClickItem.Set(OnBagItemClick);
59+
m_content.m_list.itemRenderer = BagItemRenderer;
60+
m_content.m_type_list.itemRenderer = TypeItemRenderer;
61+
m_content.m_type_list.onClickItem.Set(OnTabTypeClick);
62+
m_content.m_type_list.DataList = new List<object>(Tabs);
63+
m_content.m_type_list.GetChildAt(0).onClick.Call();
64+
65+
m_content.m_info.m_use_button.onClick.Add(OnUseButtonClick);
66+
this.m_bg.onClick.Set(OnCloseClick);
67+
}
68+
69+
70+
private void OnBagChangedEventArgs(object sender, GameEventArgs e)
71+
{
72+
m_content.m_type_list.GetChildAt(m_content.m_type_list.selectedIndex).onClick.Call();
73+
}
74+
75+
/// <summary>
76+
/// 使用道具
77+
/// </summary>
78+
private async void OnUseButtonClick()
79+
{
80+
if (_selectBagItem.IsNull())
81+
{
82+
return;
83+
}
84+
85+
await BagManager.Instance.RequestUseItem(_selectBagItem.ItemId, _selectBagItem.Count);
86+
}
87+
88+
private void OnBagItemClick(EventContext context)
89+
{
90+
var data = UIBagItem.GetFormPool((GObject)context.data);
91+
var itemTypeData = (BagItem)data.self.dataSource;
92+
UpdateSelectItem(itemTypeData);
93+
}
94+
95+
96+
private void UpdateSelectItem(BagItem bagItem)
97+
{
98+
_selectBagItem = bagItem;
99+
UIGoodItem.GetFormPool(m_content.m_info.m_good_item).SetCount(bagItem.Count).SetIcon(bagItem.ItemId);
100+
var itemConfig = GameApp.Config.GetConfig<TbItemConfig>().Get(bagItem.ItemId);
101+
if (itemConfig.CanUse == ItemCanUse.CanNot)
102+
{
103+
m_content.m_info.m_IsCanUse.SetSelectedIndex(0);
104+
}
105+
else
106+
{
107+
m_content.m_info.m_IsCanUse.SetSelectedIndex(1);
108+
}
109+
110+
m_content.m_info.m_name_text.text = itemConfig.Name;
111+
m_content.m_info.m_desc_text.text = itemConfig.Description;
112+
}
113+
114+
115+
private void BagItemRenderer(int index, GObject item)
116+
{
117+
var bagItemData = (BagItem)item.dataSource;
118+
var uiBagItem = UIBagItem.GetFormPool(item);
119+
var uiGoodItem = UIGoodItem.GetFormPool(uiBagItem.m_good_item);
120+
uiGoodItem.SetCount(bagItemData.Count);
121+
uiGoodItem.SetIcon(bagItemData.ItemId);
122+
}
123+
124+
#region Tab
125+
126+
private void OnTabTypeClick(EventContext context)
127+
{
128+
var data = UIBagTypeItem.GetFormPool((GButton)context.data);
129+
var itemTypeData = (ItemTypeData)data.self.dataSource;
130+
_bagItems.Clear();
131+
_bagItems.AddRange(BagManager.Instance.GetBagItemsByType(itemTypeData.Type));
132+
m_content.m_list.DataList = _bagItems;
133+
if (_bagItems.Count > 0)
134+
{
135+
m_content.m_list.selectedIndex = 0;
136+
m_content.m_IsSelectedItem.SetSelectedIndex(1);
137+
var bagItem = (BagItem)_bagItems[0];
138+
UpdateSelectItem(bagItem);
139+
}
140+
else
141+
{
142+
m_content.m_IsSelectedItem.SetSelectedIndex(0);
143+
_selectBagItem = null;
144+
}
145+
}
146+
147+
private void TypeItemRenderer(int index, GObject item)
148+
{
149+
var itemTypeData = (ItemTypeData)item.dataSource;
150+
item.asButton.title = itemTypeData.Name;
151+
}
152+
153+
#endregion
154+
155+
private void OnCloseClick()
156+
{
157+
GameApp.UI.CloseUIForm<UIBag>();
158+
}
159+
}
160+
}

Assets/Hotfix/UI/Logic/UIBag/UIBag.Logic.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Hotfix/UI/Logic/UICommon.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)