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 _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> dicWrappers = new Dictionary>(); private Dictionary> dicGameobj1 = new Dictionary>(); private Dictionary> dicWrappers1 = 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; private bool isFirst = true; public override void Dispose() { 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); // if (comStar.target.numChildren > 1) comStar.target.RemoveChildAt(1); // if (comStar.target.numChildren > 1) comStar.target.RemoveChildAt(1); // index++; // } } protected override void OnInit() { base.OnInit(); _ui = UI_LuckyBoxStarUI.Create(); this.viewCom = _ui.target; isfullScreen = true; _ui.m_btnBack.visible = true; _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); _rewardList = LuckyBoxDataManager.Instance.RewardList; _ui.m_ctrlBuyType.selectedIndex = _rewardList != null && _rewardList.Count > 1 ? 1 : 0; _ui.m_ctrlRewardsType.selectedIndex = Array.IndexOf(LuckyBoxDataManager.Instance.luckyBoxIds, LuckyBoxDataManager.Instance.currentBoxId); isFirst = true; ResetStartView(); } private void ResetStartView() { showGuide = GuideDataManager.GetGuideCountCopy(ConstGuideId.LUCKY_BOX) <= 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_c1.selectedIndex = 0; comStar.m_imgLine.width = imgLineWidth; comStar.m_imgLine.rotation = 0; GComponent gcom; if (comStar.target.numChildren > 1) { gcom = comStar.target.GetChildAt(1).asCom; } else { gcom = UIPackage.CreateObject("LuckyBox", "ComHolder").asCom; string resPath = ResPathUtil.GetViewEffectPath("ui_ck", "ui_ck"); SceneController.AddObjectToView(null, null, gcom.GetChild("holder").asGraph, resPath, out GameObject gameObject, out GoWrapper wrapper); } gcom.visible = true; comStar.target.AddChildAt(gcom, 1); GComponent gcom1; if (comStar.target.numChildren > 2) { gcom1 = comStar.target.GetChildAt(2).asCom; } else { gcom1 = UIPackage.CreateObject("LuckyBox", "ComHolder").asCom; string resPath1 = ResPathUtil.GetViewEffectPath("ui_ck", "ui_ck_dj"); SceneController.AddObjectToView(null, null, gcom1.GetChild("holder").asGraph, resPath1, out GameObject gameObject1, out GoWrapper wrapper1); } gcom1.visible = false; comStar.target.AddChildAt(gcom1, 2); 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)); } } 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; // comStar.m_c1.selectedIndex = 1; curComStar = comStars[i]; lastPos = Vector2.right; 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); } private void OnClickUIEnd() { if (showGuide && comStars.Count > 0) { isFirst = false; ResetStartView(); } else { TryCompleteGuide(); Timers.inst.Add(0.3f, 1, ClickUIEnd); } } private void ClickUIEnd(object param) { if (curComStar != null) { RemoveListener(); ViewManager.Show(ViewName.LUCKY_BOX_CARD_VIEW, new object[] { _rewardList, FirstGetCardViewType.JUMP }); 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); } protected override void UpdateToCheckGuide(object param) { if (!ViewManager.CheckIsTopView(this.viewCom)) return; GuideController.TryGuide(null, ConstGuideId.LUCKY_BOX, 4, "点击将星星链接在一起", false, 0, true, false, (int)(this.viewCom.height - 150)); TryCompleteGuide(); } protected override void TryCompleteGuide() { if (comStars.Count == 0) { GuideCfg cfg = GuideCfgArray.Instance.GetCfg(ConstGuideId.LUCKY_BOX); GuideController.TryCompleteGuideIndex(cfg.id, 4); GuideController.TryCompleteGuide(ConstGuideId.LUCKY_BOX, 4); } else { GuideDataManager.SetGuideIndexState(GuideDataManager.currentGuideId, GuideDataManager.currentGuideIdIndex, 0); GuideDataManager.currentGuideIdIndex = 3; } } } }