Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorCreateMark / MarkObjectCell.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using Config;
  4.  
  5. namespace UI.MapEditorCreateMark;
  6.  
  7. public class MarkObjectCell : UiCell<MapEditorCreateMark.MarkObject, MarkInfoItem>
  8. {
  9. //是否展开
  10. private bool _isExpand = false;
  11. private MapEditorCreateMark.ExpandPanel _expandPanel;
  12. //自定义额外属性
  13. private List<AttributeBase> _attributeBases;
  14. private ExcelConfig.ActivityBase _activityObject;
  15.  
  16. private MapEditorCreateMark.NumberBar _altitude;
  17. private MapEditorCreateMark.NumberBar _vSpeed;
  18. public override void OnInit()
  19. {
  20. CellNode.L_VBoxContainer.L_HBoxContainer.L_ExpandButton.Instance.Pressed += OnExpandClick;
  21. CellNode.L_VBoxContainer.L_HBoxContainer.L_CenterContainer.L_DeleteButton.Instance.Pressed += OnDeleteClick;
  22. }
  23.  
  24. public override void OnSetData(MarkInfoItem data)
  25. {
  26. //记得判断随机对象, 后面再做
  27. _activityObject = ExcelConfig.ActivityBase_Map[data.Id];
  28. //图标
  29. if (string.IsNullOrEmpty(_activityObject.Icon))
  30. {
  31. CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Visible = false;
  32. }
  33. else
  34. {
  35. CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Visible = true;
  36. CellNode.L_VBoxContainer.L_HBoxContainer.L_Icon.Instance.Texture = ResourceManager.LoadTexture2D(_activityObject.Icon);
  37. }
  38. //物体Id
  39. CellNode.L_VBoxContainer.L_HBoxContainer.L_IdLabel.Instance.Text = data.Id;
  40. //物体名称
  41. CellNode.L_VBoxContainer.L_HBoxContainer.L_NameLabel.Instance.Text = _activityObject.Name;
  42. //物体类型
  43. CellNode.L_VBoxContainer.L_HBoxContainer.L_TypeLabel.Instance.Text = NameManager.GetActivityTypeName(_activityObject.Type);
  44. //权重
  45. CellNode.L_VBoxContainer.L_HBoxContainer.L_WeightEdit.Instance.Value = data.Weight;
  46. if (data.SpecialMarkType == SpecialMarkType.BirthPoint) //出生标记
  47. {
  48. CellNode.L_VBoxContainer.L_HBoxContainer.L_CenterContainer.L_DeleteButton.Instance.Visible = false;
  49. CellNode.L_VBoxContainer.L_HBoxContainer.L_WeightEdit.Instance.Visible = false;
  50. }
  51. else //普通标记
  52. {
  53. // 包含额外属性
  54. if (_expandPanel == null)
  55. {
  56. CreateExpandPanel(_activityObject, data);
  57. }
  58. CellNode.L_VBoxContainer.L_HBoxContainer.L_CenterContainer.L_DeleteButton.Instance.Visible = true;
  59. CellNode.L_VBoxContainer.L_HBoxContainer.L_WeightEdit.Instance.Visible = true;
  60. }
  61. }
  62.  
  63. public override void OnDisable()
  64. {
  65. if (_expandPanel != null)
  66. {
  67. _attributeBases.Clear();
  68. _attributeBases = null;
  69. _expandPanel.QueueFree();
  70. _expandPanel = null;
  71. _altitude = null;
  72. _vSpeed = null;
  73. }
  74.  
  75. SetExpandState(false);
  76. }
  77.  
  78. /// <summary>
  79. /// 获取标记数据对象
  80. /// </summary>
  81. public MarkInfoItem GetMarkInfoItem()
  82. {
  83. var markInfoItem = Data;
  84. //额外属性
  85. if (_attributeBases != null)
  86. {
  87. markInfoItem.Attr = null;
  88. foreach (var attributeBase in _attributeBases)
  89. {
  90. if (attributeBase.Visible)
  91. {
  92. if (attributeBase.AttrName == "VSpeed" || attributeBase.AttrName == "Altitude") //不能是公共属性
  93. {
  94. continue;
  95. }
  96.  
  97. if (markInfoItem.Attr == null)
  98. {
  99. markInfoItem.Attr = new Dictionary<string, string>();
  100. }
  101. markInfoItem.Attr.Add(attributeBase.AttrName, attributeBase.GetAttributeValue());
  102. }
  103. }
  104. }
  105.  
  106.  
  107. if (Data.SpecialMarkType == SpecialMarkType.Normal)
  108. {
  109. //权重
  110. markInfoItem.Weight = (int)CellNode.L_VBoxContainer.L_HBoxContainer.L_WeightEdit.Instance.Value;
  111. }
  112.  
  113. //海拔高度
  114. if (_altitude != null && _altitude.Instance.Visible)
  115. {
  116. markInfoItem.Altitude = (int)_altitude.L_NumInput.Instance.Value;
  117. }
  118. //纵轴速度
  119. if (_vSpeed != null && _vSpeed.Instance.Visible)//海拔高度
  120. {
  121. markInfoItem.VerticalSpeed = (float)_vSpeed.L_NumInput.Instance.Value;
  122. }
  123.  
  124. return markInfoItem;
  125. }
  126.  
  127. //点击删除按钮
  128. private void OnDeleteClick()
  129. {
  130. Grid.RemoveByIndex(Index);
  131. }
  132.  
  133. //点击展开按钮
  134. private void OnExpandClick()
  135. {
  136. //展开图标
  137. SetExpandState(!_isExpand);
  138. }
  139.  
  140. //设置展开状态
  141. private void SetExpandState(bool flag)
  142. {
  143. _isExpand = flag;
  144. if (_isExpand)
  145. {
  146. CellNode.L_VBoxContainer.L_HBoxContainer.L_ExpandButton.Instance.Icon =
  147. ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Down_png);
  148. }
  149. else
  150. {
  151. CellNode.L_VBoxContainer.L_HBoxContainer.L_ExpandButton.Instance.Icon =
  152. ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Right_png);
  153. }
  154.  
  155. if (_expandPanel != null)
  156. {
  157. _expandPanel.Instance.Visible = _isExpand;
  158. }
  159. }
  160.  
  161. private void CreateExpandPanel(ExcelConfig.ActivityBase activityObject, MarkInfoItem markInfoItem)
  162. {
  163. if (_expandPanel != null)
  164. {
  165. throw new Exception("已经创建过ExpandPanel, 不能重复创建!");
  166. }
  167. _expandPanel = CellNode.UiPanel.S_ExpandPanel.Clone();
  168. _expandPanel.Instance.Visible = _isExpand;
  169. CellNode.L_VBoxContainer.AddChild(_expandPanel);
  170. //公有类型
  171. _altitude = CellNode.UiPanel.CreateNumberBar("Altitude", "初始纵轴高度:");
  172. _vSpeed = CellNode.UiPanel.CreateNumberBar("VSpeed", "初始纵轴速度:");
  173. _altitude.L_NumInput.Instance.MaxValue = 128;
  174. _altitude.L_NumInput.Instance.MinValue = 0;
  175. _altitude.L_NumInput.Instance.Step = 1;
  176. _vSpeed.L_NumInput.Instance.MaxValue = 1000;
  177. _vSpeed.L_NumInput.Instance.MinValue = -1000;
  178. _vSpeed.L_NumInput.Instance.Step = 0.1;
  179. _expandPanel.L_ExpandGrid.AddChild(_altitude);
  180. _expandPanel.L_ExpandGrid.AddChild(_vSpeed);
  181.  
  182. if (markInfoItem != null)
  183. {
  184. if (markInfoItem.Attr == null)
  185. {
  186. //初始高度
  187. if (activityObject.Type == (int)ActivityType.Weapon || activityObject.Type == (int)ActivityType.Prop)
  188. {
  189. _altitude.L_NumInput.Instance.Value = 8;
  190. }
  191. }
  192. else
  193. {
  194. //海拔高度
  195. _altitude.L_NumInput.Instance.Value = markInfoItem.Altitude;
  196. //纵轴速度
  197. _vSpeed.L_NumInput.Instance.Value = markInfoItem.VerticalSpeed;
  198. }
  199. }
  200. if (activityObject.Type == (int)ActivityType.Weapon) //武器类型
  201. {
  202. var numberBar = CellNode.UiPanel.CreateNumberBar("CurrAmmon", "弹夹弹药量:");
  203. var numberBar2 = CellNode.UiPanel.CreateNumberBar("ResidueAmmo", "剩余弹药量:");
  204. _expandPanel.L_ExpandGrid.AddChild(numberBar);
  205. _expandPanel.L_ExpandGrid.AddChild(numberBar2);
  206. _attributeBases = new List<AttributeBase>();
  207. _attributeBases.Add(numberBar.Instance);
  208. _attributeBases.Add(numberBar2.Instance);
  209. if (markInfoItem != null) //初始化数据
  210. {
  211. numberBar.L_NumInput.Instance.MinValue = 0;
  212. numberBar2.L_NumInput.Instance.MinValue = 0;
  213. //武器配置数据
  214. var weapon = Weapon.GetWeaponAttribute(activityObject.Id);
  215. if (weapon != null)
  216. {
  217. numberBar.L_NumInput.Instance.MaxValue = weapon.AmmoCapacity; //弹夹上限
  218. numberBar2.L_NumInput.Instance.MaxValue = weapon.MaxAmmoCapacity; //容量上限
  219. }
  220.  
  221. if (markInfoItem.Attr != null)
  222. {
  223. if (markInfoItem.Attr.TryGetValue("CurrAmmon", out var currAmmon)) //弹夹弹药量
  224. {
  225. numberBar.L_NumInput.Instance.Value = float.Parse(currAmmon);
  226. }
  227. if (markInfoItem.Attr.TryGetValue("ResidueAmmo", out var residueAmmo)) //剩余弹药量
  228. {
  229. numberBar2.L_NumInput.Instance.Value = float.Parse(residueAmmo);
  230. }
  231. }
  232. else
  233. {
  234. numberBar.L_NumInput.Instance.Value = numberBar.L_NumInput.Instance.MaxValue;
  235. numberBar2.L_NumInput.Instance.Value = (int)(numberBar2.L_NumInput.Instance.MaxValue / 2);
  236. }
  237. }
  238. }
  239. else if (activityObject.Type == (int)ActivityType.Enemy) //敌人
  240. {
  241. var faceBar = CellNode.UiPanel.CreateOptionBar("Face", "脸朝向:");
  242. faceBar.Instance.AddItem("随机", 0);
  243. faceBar.Instance.AddItem("左", (int)FaceDirection.Left);
  244. faceBar.Instance.AddItem("右", (int)FaceDirection.Right);
  245. var weaponBar = CellNode.UiPanel.CreateObjectBar("Weapon", "携带武器:", ActivityType.Weapon);
  246. var numberBar2 = CellNode.UiPanel.CreateNumberBar("CurrAmmon", "弹夹弹药量:");
  247. var numberBar3 = CellNode.UiPanel.CreateNumberBar("ResidueAmmo", "剩余弹药量:");
  248. weaponBar.Instance.SetRelevancyAttr(numberBar2, numberBar3);
  249. _expandPanel.L_ExpandGrid.AddChild(faceBar);
  250. _expandPanel.L_ExpandGrid.AddChild(weaponBar);
  251. _expandPanel.L_ExpandGrid.AddChild(numberBar2);
  252. _expandPanel.L_ExpandGrid.AddChild(numberBar3);
  253. _attributeBases = new List<AttributeBase>();
  254. _attributeBases.Add(faceBar.Instance);
  255. _attributeBases.Add(weaponBar.Instance);
  256. _attributeBases.Add(numberBar2.Instance);
  257. _attributeBases.Add(numberBar3.Instance);
  258. if (markInfoItem != null) //初始化数据
  259. {
  260. numberBar2.L_NumInput.Instance.MinValue = 0;
  261. numberBar3.L_NumInput.Instance.MinValue = 0;
  262. if (markInfoItem.Attr != null)
  263. {
  264. if (markInfoItem.Attr.TryGetValue("Face", out var face)) //朝向
  265. {
  266. faceBar.Instance.SetSelectItem(int.Parse(face));
  267. }
  268. if (markInfoItem.Attr.TryGetValue("Weapon", out var weaponId)) //武器
  269. {
  270. weaponBar.Instance.SelectWeapon(Weapon.GetWeaponAttribute(weaponId));
  271. }
  272. if (markInfoItem.Attr.TryGetValue("CurrAmmon", out var currAmmon)) //弹夹弹药量
  273. {
  274. numberBar2.L_NumInput.Instance.Value = float.Parse(currAmmon);
  275. }
  276. if (markInfoItem.Attr.TryGetValue("ResidueAmmo", out var residueAmmo)) //剩余弹药量
  277. {
  278. numberBar3.L_NumInput.Instance.Value = float.Parse(residueAmmo);
  279. }
  280. }
  281. else
  282. {
  283. faceBar.Instance.SetSelectItem(0);
  284. numberBar2.L_NumInput.Instance.Value = numberBar2.L_NumInput.Instance.MaxValue;
  285. numberBar3.L_NumInput.Instance.Value = (int)(numberBar3.L_NumInput.Instance.MaxValue / 2);
  286. }
  287. }
  288. }
  289. }
  290. }