using System.Collections; using UnityEngine; using UI.LuckyBox; using System.Collections.Generic; using FairyGUI; using System.Threading; using System.Threading.Tasks; using System; namespace GFGGame { public class LuckyBoxStarView : BaseWindow { private UI_LuckyBoxStarUI _ui; private List comStars = new List(); private List clickComStars = new List(); private List notClickComStars = new List(); // private List _gameObjects = new List(); // private List _wrappers = new List(); // private List _gameObjects1 = new List(); // private List _wrappers1 = new List(); private Dictionary> dicGameobj = new Dictionary>(); private Dictionary> dicWraper = new Dictionary>(); private GObject curComStar;//当前选中的星星 private Vector2 lastPos;//鼠标的上一个位置,每颗星星初始时默认为Vector2.right; private List _rewardList; private const int checkDistance = 40;//鼠标靠近星星周围加减40都算选中星星 private const int imgLineWidth = 10;//线的原始长度 private bool showGuide = false; public override void Dispose() { if (_ui != null) { _ui.Dispose(); _ui = null; } base.Dispose(); } protected override void OnHide() { int index = 0; GObject star = _ui.target.GetChild(string.Format("comStar{0}_{1}_{2}", _ui.m_ctrlBuyType.selectedIndex, _ui.m_ctrlRewardsType.selectedIndex, index)); while (star != null && star.visible == true) { UI_ComStar comStar = UI_ComStar.Proxy(star); for (int i = comStar.target.numChildren - 1; i >= 0; i--) { if (comStar.target.GetChildAt(i).name == "imgLine") continue; comStar.target.RemoveChildAt(i); } index++; star = _ui.target.GetChild(string.Format("comStar{0}_{1}_{2}", _ui.m_ctrlBuyType.selectedIndex, _ui.m_ctrlRewardsType.selectedIndex, index)); UI_ComStar.ProxyEnd(); } foreach (int key in dicGameobj.Keys) { List value = dicGameobj[key]; List wrappersValue = dicWraper[key]; for (int i = 0; i < value.Count; i++) { SceneController.DestroyObjectFromView(value[i], wrappersValue[i]); } } notClickComStars.Clear(); clickComStars.Clear(); dicGameobj.Clear(); dicWraper.Clear(); Timers.inst.Remove(CheckGuide); } protected override void OnInit() { base.OnInit(); _ui = UI_LuckyBoxStarUI.Create(); this.viewCom = _ui.target; isfullScreen = true; _ui.m_btnBack.visible = false; _ui.m_btnBack.onClick.Add(OnClickBtnBack); } protected override void OnShown() { base.OnShown(); _ui.target.onTouchBegin.Add(OnClickUIBegin); _ui.target.onTouchMove.Add(OnClickUIMove); _ui.target.onTouchEnd.Add(OnClickUIEnd); _ui.m_effEnd.visible = false; _rewardList = LuckyBoxDataManager.Instance.RewardList; _ui.m_ctrlBuyType.selectedIndex = _rewardList != null && _rewardList.Count > 1 ? 1 : 0; bool isLuckyBox = LuckyBoxDataManager.Instance.luckyBoxIds.IndexOf(LuckyBoxDataManager.Instance.currentBoxId) >= 0; _ui.m_ctrlRewardsType.selectedIndex = isLuckyBox ? (LuckyBoxDataManager.Instance.currentBoxId - 1) : 0; string resPath = string.Format("cj_tp_{0}", isLuckyBox ? LuckyBoxDataManager.Instance.currentBoxId : 1); _ui.m_bg.url = ResPathUtil.GetBgImgPath(resPath); ResetStartView(); Timers.inst.AddUpdate(CheckGuide); } private void ResetStartView() { showGuide = GuideDataManager.IsGuideFinish(ConstGuideId.LUCKY_BOX_LINE) <= 0; curComStar = null; comStars.Clear(); int index = 0; GObject star = _ui.target.GetChild(string.Format("comStar{0}_{1}_{2}", _ui.m_ctrlBuyType.selectedIndex, _ui.m_ctrlRewardsType.selectedIndex, index)); while (star != null && star.visible == true) { UI_ComStar comStar = UI_ComStar.Proxy(star); comStar.m_imgLine.visible = true; comStar.m_c1.selectedIndex = 0; comStar.m_imgLine.width = imgLineWidth; comStar.m_imgLine.rotation = 0; GComponent gcom = CreateEffect(comStar, 1, "ui_ck"); ; gcom.visible = true; comStar.target.AddChildAt(gcom, 1); GComponent gcom1 = CreateEffect(comStar, 2, "ui_ck_dj"); gcom1.visible = false; comStar.target.AddChildAt(gcom1, 2); GComponent gcom2 = CreateEffect(comStar, 3, "ui_ck_xs"); gcom2.visible = false; comStar.target.AddChildAt(gcom2, 3); GComponent gcom3 = CreateEffect(comStar, 4, "ui_ck_dj_2"); gcom3.visible = false; comStar.target.AddChildAt(gcom3, 4); star.data = new Vector2(comStar.target.x, comStar.target.y); comStars.Add(star); index++; star = _ui.target.GetChild(string.Format("comStar{0}_{1}_{2}", _ui.m_ctrlBuyType.selectedIndex, _ui.m_ctrlRewardsType.selectedIndex, index)); UI_ComStar.ProxyEnd(); } } private GComponent CreateEffect(UI_ComStar comStar, int index, string name) { GComponent gcom; if (comStar.target.numChildren > index) { gcom = comStar.target.GetChildAt(index).asCom; } else { gcom = UIPackage.CreateObject("LuckyBox", "ComHolder").asCom; string resPath = ResPathUtil.GetViewEffectPath("ui_ck", name); SceneController.AddObjectToView(null, null, gcom.GetChild("holder").asGraph, resPath, out GameObject gameObject, out GoWrapper wrapper); if (!dicGameobj.ContainsKey(index)) { dicGameobj.Add(index, new List()); dicWraper.Add(index, new List()); } dicGameobj[index].Add(gameObject); dicWraper[index].Add(wrapper); } return gcom; } private void OnClickUIBegin(EventContext context) { context.CaptureTouch(); InputEvent inputEvent = (InputEvent)context.data; Vector2 mousePos = this.viewCom.GlobalToLocal(new Vector2(inputEvent.x, inputEvent.y)); CheckNearbyPos(mousePos); } private void OnClickUIMove(EventContext context) { InputEvent inputEvent = (InputEvent)context.data; Vector2 mousePos = this.viewCom.GlobalToLocal(new Vector2(inputEvent.x, inputEvent.y)); CheckNearbyPos(mousePos); if (comStars.Count == 0)//所有星星都点亮了主动结束 { this.OnClickUIEnd(); } } //检测鼠标附近的星星 private void CheckNearbyPos(Vector2 mousePos) { for (int i = comStars.Count - 1; i >= 0; i--) { Vector2 comStarPos = (Vector2)comStars[i].data; if (IsSamePos(mousePos, comStarPos)) { if (curComStar != null) { SetCurComStarTransfrom(comStarPos); } UI_ComStar comStar = UI_ComStar.Proxy(comStars[i]); comStar.target.GetChildAt(2).asCom.visible = true; comStar.target.GetChildAt(1).asCom.visible = false; UI_ComStar.ProxyEnd(); // comStar.m_c1.selectedIndex = 1; curComStar = comStars[i]; lastPos = Vector2.right; clickComStars.Add(comStars[i]); comStars.RemoveAt(i); } else { if (curComStar != null) { Vector2 curPos = mousePos - (Vector2)curComStar.data; SetCurComStarTransfrom(mousePos); lastPos = curPos; } } } } private void SetCurComStarTransfrom(Vector2 targetPos) { Vector2 curPos = targetPos - (Vector2)curComStar.data; float angle = Vector3.Angle(lastPos, curPos); //求出两向量之间的夹角 Vector3 normal = Vector3.Cross(lastPos, curPos);//叉乘求出法线向量 angle *= Mathf.Sign(Vector3.Dot(normal, Vector3.forward)); //Mathf.Sign()求符号,Vector3.Dot()求方向,求法线向量与物体上方向向量点乘,结果为1或-1,修正旋转方向 UI_ComStar comStar = UI_ComStar.Proxy(curComStar); comStar.m_imgLine.rotation += angle; comStar.m_imgLine.width = Vector2.Distance(targetPos, (Vector2)curComStar.data); UI_ComStar.ProxyEnd(); } private void OnClickUIEnd() { if (clickComStars.Count <= 0) return; UI_ComStar comStar = UI_ComStar.Proxy(clickComStars[clickComStars.Count - 1]); comStar.m_imgLine.visible = false; UI_ComStar.ProxyEnd(); if (showGuide && clickComStars.Count < 2) { ResetStartView(); } else { CheckNotClickComStar(); SetComStarDarken(); RemoveListener(); Timers.inst.Add(1f, 1, SetClickComStarAni); } } private void CheckNotClickComStar() { int index = 0; GObject star = _ui.target.GetChild(string.Format("comStar{0}_{1}_{2}", _ui.m_ctrlBuyType.selectedIndex, _ui.m_ctrlRewardsType.selectedIndex, index)); while (star != null && star.visible == true) { if (clickComStars.IndexOf(star) < 0) { notClickComStars.Add(star); } index++; star = _ui.target.GetChild(string.Format("comStar{0}_{1}_{2}", _ui.m_ctrlBuyType.selectedIndex, _ui.m_ctrlRewardsType.selectedIndex, index)); } } private void SetComStarDarken() { for (int i = 0; i < notClickComStars.Count; i++) { UI_ComStar notClickComStar = UI_ComStar.Proxy(notClickComStars[i]); notClickComStar.m_imgLine.visible = false; notClickComStar.target.GetChildAt(3).asCom.visible = true; notClickComStar.target.GetChildAt(1).asCom.visible = false; UI_ComStar.ProxyEnd(); } } private void SetClickComStarAni(object param) { for (int i = 0; i < clickComStars.Count; i++) { UI_ComStar comStar = UI_ComStar.Proxy(clickComStars[i]); comStar.target.GetChildAt(4).asCom.visible = true; UI_ComStar.ProxyEnd(); } Timers.inst.Add(0.5f, 1, SetEndEffect); } private void SetEndEffect(object param) { _ui.m_effEnd.visible = true; _ui.m_effEnd.SetPlaySettings(0, -1, 1, -1); Timers.inst.Add(0.6f, 1, ClickUIEnd); // ClickUIEnd(null); TryCompleteGuide(); } private void ClickUIEnd(object param) { if (curComStar != null) { RemoveListener(); ViewManager.Show(new object[] { _rewardList }); this.Hide(); } } private bool IsSamePos(Vector2 mousePos, Vector2 comStarPos) { return (mousePos.x < comStarPos.x + checkDistance) && (mousePos.x > comStarPos.x - checkDistance) && (mousePos.y < comStarPos.y + checkDistance) && (mousePos.y > comStarPos.y - checkDistance); } private void RemoveListener() { _ui.target.onTouchBegin.Remove(OnClickUIBegin); _ui.target.onTouchMove.Remove(OnClickUIMove); _ui.target.onTouchEnd.Remove(OnClickUIEnd); } private void OnClickBtnBack() { this.Hide(); RemoveListener(); ViewManager.Show(ViewName.LUCKY_BOX_VIEW); } private void CheckGuide(object param) { if (GuideDataManager.IsGuideFinish(ConstGuideId.LUCKY_BOX_LINE) <= 0) { UpdateToCheckGuide(null); } else { Timers.inst.Remove(CheckGuide); } } protected override void UpdateToCheckGuide(object param) { if (!ViewManager.CheckIsTopView(this.viewCom)) return; GuideCfg cfg = GuideCfgArray.Instance.GetCfg(ConstGuideId.LUCKY_BOX_LINE); // GuideController.TryCompleteGuide(ConstGuideId.LUCKY_BOX, 4); GuideController.TryGuide(null, ConstGuideId.LUCKY_BOX_LINE, 1, "点击将星连接在一起。", -1, true, (int)(this.viewCom.height - 200), true); TryCompleteGuide(); } protected override void TryCompleteGuide() { if (clickComStars.Count >= 2) { GuideCfg cfg = GuideCfgArray.Instance.GetCfg(ConstGuideId.LUCKY_BOX_LINE); GuideController.TryCompleteGuideIndex(cfg.id, 1); GuideController.TryCompleteGuide(ConstGuideId.LUCKY_BOX_LINE, 1); } else { GuideDataManager.SetGuideIndexState(GuideDataManager.currentGuideId, GuideDataManager.currentGuideIdIndex, 0); GuideDataManager.currentGuideIdIndex = 3; } } } }