/// <summary> /// 清除界面数据 /// </summary> public void ClearDatas() { UnitTool.ToolStopAllCoroutines(); //清除玩家相关数据 for (int i = 0; i < players.Count; i++) { players[i].myCardInfo.Clear(); players[i].myType = new DDZ_POKER_TYPE(); players[i].myTerm = false; } lastType = DDZ_POKER_TYPE.DDZ_PASS; ClearLordDatas(); //清除控制器相关数据 this.tableCards.Clear(); this.lastCards.Clear(); this.lordTimes = 0; //销毁桌面上所有的扑克牌 pokerTable.myUiCard.Clear(); GameObject[] pokers = GameObject.FindGameObjectsWithTag("Poker"); for (int i = 0; i < pokers.Length; i++) { GameObject.Destroy(pokers[i].gameObject); } startIndex = playerIndex % 3; SetLordImg(false); SetStartButton(false, true); //显示界面重置 SetButton(false, false, false); }
/// <summary> /// 玩家出麻将 /// </summary> /// <param name="cardIndex"></param> /// <param name="cardName"></param> /// <returns></returns> private void _playerPlay(int cardIndex, string cardName, bool go) { if (!go) { UnitTool.ToolStartCoroutine(_waitCoroutine(cardIndex, cardName, false)); return; } //当前玩家的出牌 Debug.Log("Player " + index + " 出 " + cardIndex); int n = 0; for (int i = 0; i < players[index].myCards.Count; i++) { if (players[index].myCards[i].cardName == cardName) { n = i; break; } } _majiangTable.PlayMajiangAnimation(cardName, players[index].myCards, index); //保存这个玩家出的牌 pCard = players[index].myCards[n]; //清除 players[index].myCards.RemoveAt(n); //当前玩家重新排序 _sortCards(players[index].myCards); _majiangTable.ShowMajiang(players[index].myCards, index); //当前玩家出牌后,其他三个玩家进行检测胡、碰、杠操作 _checkMajiang(); }
/// <summary> /// 玩家出麻将 /// </summary> /// <param name="cardIndex"></param> /// <param name="cardName"></param> /// <returns></returns> private void PlayerPlay(Card card, bool go) { if (!go) { UnitTool.ToolStartCoroutine(WaitCoroutine(card, false)); return; } //当前玩家的出牌 Debug.Log("Player " + index + " 出 " + card.CardIndex); int n = 0; for (int i = 0; i < CurPlayerCards.Count; i++) { if (CurPlayerCards[i] == card) { n = i; break; } } majiangTable.DropCard(card, CurPlayerCards, index); //保存这个玩家出的牌 pCard = CurPlayerCards[n]; //清除 CurPlayerCards.RemoveAt(n); //当前玩家重新排序 SortCards(CurPlayerCards); majiangTable.FreshCard(CurPlayerCards, index); //当前玩家出牌后,其他三个玩家进行检测胡、碰、杠操作 CheckMajiang(); }
/// <summary> /// 更新玩家的卡牌到玩家的位置 /// </summary> /// <param name="cardInfo"></param> /// <param name="time"></param> public void MoveCard(CardInfo cardInfo, float time) { var endPos = cardInfo.parent.transform.position; var trans = GetCardObject(cardInfo).GetComponent <Transform>(); UnitTool.ToolStartCoroutine(MoveObject(endPos, time, trans)); }
/// <summary> /// 不抢地主 /// </summary> public virtual void NotLord() { //先关闭所有协程 UnitTool.ToolStopAllCoroutines(); loadLord = false; NotLordEvent(); }
//----------------------------------------------------------------------------- // Constructors //----------------------------------------------------------------------------- public PlayerHoldSwordState() { weaponAnimation = GameData.ANIM_SWORD_HOLD; nextState = null; weapon = null; chargeTimer = 0; direction = Directions.Right; playerTool = null; }
void Awake() { AddHandlerReceiveEvent(this);//注册 #region 协程 UnitTool.AddToolStartCoroutine(U3dCoroutine); UnitTool.AddToolStopAllCoroutines(StopAllCoroutines); #endregion #region 控制器 //登陆界面控制器 pokerLoginControl = new PokerLoginControl(); //主界面控制器 pokerMainControl = new PokerMainControl(); //斗地主桌面控制器 pokerTableControl = new PokerTableControl(); //麻将桌控制器 majiangTableControl = new Mahjong.Control(); //快速开始界面控制器 pokerFastRoomControl = new PokerFastRoomControl(); //设置界面控制器 pokerSettingControl = new PokerSettingControl(); //输赢界面控制器 pokerWinControl = new PokerWinControl(); #endregion //打开登陆界面 ShowLoginUI(); //打开主界面 pokerLoginControl.AddMainEvent(OpenMainCallBack); //打开桌界面 pokerMainControl.AddTableEvent(OpenTableCallBack); //打开麻将界面 pokerMainControl.AddMajiangEvent(OpenMajiangCallBack); //打开快速开始界面 pokerMainControl.AddFastRoomEvent(OpenFastRoomCallBack); //打开输赢界面 pokerTableControl.AddWinEvent(OpenWinCallBack); majiangTableControl.AddGameOverEvent(OpenWinCallBack); //打开设置界面 pokerMainControl.AddSettingEvent(OpenSettingCallBack); pokerTableControl.AddSettingEvent(OpenSettingCallBack); majiangTableControl.AddSettingEvent(OpenSettingCallBack); }
/// <summary> /// 重新开始游戏 /// </summary> private void _restartGame() { //关闭所有协程 UnitTool.ToolStopAllCoroutines(); //清除玩家和桌控制器的数据,重置UI的显示 _clearDatas(); //调用开始游戏 _startGame(); }
/// <summary> /// 胡牌 /// </summary> private void _huMajiang() { //停止所有协程 UnitTool.ToolStopAllCoroutines(); //玩家胡,显示赢家的麻将 _sortCards(players[winIndex].myCards); _majiangTable.ShowHuMajiang(players[winIndex].myCards); //控制器显示胜利 _gameOver(); }
private void Swing(int direction) { swingDirection = direction; swingAngleDirection = swingWindingOrders[swingDirection]; swingAngleStart = Directions.ToAngle(swingDirection); swingAngleStart = Angles.Subtract(swingAngleStart, swingAnglePullBack, swingAngleDirection); swingAngle = swingAngleStart; swingAngleIndex = 0; player.Direction = direction; playerTool = GetSwingTool(); player.EquipTool(playerTool); playerTool.AnimationPlayer.SubStripIndex = direction; if (player.IsInMinecart) { playerTool.PlayAnimation(weaponSwingAnimation); player.Graphics.PlayAnimation(playerSwingAnimationInMinecart); swingCollisionBoxes = swingCollisionBoxesNoLunge; } else if (lunge) { playerTool.PlayAnimation(weaponSwingAnimationLunge); player.Graphics.PlayAnimation(playerSwingAnimationLunge); swingCollisionBoxes = swingCollisionBoxesLunge; } else { playerTool.PlayAnimation(weaponSwingAnimation); player.Graphics.PlayAnimation(playerSwingAnimation); swingCollisionBoxes = swingCollisionBoxesNoLunge; } OnSwingBegin(); // Perform an initial swing tile peak. Vector2F hitPoint = player.Center + (Angles.ToVector(swingAngle, false) * 13); Point2I hitTileLocation = player.RoomControl.GetTileLocation(hitPoint); OnSwingTilePeak(swingAngle, hitTileLocation); // Invoke any actions set to occur at time 0. if (timedActions.ContainsKey(0)) { timedActions[0].Invoke(); } Rectangle2I toolBox = swingCollisionBoxes[swingDirection, Math.Min(swingCollisionBoxes.Length - 1, swingAngleIndex)]; toolBox.Point += (Point2I)player.CenterOffset; playerTool.CollisionBox = toolBox; }
/// <summary> /// 初始化牌到桌面 /// </summary> public void StartGame() { //重新开始清除数据 ClearDatas(); //第一个发牌的玩家 playerIndex = startIndex % 3; //初始化扑克牌信息 tableCards = InitCards(); //洗牌 tableCards = GetRandomList <CardInfo>(tableCards); //实例化到桌面 tableCards = pokerTable.InstaceCards(tableCards); //发牌协程 UnitTool.ToolStartCoroutine(SendCards()); }
/// <summary> /// 玩家不出牌 /// </summary> public void NotPlayCards() { if (playerIndex % 3 == 0) { //玩家不出牌 if (lastCards.Count != 0) { //上个玩家出牌了 Debug.Log(players[0].ToString() + "不要"); players[playerIndex % 3].myTerm = false; //lastType = players[playerIndex % 3].myType; //不出牌的时候,将选中出列的牌归位 for (int i = 0; i < players[0].myCardInfo.Count; i++) { if (players[0].myCardInfo[i].isSelected) { pokerTable.GetCardObject(players[0].myCardInfo[i]).SetSelectState(); } } UnitTool.ToolStopAllCoroutines(); StartPlay(); } else { //自己的出牌回合,时间结束,默认系统出玩家的第一张牌 lastType = DDZ_POKER_TYPE.SINGLE; players[0].myCardInfo[players[0].myCardInfo.Count - 1].isSelected = true; CanPlayCards(); } } else { //电脑不出牌 Debug.Log(players[playerIndex % 3].ToString() + "不要"); players[playerIndex % 3].myTerm = false; //先关闭所有协程 UnitTool.ToolStopAllCoroutines(); //回到开始出牌主函数 StartPlay(); } }
/// <summary> /// 开始叫地主 /// </summary> public void StartForLord() { isLord = true; //判断谁是地主,如果没有出来那么就继续叫地主 if (!JudgeLord()) { return; } playerIndex++; playerIndex = playerIndex % 3; //Debug.Log(playerIndex); //抢地主前先关闭所有协程 UnitTool.ToolStopAllCoroutines(); //当前玩家开始叫地主 players[playerIndex].ToLord(); //显示叫地主图标 ShowOption(true, false, players[playerIndex]); }
/// <summary> /// 出牌协程 /// </summary> /// <returns></returns> private IEnumerator StartPlayCoroutine() { SetButton(false, false, false); //这里等待一秒钟,是为了部分协程执行执行结束,不然就会同时对玩家索引进行操作 yield return(new WaitForSeconds(1f)); UnitTool.ToolStopAllCoroutines(); if (isRestart) { isRestart = false; playerIndex = startIndex; } else { playerIndex++; } players[playerIndex % 3].StartPlay(); }
/// <summary> /// 玩家摸牌 /// </summary> private void _drawMajiang() { //该玩家摸牌 if (tCards.Count == 0) { UnitTool.ToolStopAllCoroutines(); Debug.Log("牌抓完了...平局"); //打开平局面板 UnitTool.ToolStopAllCoroutines(); if (_gameOverEvent != null) { _gameOverEvent("平局"); } return; } players[index].AddCard(tCards[0]); var moCard = tCards[0]; _majiangTable.DrawMajiangAnimation(tCards[0], index); _sortCards(players[index].myCards); tCards.RemoveAt(0); }
/// <summary> /// 开始出牌 /// </summary> public virtual void StartPlay() { StartPlayEvent(); //电脑开始思考 UnitTool.ToolStartCoroutine(Considerating(1)); }
/// <summary> /// 杠按钮调用 /// </summary> private void _buttonGang() { _setButton(false, false, false, false); UnitTool.ToolStopAllCoroutines(); _gang(temp); }
/// <summary> /// 杠按钮调用 /// </summary> private void ButtonGang() { SetButton(false, false, false, false); UnitTool.ToolStopAllCoroutines(); Gang(temp); }
/// <summary> /// 发牌动画 /// </summary> /// <param name="players"></param> /// <param name="startIndex"></param> /// <returns></returns> public void SendMajiangAnimation(List <Player> players) { UnitTool.ToolStartCoroutine(SendCardCoroutine(players)); }
//----------------------------------------------------------------------------- // Overridden methods //----------------------------------------------------------------------------- public override void OnBegin(PlayerState previousState) { player.Movement.MoveCondition = PlayerMoveCondition.OnlyInAir; playerTool = player.ToolVisual; Swing(player.UseDirection); }
/// <summary> /// 发牌动画 /// </summary> /// <param name="players"></param> /// <param name="startIndex"></param> /// <returns></returns> public void SendMajiangAnimation(List <MBasePlayer> players) { UnitTool.ToolStartCoroutine(_sendMajiangCoroutine(players)); }
/// <summary> /// 玩家抢到地主 /// </summary> public void ForLord() { //清除抢地主留下的信息,以免重开时未重置 ClearLordDatas(); Transform parent; //抢地主成功,当前playerIndex索引玩家为地主 UnitTool.ToolStopAllCoroutines(); SetButton(false, false, false); //拿到地主的位置 parent = players[playerIndex % 3].GetPlayer(); //重新排序地主的牌 players[playerIndex % 3].myCardInfo = SortCards(players[playerIndex % 3].myCardInfo); if (playerIndex % 3 == 0) { //地主是玩家 for (int i = 51; i < 54; i++) { players[0].AddCard(tableCards[i]); //玩家点击扑克牌市斤添加 pokerTable.GetCardObject(tableCards[i]).AddSetSelectEvent(SetSelect); } //UI同步更新 pokerTable.ClearCardParent(players[0].myCardInfo); InitPlayers(); pokerTable.ShowCards(players[0].myCardInfo); } else { //地主是电脑 for (int i = 51; i < 54; i++) { players[playerIndex % 3].AddCard(tableCards[i]); pokerTable.MoveCard(tableCards[i], 0.5f); } } tableCards.Clear(); SetLordImg(); //地主开始出牌 //标志谁最先出牌 startIndex = playerIndex; //由于下面的开始游戏前会自动增加玩家索引,所以这里玩家索引递减一个 if (playerIndex != 0) { playerIndex--; } else { playerIndex += 2; } isLord = false; //开始出牌 StartPlay(); }
/// <summary> /// 玩家点击不叫地主 /// </summary> public void PlayerNotClickLord() { UnitTool.ToolStopAllCoroutines(); SetHintText("不抢", 0); StartForLord(); }
/// <summary> /// 确定能够出牌 /// </summary> public void CanPlayCards() { //清除桌面上的牌 if (tableCards.Count != 0) { for (int i = 0; i < tableCards.Count; i++) { pokerTable.MoveCard(tableCards[i], new Vector3(0, 0, 0), 0.01f); } } tableCards.Clear(); List <int> list = new List <int>(); list.Clear(); //将要出的牌添加到桌面List中并排序 for (int i = 0; i < players[playerIndex % 3].myCardInfo.Count; i++) { if (players[playerIndex % 3].myCardInfo[i].isSelected) { tableCards.Add(players[playerIndex % 3].myCardInfo[i]); list.Add(players[playerIndex % 3].myCardInfo[i].cardIndex); } } //tableCards = SortCards(tableCards); //保存上个玩家出的牌的信息 lastCards.Clear(); PokerRules.PopEnable(list, out players[playerIndex % 3].myType); lastType = players[playerIndex % 3].myType; for (int i = 0; i < tableCards.Count; i++) { lastCards.Add(tableCards[i]); } //移动要出的牌到指定的位置,并清除myCards中出去的牌 GameObject table = pokerTable.table; Vector3 pos = table.transform.position + new Vector3(-tableCards.Count * 0.48f, 0, 0); for (int i = 0; i < tableCards.Count; i++) { tableCards[i].parent = table.transform; pokerTable.SetCardParent(tableCards[i]); pokerTable.InitImage(tableCards[i], false); pokerTable.MoveCard(tableCards[i], pos += new Vector3(0.78f, 0, 0), 0.5f); players[playerIndex % 3].myCardInfo.Remove(tableCards[i]); } //判断是否获胜 if (players[playerIndex % 3].myCardInfo.Count == 0) { UnitTool.ToolStartCoroutine(Win(players[playerIndex % 3])); return; } //是玩家出牌 if (playerIndex % 3 == 0) { //对当前手牌进行重新显示 pokerTable.ShowCards(players[0].myCardInfo); } //当前玩家轮回结束 players[playerIndex % 3].myTerm = true; //开始下一个玩家的出牌 StartPlay(); }
/// <summary> /// 开始叫地主 /// </summary> public override void ToLord() { clickLord = false; //开启思考协程 UnitTool.ToolStartCoroutine(Considerating(0)); }
/// <summary> /// 开始出牌 /// </summary> public override void StartPlay() { StartPlayEvent(); //开始倒计时 UnitTool.ToolStartCoroutine(Considerating(1)); }
/// <summary> /// 开始出牌 /// </summary> public void StartPlay() { UnitTool.ToolStartCoroutine(StartPlayCoroutine()); }
/// <summary> /// 更新卡牌到数据指定的位置 /// </summary> /// <param name="cardInfo"></param> /// <param name="time"></param> public void MoveCard(CardInfo cardInfo, Vector3 endPos, float time) { var trans = GetCardObject(cardInfo).GetComponent <Transform>(); UnitTool.ToolStartCoroutine(MoveObject(endPos, time, trans)); }
/// <summary> /// 叫地主 /// </summary> public virtual void ToLord() { //电脑开始思考 UnitTool.ToolStartCoroutine(Considerating(0)); }