using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; using System; using DG.Tweening; namespace vnxbqy.UI { public class WishingPoolWin : Window { [SerializeField] DragItem dragItem; [SerializeField] Text activityDayText; [SerializeField] Text totalDayText; [SerializeField] Text dayRemainTime; [SerializeField] Button lookAllBtn; [SerializeField] Button freeRefreshWishBtn; [SerializeField] Button moneyRefreshWishBtn; [SerializeField] Text moneyValueText; [SerializeField] Text freeWishCoolText; [SerializeField] List poolItemCells = new List(); [SerializeField] List wishingCells = new List(); [SerializeField] GameObject activityOpenObj; [SerializeField] GameObject activityCloseObj; [SerializeField] GameObject maskObj; [Header("动画控制")] [SerializeField] RectTransform handImg; [SerializeField] CanvasGroup handAlpha; [SerializeField] List startPos = new List(); [SerializeField] List endPos = new List(); [Header("最小时间间隔")] [SerializeField] float minDuration = 1.5f; [Header("最大时间间隔")] [SerializeField] float maxDuration = 2.5f; [Header("渐隐渐显时间")] [SerializeField] float alphaDuration = 0.5f; WishingPoolModel wishingModel { get { return ModelCenter.Instance.GetModel(); } } OperationWishingWellInfo operation = null; int playTimes = 0; #region Built-in protected override void BindController() { } protected override void AddListeners() { freeRefreshWishBtn.AddListener(ClickFreeRefreshWish); moneyRefreshWishBtn.AddListener(ClickMoneyRefreshWish); lookAllBtn.AddListener(ClickLook); } protected override void OnPreOpen() { Display(); OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent; wishingModel.UpdatePoolDataEvent += UpdatePoolItemByIndex; wishingModel.UpdateWishingDataEvent += UpdateWishItemByIndex; GlobalTimeEvent.Instance.secondEvent += UpdateSecond; wishingModel.UpdateHandMoveEvent += UpdateHandMove; } protected override void OnAfterOpen() { } protected override void OnPreClose() { wishingModel.UpdatePoolDataEvent -= UpdatePoolItemByIndex; wishingModel.UpdateWishingDataEvent -= UpdateWishItemByIndex; GlobalTimeEvent.Instance.secondEvent -= UpdateSecond; OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent; wishingModel.UpdateHandMoveEvent -= UpdateHandMove; } protected override void OnAfterClose() { } #endregion private void Display() { operation = wishingModel.GetOperationWishing(); if (operation == null) return; UpdatePoolItem(); for (int i = 0; i < wishingCells.Count; i++) { UpdateWishItemByIndex(i); } dragItem.dragItemRect.SetActive(false); UpdateFreeWishCool(); UpdateActivityState(); UpdateDayRemainTime(); activityDayText.text = Language.Get("WishingPool103", operation.GetActivityDay()); totalDayText.text = Language.Get("WishingPool101", Language.Get(StringUtility.Contact("Num_CHS_", operation.GetActivitySumDay()))); handImg.SetActive(false); playTimes = 0; handAlpha.DOKill(); handImg.DOKill(); wishingModel.isClick = true; maskObj.SetActive(false); } private void UpdateHandMove() { PlayHandMovePos(); } private void PlayHandMovePos() { maskObj.SetActive(true); playTimes = 0; handAlpha.DORestart(); handImg.DORestart(); PlayAlphaTween(true); } private void PlayPosTween() { playTimes += 1; Vector2 pos = endPos[wishingModel.handEndIndex]; float offset = (float)Mathf.Abs(wishingModel.handStartIndex % 4 - wishingModel.handEndIndex) / 2; if (offset < minDuration) { offset = minDuration; } else if (offset > maxDuration) { offset = maxDuration; } handImg.DOAnchorPos(pos, offset).OnComplete(()=> { PlayAlphaTween(false); }); } private void PlayAlphaTween(bool isStart) { if (isStart) { handImg.anchoredPosition = startPos[wishingModel.handStartIndex]; handImg.SetActive(true); handAlpha.alpha = 0; handAlpha.DOFade(1, alphaDuration).OnComplete(() => { PlayPosTween(); }); } else { handAlpha.alpha = 1; handAlpha.DOFade(0, alphaDuration).OnComplete(() => { if (playTimes < 2) { PlayAlphaTween(true); } else { maskObj.SetActive(false); handImg.SetActive(false); wishingModel.isClick = true; } }); } } #region 许愿逻辑 protected override void LateUpdate() { if(wishingModel.isDraging) { if(TryGetDragItem()) { Vector2 _pos; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(this.transform as RectTransform, Input.mousePosition, CameraManager.uiCamera, out _pos)) { dragItem.dragItemRect.anchoredPosition3D = _pos; } if (Input.GetMouseButtonUp(0)) { dragItem.dragItemRect.SetActive(false); CheckWishingCell(); wishingModel.ResetDragData(); } } } } private void CheckWishingCell() { bool isAddWish = false; for(int i = 0; i < wishingCells.Count; i++) { var rect = wishingCells[i].transform as RectTransform; var des = RectTransformUtility.CalculateRelativeRectTransformBounds(this.transform, rect); var src = RectTransformUtility.CalculateRelativeRectTransformBounds(this.transform, dragItem.dragItemRect); var dis = Vector3.Distance(des.center, src.center); if (dis < rect.rect.width / 2) { //WishingPoolModel.WishingWellItem wellPoolItem = null; //bool isPoolData = wishingModel.TryGetPoolDataByIndex(wishingModel.dragIndex, out wellPoolItem); //WishingPoolModel.WishingWellItem wellWishItem = null; //bool isWishData = wishingModel.TryGetWishDataByIndex(i, out wellWishItem); //if (wellWishItem.itemId == 0) //{ // wishingModel.RemovetWishingPoolData(i); //} //else //{ // wishingModel.SetWishingPoolData(wishingModel.dragIndex,wellWishItem); //} //wishingModel.SetWishingData(i,wellPoolItem); isAddWish = true; wishingModel.SendRefreshWishInfo(wishingModel.dragIndex,i); break; } } if(!isAddWish) { UpdatePoolItem(); } } private bool TryGetDragItem() { WishingPoolModel.WishingWellItem wellItem = null; bool isPoolData = wishingModel.TryGetPoolDataByIndex(wishingModel.dragIndex, out wellItem); if (isPoolData) { dragItem.dragItemRect.SetActive(true); string rareIconKey = string.Empty; bool isRare = wishingModel.TryGetItemRareIcon(wellItem.rare, out rareIconKey); dragItem.dragBestIcon.SetActive(isRare); if (isRare) { dragItem.dragBestIcon.SetSprite(rareIconKey); } ItemCellModel cellModel = new ItemCellModel(wellItem.itemId,false,(ulong)wellItem.itemCount); dragItem.dragItemBasic.Init(cellModel); poolItemCells[wishingModel.dragIndex].SetActive(false); } else { dragItem.dragItemRect.SetActive(false); } return isPoolData; } private void UpdatePoolItem() { for (int i = 0; i < poolItemCells.Count; i++) { UpdatePoolItemByIndex(i); } } private void UpdatePoolItemByIndex(int index) { WishingPoolModel.WishingWellItem wellItem = null; var poolItemCell = poolItemCells[index]; bool isPoolData = wishingModel.TryGetPoolDataByIndex(index, out wellItem); if (isPoolData) { poolItemCell.SetActive(true); poolItemCell.Display(index); } else { poolItemCell.SetActive(false); } } private void UpdateWishItemByIndex(int index) { var wishCell = wishingCells[index]; wishCell.Display(index); } [Serializable] public class DragItem { public RectTransform dragItemRect; public CommonItemBaisc dragItemBasic; public Image dragBestIcon; } #endregion #region 活动逻辑 private void OperationEndEvent(Operation type, int state) { if(type == Operation.WishingWellInfo && state == 0) { UpdateActivityState(); } } private void UpdateSecond() { if (operation == null) return; UpdateFreeWishCool(); UpdateDayRemainTime(); } private void UpdateDayRemainTime() { dayRemainTime.text = Language.Get("WishingPool104", TimeUtility.SecondsToHMS(operation.GetResetSurplusTime())); } private void UpdateFreeWishCool() { int second = 0; bool isCool = wishingModel.TryGetFreeWishCoolTime(out second); if (isCool) { freeRefreshWishBtn.SetActive(false); freeWishCoolText.SetActive(true); moneyRefreshWishBtn.SetActive(true); moneyValueText.text = wishingModel.wishingPrice.ToString(); freeWishCoolText.text = Language.Get("WishingPool102", TimeUtility.SecondsToHMS(second)); } else { freeRefreshWishBtn.SetActive(true); freeWishCoolText.SetActive(false); moneyRefreshWishBtn.SetActive(false); } } private void UpdateActivityState() { if (wishingModel.IsOpen) { activityOpenObj.SetActive(true); activityCloseObj.SetActive(false); } else { activityOpenObj.SetActive(false); activityCloseObj.SetActive(true); } } private void ClickLook() { WindowCenter.Instance.Open(); } private void ClickMoneyRefreshWish() { if(!wishingModel.IsBestItem()) { CheckMoney(); } else { ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("WishingPool106", wishingModel.wishingPrice), (bool isOk) => { if (isOk) { CheckMoney(); } }); } } private void CheckMoney() { if ((int)UIHelper.GetMoneyCnt(1) < wishingModel.wishingPrice) { WindowCenter.Instance.Open(); } else { if (wishingModel.isOpenPrompting) { ConfirmCancel.ToggleConfirmCancel(Language.Get("Mail101"), Language.Get("WishingPool105", wishingModel.wishingPrice), Language.Get("ConfirmCancel101"), (bool isOk, bool isToggle) => { if (isOk) { wishingModel.SendRefreshPoolInfo(0); wishingModel.isOpenPrompting = !isToggle; } }); } else { wishingModel.SendRefreshPoolInfo(0); } } } private void ClickFreeRefreshWish() { if (!wishingModel.IsBestItem()) { wishingModel.SendRefreshPoolInfo(1); } else { ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("WishingPool106"), (bool isOk) => { if (isOk) { wishingModel.SendRefreshPoolInfo(1); } }); } } #endregion } }