Ejemplo n.º 1
0
    /// <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);
    }
Ejemplo n.º 2
0
    /// <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();
    }
Ejemplo n.º 3
0
        /// <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));
    }
Ejemplo n.º 5
0
    /// <summary>
    /// 不抢地主
    /// </summary>
    public virtual void NotLord()
    {
        //先关闭所有协程
        UnitTool.ToolStopAllCoroutines();

        loadLord = false;
        NotLordEvent();
    }
Ejemplo n.º 6
0
        //-----------------------------------------------------------------------------
        // 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);
    }
Ejemplo n.º 8
0
    /// <summary>
    /// 重新开始游戏
    /// </summary>
    private void _restartGame()
    {
        //关闭所有协程
        UnitTool.ToolStopAllCoroutines();

        //清除玩家和桌控制器的数据,重置UI的显示
        _clearDatas();

        //调用开始游戏
        _startGame();
    }
Ejemplo n.º 9
0
    /// <summary>
    /// 胡牌
    /// </summary>
    private void _huMajiang()
    {
        //停止所有协程
        UnitTool.ToolStopAllCoroutines();

        //玩家胡,显示赢家的麻将
        _sortCards(players[winIndex].myCards);
        _majiangTable.ShowHuMajiang(players[winIndex].myCards);

        //控制器显示胜利
        _gameOver();
    }
Ejemplo n.º 10
0
        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;
        }
Ejemplo n.º 11
0
    /// <summary>
    /// 初始化牌到桌面
    /// </summary>
    public void StartGame()
    {
        //重新开始清除数据
        ClearDatas();

        //第一个发牌的玩家
        playerIndex = startIndex % 3;
        //初始化扑克牌信息
        tableCards = InitCards();
        //洗牌
        tableCards = GetRandomList <CardInfo>(tableCards);
        //实例化到桌面
        tableCards = pokerTable.InstaceCards(tableCards);
        //发牌协程
        UnitTool.ToolStartCoroutine(SendCards());
    }
Ejemplo n.º 12
0
    /// <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();
        }
    }
Ejemplo n.º 13
0
    /// <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]);
    }
Ejemplo n.º 14
0
    /// <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();
    }
Ejemplo n.º 15
0
    /// <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);
    }
Ejemplo n.º 16
0
 /// <summary>
 /// 开始出牌
 /// </summary>
 public virtual void StartPlay()
 {
     StartPlayEvent();
     //电脑开始思考
     UnitTool.ToolStartCoroutine(Considerating(1));
 }
Ejemplo n.º 17
0
 /// <summary>
 /// 杠按钮调用
 /// </summary>
 private void _buttonGang()
 {
     _setButton(false, false, false, false);
     UnitTool.ToolStopAllCoroutines();
     _gang(temp);
 }
Ejemplo n.º 18
0
 /// <summary>
 /// 杠按钮调用
 /// </summary>
 private void ButtonGang()
 {
     SetButton(false, false, false, false);
     UnitTool.ToolStopAllCoroutines();
     Gang(temp);
 }
Ejemplo n.º 19
0
 /// <summary>
 /// 发牌动画
 /// </summary>
 /// <param name="players"></param>
 /// <param name="startIndex"></param>
 /// <returns></returns>
 public void SendMajiangAnimation(List <Player> players)
 {
     UnitTool.ToolStartCoroutine(SendCardCoroutine(players));
 }
Ejemplo n.º 20
0
        //-----------------------------------------------------------------------------
        // Overridden methods
        //-----------------------------------------------------------------------------

        public override void OnBegin(PlayerState previousState)
        {
            player.Movement.MoveCondition = PlayerMoveCondition.OnlyInAir;
            playerTool = player.ToolVisual;
            Swing(player.UseDirection);
        }
Ejemplo n.º 21
0
 /// <summary>
 /// 发牌动画
 /// </summary>
 /// <param name="players"></param>
 /// <param name="startIndex"></param>
 /// <returns></returns>
 public void SendMajiangAnimation(List <MBasePlayer> players)
 {
     UnitTool.ToolStartCoroutine(_sendMajiangCoroutine(players));
 }
Ejemplo n.º 22
0
    /// <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();
    }
Ejemplo n.º 23
0
 /// <summary>
 /// 玩家点击不叫地主
 /// </summary>
 public void PlayerNotClickLord()
 {
     UnitTool.ToolStopAllCoroutines();
     SetHintText("不抢", 0);
     StartForLord();
 }
Ejemplo n.º 24
0
    /// <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();
    }
Ejemplo n.º 25
0
 /// <summary>
 /// 开始叫地主
 /// </summary>
 public override void ToLord()
 {
     clickLord = false;
     //开启思考协程
     UnitTool.ToolStartCoroutine(Considerating(0));
 }
Ejemplo n.º 26
0
 /// <summary>
 /// 开始出牌
 /// </summary>
 public override void StartPlay()
 {
     StartPlayEvent();
     //开始倒计时
     UnitTool.ToolStartCoroutine(Considerating(1));
 }
Ejemplo n.º 27
0
 /// <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));
    }
Ejemplo n.º 29
0
 /// <summary>
 /// 叫地主
 /// </summary>
 public virtual void ToLord()
 {
     //电脑开始思考
     UnitTool.ToolStartCoroutine(Considerating(0));
 }