using System; using FairyGUI; using UnityEngine; using BingoBrain.Core; using DG.Tweening; using BingoBrain.HotFix; using FGUI.JBingoPlay; using System.Collections.Generic; using Random = UnityEngine.Random; using FGUI.ACommon; using Spine.Unity; namespace BingoBrain { public class BingoStartUI : BaseUI { private BingoStartUICtrl ctrl; private BingoStartModel model; public com_play ui; private com_AddBall com_Add; private Action CloseCb; private GTweener ballonTweenr; private List poolComNum = new(); private List showComNum = new(); private List showComNumPot = new(); private bool isInited; private Tween energyTween; private float moveTime = 3; private bool isLeft = true; private Tween waitTween; private bool isMoveFinish = true; private GameObject ballIdle; private GameObject ballEnter; private int click_number = -1; private bool IsBallonCD => GameHelper.GetNowTime() < PreferencesMgr.Instance.BallonCdTime; public BingoStartUI(BingoStartUICtrl ctrl) : base(ctrl) { uiName = UIConst.BingoStartUI; this.ctrl = ctrl; } protected override void SetUIInfo(UIInfo uiInfo) { uiInfo.packageName = "JBingoPlay"; uiInfo.assetName = "com_play"; uiInfo.layerType = UILayerType.Normal; uiInfo.isNeedOpenAnim = false; uiInfo.isNeedCloseAnim = false; } #region 生命周期 protected override void OnInit() { model = ModuleBoardk.GetModel(ModelConst.BingoStartModel) as BingoStartModel; } protected override void OnClose() { } protected override void OnBind() { ui = baseUI as com_play; } private bool is_safearea = false; protected override void OnOpenBefore(object args) { if (Screen.safeArea.y != 0 && !is_safearea) {//刘海屏 ui.group_.y += Screen.safeArea.y; is_safearea = true; } Audio.Instance.StopBGM(); click_number = 0; ui.btn_star.icon_image.fillAmount = 0; ui.btn_star.progress_text.text = "0/3"; ui.btn_star.progress.width = 0; if (isInited) { return; } InitData(); InitView(); } private void InitData() { isInited = true; Hall.Instance.SetGaming(true); model.show101 = PreferencesMgr.Instance.Currency101; model.show102 = PreferencesMgr.Instance.Currency102; poolComNum.Clear(); showComNum.Clear(); poolComNum.Add(ui.com_CallNum.com_Num1); poolComNum.Add(ui.com_CallNum.com_Num2); poolComNum.Add(ui.com_CallNum.com_Num3); poolComNum.Add(ui.com_CallNum.com_Num4); poolComNum.Add(ui.com_CallNum.com_Num5); showComNumPot.Add(ui.com_CallNum.com_Num5.position); showComNumPot.Add(ui.com_CallNum.com_Num4.position); showComNumPot.Add(ui.com_CallNum.com_Num3.position); showComNumPot.Add(ui.com_CallNum.com_Num2.position); showComNumPot.Add(ui.com_CallNum.com_Num1.position); Vector3 localPos = ui.com_prop.size / 2; localPos += ui.com_prop.position; BingoCell.propOriginPos = GRoot.inst.LocalToGlobal(localPos); BingoCell.propOriginPos = CameraBoardk.Instance.FGUIPosToWorldPos(BingoCell.propOriginPos); isShowGameOver = false; BingoCell.GetCoinSum = 0; BingoCell.GetCashSum = 0; } private void InitView() { Set101(); Set102(); if (GameHelper.IsGiftSwitch()) { (ui.btn_cash as com_102).gift.selectedIndex = 1; (ui.btn_ballon as btn_balloon).gift.selectedIndex = 1; } else { ui.btn_star.visible = false; } GameHelper.SetGObject("btn_prop", ui.com_prop); FX.Instance.SetFx(ui.com_AddBall.gp_fx, Fx_Type.fx_ball_enter, ps => { }, CloseCb); MoveToOtherSide(); Hall.Instance.UpdateSecondEvent += UpdateSecond; ui.touchable = false; ui.com_prop.visible = !BingoCell.isFirstGame; // ui.btn_close.visible = !BingoData.isFirstGame; ui.btn_close.SetClick(OnBtnCloseClick); ui.com_carddi.cont_card.selectedIndex = com_carddi.Card_keySum_0; ui.com_AddBall.visible = false; ui.fairyBatching = false; ui.btn_ballon.visible = !IsBallonCD; ui.btn_ballon.SetClick(OnClickBalloon); if (ballEnter == null) { var effect = Battle.Instance.ShungTik.Get("Effect.spark.ballEffect", "ballEffect"); ballEnter = effect.transform.Find("fx_qiu_enter").gameObject; ballIdle = effect.transform.Find("fx_qiu_idle").gameObject; effect.transform.localScale = 100 * Vector3.one; var wrapper = new GoWrapper(); wrapper.SetWrapTarget(effect, true); ui.com_prop.gh_effect.SetNativeObject(wrapper); } SetIdleEffect(); ui.com_CallNum.btn_Speed.text = "X" + BingoCell.CallSpeed; ui.com_CallNum.btn_Speed.SetClick(OnClickCallSpeed); SetEnergy(); InitStartGameEvent(); RefreshUI(); } private void OnClickCallSpeed() { Audio.Instance.PlayDynamicEffect("button"); BingoCell.CallSpeed = BingoCell.CallSpeed switch { 1 => 2, 2 => 3, _ => 1 }; } private void InitStartGameEvent() { Sequence sequence = DOTween.Sequence(); sequence.Append(DOVirtual.DelayedCall(0.5f, () => { Audio.Instance.StopBGM(); ui.fx_readygo.SetHook("Ready", () => { Audio.Instance.PlayDynamicEffect("ready_Ready"); }); ui.fx_readygo.SetHook("Go", () => { Audio.Instance.PlayDynamicEffect("ready_Go"); }); ui.fx_readygo.Play(); }).SetAutoKill()); sequence.Append(DOVirtual.DelayedCall(ui.fx_readygo.totalDuration, () => { Audio.Instance.PlayBGM("bgm_play"); if (BingoCell.isFirstGame) { var pos = NNfds.WorldToUIPos(BingoCell.cardBoardList[0].cardList[0].Game .gameObject); GameHelper.SetGuidePos("third", pos); } else { GameHelper.SetGuidePos("fifth", ui.com_prop); } ui.touchable = true; }).SetAutoKill()); sequence.Append(DOVirtual.DelayedCall(Time.deltaTime, () => { // 开始叫号 gameDispatcher.Dispatch(BingoInfo.StartCallNum); }).SetAutoKill()); } #region 气球 private void OnClickBalloon() { if (BingoCell.isProcedure || BingoCell.IsGuiding || BingoCell.isPropRewarding) { return; } Audio.Instance.PlayDynamicEffect("button"); GameHelper.GetVideo("reward_flyballoon", isSuccess => { if (isSuccess) { ui.btn_ballon.touchable = false; var rewardType = GameHelper.GetCommonModel().ballonRewardType[0]; double rewardCount = 0; if (rewardType == 102) { rewardCount = GameHelper.GetDynamicReward(rewardType, GameHelper.GetCommonModel().ballonReward102); } ui.btn_ballon.visible = false; PreferencesMgr.Instance.BallonCdTime = (int)(GameHelper.GetNowTime() + GameHelper.GetCommonModel().ballonCD); GameHelper.GetRewardOnly(rewardType, (decimal)rewardCount, RewardOrigin.PlayBallon, isSuccess => { ui.btn_ballon.touchable = true; }, ui.btn_ballon); } }); } void MoveToOtherSide() { if (!ui.btn_ballon.visible) { return; } if (!isMoveFinish) { return; } float offset = 300; isMoveFinish = false; var btnBalloon = ui.btn_ballon.displayObject.gameObject.transform; var sequence = DOTween.Sequence(); var pos1 = new Vector3(ui.left_top.x, ui.left_top.y - RandomKit.RandomRange(30, 100)); var posLocal1 = GameHelper.FguiToUnityLocalPot(pos1); ui.btn_ballon.position = pos1; var pos2 = new Vector3(ui.left_bottom.x, BingoCell.CenterUIPos.y + offset + RandomKit.RandomRange(200, 300)); var posLocal2 = GameHelper.FguiToUnityLocalPot(pos2); var tw1 = btnBalloon.DOLocalMove(posLocal2, 3).SetEase(Ease.Linear); sequence.Append(tw1); var pos3 = new Vector3(ui.right_top.x, ui.right_top.y - RandomKit.RandomRange(30, 100)); var posLocal3 = GameHelper.FguiToUnityLocalPot(pos3); var tw2 = btnBalloon.DOLocalMove(posLocal3, 3); tw2.SetDelay(Random.Range(5, 7)).SetEase(Ease.Linear); sequence.Append(tw2); var pos4 = new Vector3(ui.right_bottom.x, BingoCell.CenterUIPos.y + offset + RandomKit.RandomRange(200, 300)); var posLocal4 = GameHelper.FguiToUnityLocalPot(pos4); var tw3 = btnBalloon.DOLocalMove(posLocal4, 3); tw3.SetDelay(Random.Range(3, 5)).SetEase(Ease.Linear); sequence.Append(tw3); var tw4 = btnBalloon.DOLocalMove(posLocal1, 3); tw4.SetDelay(Random.Range(5, 11)).SetEase(Ease.Linear); sequence.Append(tw4); var tw5 = DOVirtual.DelayedCall(Random.Range(5, 11), () => { }); sequence.Append(tw5); sequence.OnComplete(() => { isMoveFinish = true; ui.btn_ballon.InvalidateBatchingState(); MoveToOtherSide(); }); } private void UpdateSecond() { if (ui.btn_ballon.visible != !IsBallonCD) { ui.btn_ballon.visible = !IsBallonCD; // 开始移动 if (ui.btn_ballon.visible) { MoveToOtherSide(); } } } #endregion void SetIdleEffect(bool isIdle = true) { ballIdle.SetActive(isIdle); ballEnter.SetActive(!isIdle); } protected override void OnOpen(object args) { ui?.FadeIn(); } private void OnBtnCloseClick() { if (BingoCell.isProcedure) { return; } if (!BingoCell.IsInGame) { return; } Audio.Instance.PlayDynamicEffect("button"); uiCtrlDispatcher.Dispatch(SkinInfo.LeaveBingoUI_Open); } void SetEnergy() { if (BingoCell.isPropRewarding) { return; } var originFillAmount = ui.com_prop.img_prg.fillAmount; if (energyTween != null && energyTween.active) { energyTween?.Kill(); } energyTween = DOVirtual.Float(originFillAmount, BingoCell.EnergyPrg, 0.5f, prg => { ui.com_prop.img_prg.fillAmount = prg; }); } private void CallNum(object obj) { RefreshUI(); var sum = (int)obj; var item = GetComNum(); item.visible = true; item.scale = Vector2.one; item.alpha = 1; // item.position = new Vector2(5, -140); item.displayObject.gameObject.transform.localPosition = new Vector3(5, -140); var localPos = GameHelper.FguiToUnityLocalPot(showComNumPot[4]); item.displayObject.gameObject.transform.DOLocalMoveX(localPos.x, aniTime).SetEase(Ease.Linear); item.displayObject.gameObject.transform.DOLocalMoveY(localPos.y, aniTime).SetEase(Ease.Linear); // item.TweenMove(showComNumPot[4], aniTime); item.text_num.text = GameHelper.GetNoDecimalUnitStr(sum); item.cont_state.selectedIndex = (sum - 1) / 15; for (var i = 0; i < showComNum.Count; i++) { var _Num = showComNum[i]; var index = i + (4 - showComNum.Count); // _Num.TweenMove(showComNumPot[index], aniTime); _Num.displayObject.gameObject.transform.DOLocalMoveX(showComNumPot[index].x, aniTime) .SetEase(Ease.Linear); if (i == 0 && showComNum.Count >= 4) { DOVirtual.Float(1, 0.6f, aniTime, e => { _Num.alpha = e; }).SetAutoKill(); } if (index == 3) { DOVirtual.Float(1, 0.8f, aniTime, e => { _Num.scale = Vector2.one * e; }).SetAutoKill(); } } showComNum.Add(item); } private com_Num GetComNum() { com_Num item; if (poolComNum.Count <= 0) { item = showComNum[0]; showComNum.RemoveAt(0); } else { item = poolComNum[0]; poolComNum.RemoveAt(0); } return item; } protected override void OnHide() { isInited = false; ui?.FadeOut(); foreach (var comNum in showComNum) { comNum.visible = false; poolComNum.Add(comNum); } Hall.Instance.SetGaming(false); OnClearTween(); showComNum.Clear(); CloseCb?.Invoke(); Hall.Instance.UpdateSecondEvent -= UpdateSecond; } protected override void OnDisplay(object args) { OnOpenBefore(args); OnOpen(args); } private void RefreshUI(object o = null) { ui.com_CallNum.btn_Speed.text_Speed.text = BingoCell.CallSpeed + "X"; ui.com_ballleft.text_numLeft.text = GameHelper.GetNoDecimalUnitStr(BingoCell.MaxCallSum - BingoCell.calledList.Count); var num = Math.Min(3, BingoCell.KeyCardSum); ui.com_carddi.cont_card.selectedIndex = num; } #endregion #region 消息 protected override void AddListener() { uiCtrlDispatcher.AddListener(SkinInfo.CallEndUI_Close, RefreshUI); gameDispatcher.AddListener(BingoInfo.CallNum, CallNum); gameDispatcher.AddListener(BingoInfo.CallSpeedChange, RefreshUI); gameDispatcher.AddListener(BingoInfo.StartBingoGame, OnStartBingoGame); gameDispatcher.AddListener(BingoInfo.SelectOneNum, OnSelectOneCard);//点击 gameDispatcher.AddListener(BingoInfo.AddPropRewardFinish, OnAddPropRewardFinish); gameDispatcher.AddListener(BingoInfo.StartFullEnergy, OnStartFullEnergy); gameDispatcher.AddListener(BingoInfo.ShowGameOver, OnEndBingoGame); gameDispatcher.AddListener(BingoInfo.KeyCardSumChane, RefreshUI); gameDispatcher.AddListener(BingoInfo.AddBallSum, AddBallSum); } private void OnStartBingoGame(object obj) { // RefreshUI(); } private bool isShowGameOver = false; private void OnEndBingoGame(object obj) { if (isShowGameOver) { return; } isShowGameOver = true; ui.fx_gameover.Stop(); Audio.Instance.PlayDynamicEffect("gameover"); ui.fx_gameover.Play(() => { UICtrlDispatcher.Instance.Dispatch(SkinInfo.BingoEndUI_Open); isShowGameOver = false; CtrlCloseUI(); }); } private void OnStartFullEnergy(object obj) { var type = (int)obj; ui.com_prop.cont_prop.selectedIndex = type + 1; SetIdleEffect(false); } private void OnAddPropRewardFinish(object obj) { ui.com_prop.cont_prop.selectedIndex = ui.com_prop._Prop_normal; DOVirtual.Float(1, 0, 0.2f, prg => { ui.com_prop.img_prg.fillAmount = prg; }).OnComplete(() => { SetIdleEffect(); SetEnergy(); }).SetAutoKill(); } private SkeletonAnimation cardSpine; private void OnSelectOneCard(object obj)//点击事件 { click_number++; Debug.Log(click_number); if (GameHelper.IsGiftSwitch() && click_number >= 3) { Audio.Instance.PlayDynamicEffect("star"); click_number = 0; //uiCtrlDispatcher.Dispatch(SkinInfo.StarRewardUI_Open); if (cardSpine == null) { FX.Instance.SetFx(ui.spine_parent, Fx_Type.spine_starreward, sk => { cardSpine = sk; NAAVsa.PlayAnim(cardSpine, "b", false); // NAAVsa.AddCompleteEvent(cardSpine,(sk)=>{ // }); GTweener tweener1 = ui.spine_parent.TweenMove(GameHelper.GetUICenterPosition(ui), 0.75f).OnComplete(() => { uiCtrlDispatcher.Dispatch(SkinInfo.StarRewardUI_Open); ui.spine_parent.x = ui.btn_star.x; ui.spine_parent.y = ui.btn_star.y; }); // 位置从当前值渐变到新的坐标 tweener1.SetEase(EaseType.QuadOut); // NAAVsa.AddCompleteEvent(cardSpine, OnChangeCardFinish); // OnChangeCardFinish(null); }, CloseCb); } else { NAAVsa.PlayAnim(cardSpine, "b", false); // NAAVsa.AddCompleteEvent(cardSpine,(sk)=>{ // }); GTweener tweener1 = ui.spine_parent.TweenMove(GameHelper.GetUICenterPosition(ui), 0.75f).OnComplete(() => { uiCtrlDispatcher.Dispatch(SkinInfo.StarRewardUI_Open); ui.spine_parent.x = ui.btn_star.x; ui.spine_parent.y = ui.btn_star.y; }); // 位置从当前值渐变到新的坐标 tweener1.SetEase(EaseType.QuadOut); } } ui.btn_star.icon_image.fillAmount = (float)click_number / 3; ui.btn_star.progress_text.text = click_number + "/3"; ui.btn_star.progress.width = ((float)click_number / 3) * 138; SetEnergy(); } private float aniTime = 0.3f; private void AddBallSum(object o) { var sum = (int)o; // 第一段出现时间 var showTime = 0.4f; // 等待时间 var IdleTime = 0.5f; // 第二段飞行时间 var moveTime = 0.3f; // 球飞行间隔 var dleFloat = 0.1f; ui.com_AddBall.visible = true; var sys = ui.LocalToGlobal(ui.com_ballleft.position + (Vector3)ui.com_ballleft.size / 2); var tar = ui.com_AddBall.GlobalToLocal(sys); GameDispatcher.Instance.Dispatch(BingoInfo.AddPause, 1); Audio.Instance.PlayDynamicEffect("extraBall_show"); for (var i = 0; i < 5; i++) { var item = ui.com_AddBall.GetChildAt(i + 1); item.visible = false; item.alpha = 1; var index = i; if (sum > index) { item.visible = true; Vector2 startPot = item.position; item.position = ui.com_AddBall.size / 2; item.scale = Vector2.zero; DOVirtual.DelayedCall(index * dleFloat, () => { item.TweenMove(startPot, showTime); DOVirtual.Float(0.3f, 1, showTime, e => { item.scale = Vector2.one * e; }).OnComplete(() => { DOVirtual.DelayedCall(IdleTime, () => { DOVirtual.Float(1, 0.6f, moveTime, e => { item.scale = Vector2.one * e; item.alpha = e; }).SetAutoKill(); DOVirtual.Float(1, 0.3f, moveTime / 2, e => { item.scale = Vector2.one * e; }) .SetAutoKill(); item.TweenMove(tar, moveTime).OnComplete(() => { BingoCell.MaxCallSum += 1; if (index == 0) { GameDispatcher.Instance.Dispatch(BingoInfo.AddPause, -1); } RefreshUI(); item.position = startPot; item.visible = false; if (sum == index + 1) { ui.com_AddBall.visible = false; } }); }).SetAutoKill(); }).SetAutoKill(); }); /*DOVirtual.DelayedCall(index * dleFloat, () => { item.TweenMove(startPot, showTime); DOVirtual.Float(0.3f, 1, showTime, e => { item.scale = Vector2.one * e; }).OnComplete(() => { DOVirtual.DelayedCall(IdleTime, () => { DOVirtual.Float(1, 0.6f, moveTime, e => { item.scale = Vector2.one * e; item.alpha = e; }).SetAutoKill(); DOVirtual.Float(1, 0.3f, moveTime / 2, e => { item.scale = Vector2.one * e; }) .SetAutoKill(); item.TweenMove(tar, moveTime).OnComplete(() => { BingoData.MaxCallSum += 1; RefreshUI(); item.position = startPot; item.visible = false; if (index == 0) { GameDispatcher.Instance.Dispatch(GameMsg.AddPause, -1); } if (sum == index + 1) { ui.com_AddBall.visible = false; } }); }).SetAutoKill(); }).SetAutoKill(); }).SetAutoKill();*/ } } } protected override void RemoveListener() { uiCtrlDispatcher.RemoveListener(SkinInfo.CallEndUI_Close, RefreshUI); gameDispatcher.RemoveListener(BingoInfo.CallNum, CallNum); gameDispatcher.RemoveListener(BingoInfo.CallSpeedChange, RefreshUI); gameDispatcher.RemoveListener(BingoInfo.SelectOneNum, OnSelectOneCard); gameDispatcher.RemoveListener(BingoInfo.AddPropRewardFinish, OnAddPropRewardFinish); gameDispatcher.RemoveListener(BingoInfo.StartFullEnergy, OnStartFullEnergy); gameDispatcher.RemoveListener(BingoInfo.ShowGameOver, OnEndBingoGame); gameDispatcher.RemoveListener(BingoInfo.KeyCardSumChane, RefreshUI); gameDispatcher.RemoveListener(BingoInfo.AddBallSum, AddBallSum); } #endregion public void Set101(string coinStr = null) { if (coinStr == null) { coinStr = PreferencesMgr.Instance.Currency101 == -1 ? GameHelper.GetCommonModel().Init101Num.ToString("N0") : PreferencesMgr.Instance.Currency101.ToString("N0"); } // 房间券余额 数值 ui.btn_coin.GetChild("title").text = coinStr; } public void Set102(string cashStr = null) { if (cashStr == null) { cashStr = PreferencesMgr.Instance.Currency102 == -1 ? GameHelper.GetCommonModel().Init102Num.ToString("N") : PreferencesMgr.Instance.Currency102.ToString("N"); } // 房间券余额 数值 ui.btn_cash.GetChild("title").text = cashStr; (ui.btn_ballon as btn_balloon).cash_text.text = GameHelper.GetDynamicReward(102, GameHelper.GetCommonModel().ballonReward102).ToString("0.00"); } private void OnClearTween() { ballonTweenr?.Kill(); ballonTweenr = null; } } }