CardPanelManager.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using FSEvent;
  6. using FSBattle;
  7. using FSCard;
  8. public class CardPanelManager : MonoBehaviour {
  9. public Transform cardPanel;
  10. public GameObject cardPrefab;
  11. // 牌比较区中的牌间距
  12. private int spaceX = 80;
  13. private int spaceY = 120;
  14. // 牌缩小的值
  15. private float cardScale = 0.6f;
  16. // Use this for initialization
  17. void Start () {
  18. InitEvents();
  19. }
  20. // Update is called once per frame
  21. void Update () {
  22. }
  23. private void OnDestroy() {
  24. RemoveEvents();
  25. }
  26. /*
  27. * 注册监听事件
  28. */
  29. private void InitEvents() {
  30. print("Card Panel 注册事件 ... ");
  31. EventListener.Instance.RegisterEvent(EventEnum.EVENT_PLAYER_SHUFFLING_CARD, ShufflingCard);
  32. EventListener.Instance.RegisterEvent(EventEnum.EVENT_CLEAR_HAND_CARDS, ClearHandCards);
  33. EventListener.Instance.RegisterEvent(EventEnum.EVENT_CLEAR_COMPAIRE_CARDS, ClearCompaireCards);
  34. EventListener.Instance.RegisterEvent(EventEnum.EVENT_REMOVE_TARGET_CARD, RemoveTargetCard);
  35. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENEMY_DEAL_CARD, EnemyDealCard);
  36. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ARMY_DEAL_CARD, ArmyDealCard);
  37. }
  38. /*
  39. * 移除监听事件
  40. */
  41. private void RemoveEvents() {
  42. EventListener.Instance.RemoveEvent(EventEnum.EVENT_PLAYER_SHUFFLING_CARD);
  43. EventListener.Instance.RemoveEvent(EventEnum.EVENT_CLEAR_HAND_CARDS);
  44. EventListener.Instance.RemoveEvent(EventEnum.EVENT_CLEAR_COMPAIRE_CARDS);
  45. EventListener.Instance.RemoveEvent(EventEnum.EVENT_REMOVE_TARGET_CARD);
  46. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENEMY_DEAL_CARD);
  47. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ARMY_DEAL_CARD);
  48. }
  49. /*
  50. * 发牌
  51. */
  52. private void ShufflingCard() {
  53. // 如果手牌小于5,则
  54. if (BattleFieldManager.Instance.ArmyHandCards.Count < 5 &&
  55. BattleFieldManager.Instance.EnemyHandCards.Count < 5) {
  56. AddPlayerCard();
  57. AddEnemyCard();
  58. Invoke("ShufflingCard", 1.0f);
  59. } else {
  60. Invoke("NoticeEnemyDeal", 2.0f);
  61. }
  62. }
  63. /*
  64. * 通知可以进入敌人出牌的回合了
  65. */
  66. private void NoticeEnemyDeal() {
  67. EventListener.Instance.PostEvent(EventEnum.EVENT_ENTER_ENEMY_DEAL_ROUND);
  68. }
  69. /*
  70. * 添加卡牌
  71. */
  72. public void AddPlayerCard() {
  73. // 保证卡池中有牌
  74. if (BattleFieldManager.Instance.ArmyTakePool.Count > 0) {
  75. // 从卡池中取出一张牌放入手牌中
  76. Transform cardTrs = (Transform)BattleFieldManager.Instance.ArmyTakePool[0];
  77. // 加入手牌
  78. BattleFieldManager.Instance.ArmyHandCards.Add(cardTrs);
  79. // 从卡池中移除
  80. BattleFieldManager.Instance.ArmyTakePool.Remove(cardTrs);
  81. cardTrs.SetParent(cardPanel, false);
  82. // 添加卡片事件组件,如果没有,则添加事件
  83. CardAction action = cardTrs.GetComponent<CardAction>();
  84. if (action == null){
  85. cardTrs.gameObject.AddComponent<CardAction>();
  86. }
  87. // 通知修改
  88. Dictionary<string, object> info = new Dictionary<string, object>();
  89. info.Add("index", 0);
  90. info.Add("num", BattleFieldManager.Instance.ArmyTakePool.Count);
  91. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  92. } else {
  93. // 如果卡池中没有牌了,将弃牌区的卡全部放回卡池
  94. foreach(Transform cardTrs in BattleFieldManager.Instance.ArmyThrowPool) {
  95. BattleFieldManager.Instance.ArmyTakePool.Add(cardTrs);
  96. }
  97. BattleFieldManager.Instance.ArmyThrowPool.Clear();
  98. // 更新牌池数量显示
  99. Dictionary<string, object> info = new Dictionary<string, object>();
  100. info.Add("index", 0);
  101. info.Add("num", BattleFieldManager.Instance.ArmyThrowPool.Count);
  102. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  103. info["index"] = 1;
  104. info["num"] = 0;
  105. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  106. }
  107. ArrangePlayerCards();
  108. }
  109. /*
  110. * 添加敌人卡牌
  111. */
  112. private void AddEnemyCard() {
  113. // 获取位置
  114. int index = BattleFieldManager.Instance.EnemyHandCards.Count;
  115. // 从卡池中获取卡片
  116. if (BattleFieldManager.Instance.EnemyTakePool.Count > 0) {
  117. // 从卡池取出手牌
  118. Transform cardTrs = (Transform)BattleFieldManager.Instance.EnemyTakePool[0];
  119. // 加入手牌
  120. BattleFieldManager.Instance.EnemyHandCards.Add(cardTrs);
  121. // 从卡池中移除
  122. BattleFieldManager.Instance.EnemyTakePool.Remove(cardTrs);
  123. cardTrs.SetParent(cardPanel);
  124. cardTrs.localScale = new Vector3(cardScale, cardScale, 1);
  125. cardTrs.localPosition = new Vector3(Screen.width / 2, Screen.height / 2 + index * 30, 0);
  126. // 如果有卡片事件组件,如果有则将事件移除
  127. //CardAction action = cardTrs.GetComponent<CardAction>();
  128. //if (action != null) {
  129. // Object.Destroy(action);
  130. //}
  131. } else {
  132. // 如果卡池中没有牌了,将弃牌区的卡全部放回卡池
  133. foreach(Transform cardTrs in BattleFieldManager.Instance.EnemyThrowPool) {
  134. BattleFieldManager.Instance.EnemyTakePool.Add(cardTrs);
  135. }
  136. BattleFieldManager.Instance.EnemyThrowPool.Clear();
  137. }
  138. }
  139. /*
  140. * 重新排列卡牌
  141. */
  142. private void ArrangePlayerCards() {
  143. // 空隙
  144. float space = 50;
  145. // 配置的半径
  146. float radius = 400;
  147. // 获取偏移的角度
  148. float angle = Mathf.Atan(space / radius) * 180 / Mathf.PI;
  149. // 遍历数组
  150. for (int i = 0; i < BattleFieldManager.Instance.ArmyHandCards.Count; i++) {
  151. // 重定义位置
  152. float loc = i - (float)(BattleFieldManager.Instance.ArmyHandCards.Count - 1) / 2;
  153. Transform cardTransform = (Transform)BattleFieldManager.Instance.ArmyHandCards[i];
  154. // 设置位置
  155. cardTransform.localPosition = new Vector3(loc * space, 0, 0);
  156. CardAction action = cardTransform.GetComponent<CardAction>();
  157. action.StartPos = cardTransform.position;
  158. // 设置角度
  159. cardTransform.localRotation = Quaternion.Euler(0, 0, angle * (loc * -1));
  160. float scale = 1 - (Mathf.Abs(loc) / 5);
  161. cardTransform.localScale = new Vector3(scale, scale, 1);
  162. }
  163. }
  164. /*
  165. * 玩家出牌,由外部通知进行处理
  166. */
  167. private void ArmyDealCard(Dictionary<string, object> info) {
  168. print("我的牌出了 ... ");
  169. int originX = Screen.width / 2 - spaceX / 2 - 30;
  170. int originY = Screen.height / 2 + 50;
  171. Transform cardTrs = (Transform)info["card"];
  172. // 将传入的牌从手牌数组中移,再加入到比较牌数组中
  173. BattleFieldManager.Instance.ArmyHandCards.Remove(cardTrs);
  174. BattleFieldManager.Instance.ArmyCpArray.Add(cardTrs);
  175. // 放置位置
  176. int line = (BattleFieldManager.Instance.ArmyCpArray.Count - 1) / 3;
  177. int row = (BattleFieldManager.Instance.ArmyCpArray.Count - 1) % 3;
  178. cardTrs.position = new Vector3(originX - row * spaceX, originY - line * spaceY);
  179. cardTrs.localScale = new Vector3(cardScale, cardScale, 1);
  180. cardTrs.localRotation = Quaternion.Euler(0, 0, 0);
  181. // 重新排列
  182. ArrangePlayerCards();
  183. }
  184. /*
  185. * 敌人出牌
  186. */
  187. private void EnemyDealCard() {
  188. // 敌人出牌
  189. print("敌人出牌 ... ");
  190. int index = 0;
  191. int originX = Screen.width / 2 + spaceX / 2 + 30;
  192. int originY = Screen.height / 2 + 50;
  193. // 从数组中选出几张牌放入卡牌管理器的选择数组中
  194. while (BattleFieldManager.Instance.EnemyHandCards.Count > 0) {
  195. Transform cardTrs = (Transform)BattleFieldManager.Instance.EnemyHandCards[0];
  196. // 将此卡牌放入选择数组中
  197. BattleFieldManager.Instance.EnemyCpArray.Add(cardTrs);
  198. BattleFieldManager.Instance.EnemyHandCards.Remove(cardTrs);
  199. // 移动位置
  200. int line = index / 3;
  201. int row = index % 3;
  202. cardTrs.position = new Vector3(originX + row * spaceX, originY - line * spaceY);
  203. index++;
  204. }
  205. Invoke("NotifyPlayerDeal", 0.2f);
  206. }
  207. /*
  208. * 通知玩家出牌
  209. */
  210. private void NotifyPlayerDeal() {
  211. EventListener.Instance.PostEvent(EventEnum.EVENT_ENTER_PLAYER_DEAL_ROUND);
  212. }
  213. /*
  214. * 移除指定的卡片
  215. */
  216. private void RemoveTargetCard(Dictionary<string, object> info) {
  217. // 首先获取卡片
  218. Transform card = (Transform)info["card"];
  219. // 从视图和数组中
  220. Destroy(card.gameObject);
  221. BattleFieldManager.Instance.ArmyHandCards.Remove(card);
  222. // 重新排列
  223. ArrangePlayerCards();
  224. }
  225. /*
  226. * 清理手牌
  227. */
  228. private void ClearHandCards() {
  229. // 清理我方手牌
  230. while (BattleFieldManager.Instance.ArmyHandCards.Count > 0) {
  231. Transform cardTrs = (Transform)BattleFieldManager.Instance.ArmyHandCards[0];
  232. // 首先将卡片从数组移除,计入弃牌数组
  233. BattleFieldManager.Instance.ArmyHandCards.Remove(cardTrs);
  234. BattleFieldManager.Instance.ArmyThrowPool.Add(cardTrs);
  235. Dictionary<string, object> info = new Dictionary<string, object>();
  236. info.Add("card", cardTrs);
  237. info.Add("num", BattleFieldManager.Instance.ArmyThrowPool.Count);
  238. info.Add("index", 1);
  239. EventListener.Instance.PostEvent(EventEnum.EVENT_ERASE_CARD, info);
  240. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  241. }
  242. // 清理敌方手牌
  243. while (BattleFieldManager.Instance.EnemyHandCards.Count > 0) {
  244. Transform cardTrs = (Transform)BattleFieldManager.Instance.EnemyHandCards[0];
  245. // 将卡片从数组移除,放入弃牌卡组中
  246. BattleFieldManager.Instance.EnemyHandCards.Remove(cardTrs);
  247. BattleFieldManager.Instance.ArmyThrowPool.Add(cardTrs);
  248. // 通知更新位置
  249. Dictionary<string, object> info = new Dictionary<string, object>();
  250. info.Add("card", cardTrs);
  251. info.Add("num", BattleFieldManager.Instance.ArmyThrowPool.Count);
  252. info.Add("index", 1);
  253. EventListener.Instance.PostEvent(EventEnum.EVENT_ERASE_CARD, info);
  254. }
  255. EventListener.Instance.PostEvent(EventEnum.EVENT_ENTER_PLAY_A_HAND_ROUND);
  256. }
  257. /*
  258. * 清理比较牌
  259. */
  260. private void ClearCompaireCards() {
  261. // 清理我方比较牌
  262. while (BattleFieldManager.Instance.ArmyCpArray.Count > 0) {
  263. Transform cardTrs = (Transform)BattleFieldManager.Instance.ArmyCpArray[0];
  264. // 将卡片从数组移除,加入弃牌数组
  265. BattleFieldManager.Instance.ArmyCpArray.Remove(cardTrs);
  266. BattleFieldManager.Instance.ArmyThrowPool.Add(cardTrs);
  267. Dictionary<string, object> info = new Dictionary<string, object>();
  268. info.Add("card", cardTrs);
  269. info.Add("num", BattleFieldManager.Instance.ArmyThrowPool.Count);
  270. info.Add("index", 1);
  271. EventListener.Instance.PostEvent(EventEnum.EVENT_ERASE_CARD, info);
  272. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  273. }
  274. // 清理敌方比较牌
  275. while (BattleFieldManager.Instance.EnemyCpArray.Count > 0) {
  276. Transform cardTrs = (Transform)BattleFieldManager.Instance.EnemyCpArray[0];
  277. // 将卡片从数组移除,放入弃牌卡组中
  278. BattleFieldManager.Instance.EnemyCpArray.Remove(cardTrs);
  279. BattleFieldManager.Instance.EnemyThrowPool.Add(cardTrs);
  280. // 通知更新位置
  281. Dictionary<string, object> info = new Dictionary<string, object>();
  282. info.Add("card", cardTrs);
  283. info.Add("num", BattleFieldManager.Instance.EnemyThrowPool.Count);
  284. info.Add("index", 1);
  285. EventListener.Instance.PostEvent(EventEnum.EVENT_ERASE_CARD, info);
  286. }
  287. }
  288. }