//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Monday, April 09, 2018 //-------------------------------------------------------- using UnityEngine; using System.Collections; using UnityEngine.UI; using System; using System.Collections.Generic; using TableConfig; namespace Snxxz.UI { public class TreasureCyclicScroll : CyclicScroll { const float fadeOutTime = 0.3f; const float relocationTime = 0.4f; AchievementGroup showData; TreasureAchievement showAchievementBehaviour; bool m_Showing = false; public bool showing { get { return m_Showing; } private set { m_Showing = value; } } List achievementGroups; AchievementModel achievementModel { get { return ModelCenter.Instance.GetModel(); } } public void ShowTreasures(List _achievementGroups, bool _stepByStep) { achievementGroups = _achievementGroups; for (int i = 0; i < achievementGroups.Count; i++) { Achievement doingAchievement; if (!achievementModel.TryGetAchievement(achievementGroups[i].GetDoingAchievement(), out doingAchievement)) { achievementGroups.RemoveAt(i); i--; } } _achievementGroups.Sort(AchievementGroup.Compare); Init(_achievementGroups, _stepByStep); } public override void Init(List _datas, bool _stepByStep = false) { for (int i = 0; i < infiniteItems.Count; i++) { var item = infiniteItems[i] as TreasureAchievement; item.alphaTween.SetStartState(); item.linerMove.Stop(); } showing = false; base.Init(_datas, _stepByStep); showing = true; this.enabled = false; Clock.Create(DateTime.Now + new TimeSpan((long)(0.5f * TimeSpan.TicksPerSecond)), OnUnfoldShowEnd); } private void OnUnfoldShowEnd() { showing = false; this.enabled = true; } public void ShowBegin(TreasureAchievement _showItem) { this.enabled = false; showing = true; showAchievementBehaviour = _showItem; showData = showAchievementBehaviour.achievementGroup; showAchievementBehaviour.alphaTween.from = 1f; showAchievementBehaviour.alphaTween.to = 0f; showAchievementBehaviour.alphaTween.duration = fadeOutTime; showAchievementBehaviour.alphaTween.SetStartState(); showAchievementBehaviour.alphaTween.Play(); var endTime = DateTime.Now + new TimeSpan((long)(fadeOutTime * TimeSpan.TicksPerSecond)); Clock.Create(endTime, ReLocateItems); } void ReLocateItems() { showAchievementBehaviour.alphaTween.SetStartState(); achievementGroups.Sort(AchievementGroup.Compare); ReLocateAllItems(showAchievementBehaviour); var endTime = DateTime.Now + new TimeSpan((long)(relocationTime * TimeSpan.TicksPerSecond)); Clock.Create(endTime, ShowEnd); } void ShowEnd() { this.enabled = true; showing = false; } private void ReLocateAllItems(ScrollItem _scrollItem) { var index = infiniteItems.IndexOf(_scrollItem); if (index != -1) { var showBehaviour = _scrollItem as TreasureAchievement; var lastItem = infiniteItems[infiniteItems.Count - 1]; showBehaviour.rectTransform.anchoredPosition = lastItem.rectTransform.anchoredPosition.SetY(lastItem.rectTransform.anchoredPosition.y - cellSize.y - spacing.y); showBehaviour.gameObject.SetActive(false); infiniteItems.Remove(_scrollItem); infiniteItems.Add(_scrollItem); for (int i = 0; i < infiniteItems.Count; i++) { var item = infiniteItems[i] as TreasureAchievement; if (item != null && preIndex + i < datas.Count) { item.Display(datas[preIndex + i]); } } for (int i = index; i < infiniteItems.Count; i++) { var item = infiniteItems[i]; var achievementBehaviour = item as TreasureAchievement; achievementBehaviour.linerMove.from = achievementBehaviour.rectTransform.anchoredPosition; var toY = achievementBehaviour.rectTransform.anchoredPosition.y + cellSize.y + spacing.y; achievementBehaviour.linerMove.to = achievementBehaviour.rectTransform.anchoredPosition.SetY(toY); achievementBehaviour.linerMove.duration = relocationTime; if (achievementBehaviour.linerMove.gameObject.activeInHierarchy) { achievementBehaviour.linerMove.Begin(); } else { achievementBehaviour.linerMove.Stop(); } } } } public bool TryGetTreasureAchievement(int _id, out TreasureAchievement _achievement) { _achievement = null; if (infiniteItems == null) { return false; } var _index = infiniteItems.FindIndex((x) => { var _behaviour = x as TreasureAchievement; if (_behaviour == null || _behaviour.achievementGroup == null) { return false; } return _behaviour.achievementGroup.Contain(_id); }); _achievement = _index == -1 ? null : infiniteItems[_index] as TreasureAchievement; return _index != -1; } public void ResetScrollItemName() { for (int i = 0; i < infiniteItems.Count; i++) { infiniteItems[i].name = string.Format("Achievement_{0}", i); } } } }