/// <summary>
        // 开始动作
        /// </summary>
        public static void StartAction(DelayAction action)
        {
            DelayActionType nActionID = action.m_DelayActionType;

            switch (nActionID)
            {
            case DelayActionType.DA_BLINK:
            {
                // 闪现
                int        nParams = action.m_Params[0];    // 距离
                GameClient client  = action.m_Client;

                int     nRadius     = nParams * 100;                                          // 半径
                GameMap gameMap     = GameManager.MapMgr.DictMaps[client.ClientData.MapCode]; // 取得地图信息
                int     nDirection  = client.ClientData.RoleDirection;                        // 玩家朝向
                Point   pClientGrid = client.CurrentGrid;                                     // 玩家所在的格子
                int     nGridNum    = nRadius / gameMap.MapGridWidth;                         // 取得半径长度包含的格子数量
                int     nTmp        = nGridNum;

                // 根据当前所在的格子列表、半径  取得范围内的格子数量
                //int nGridWidthNum = nRadius / gameMap.MapGridWidth;
                //int nGridHeightNum = nRadius / gameMap.MapGridHeight;

                //List<Point> lPointsList = Global.GetGridPointByRadius((int)pClientGrid.X, (int)pClientGrid.Y, nGridWidthNum, nGridHeightNum);   // 格子列表
                //int nGridNum = lPointsList.Count;

                // 根据朝向、当前所在格子、将要行进的格子数量  取得前方的格子列表
                List <Point> lMovePointsList = Global.GetGridPointByDirection(nDirection, (int)pClientGrid.X, (int)pClientGrid.Y, nGridNum);

                // 玩家、怪的阻挡设置 将影响能不能到达有人物或者怪的格子
                byte holdBitSet = 0;
                holdBitSet |= (byte)ForceHoldBitSets.HoldRole;
                holdBitSet |= (byte)ForceHoldBitSets.HoldMonster;

                for (int i = 0; i < lMovePointsList.Count; i++)
                {
                    if (Global.InObsByGridXY(client.ObjectType, client.ClientData.MapCode, (int)lMovePointsList[i].X, (int)lMovePointsList[i].Y, 0, holdBitSet))
                    {
                        break;
                    }
                    else
                    {
                        --nGridNum;
                    }
                }

                if (nGridNum < nTmp)
                {
                    pClientGrid = lMovePointsList[nTmp - nGridNum - 1];
                }

                Point canMovePoint = pClientGrid;
                if (!Global.CanQueueMoveObject(client, nDirection, (int)pClientGrid.X, (int)pClientGrid.Y, nGridNum, nGridNum, holdBitSet, out canMovePoint, false))
                {
                    Point clientMoveTo = new Point(canMovePoint.X * gameMap.MapGridWidth + gameMap.MapGridWidth / 2, canMovePoint.Y * gameMap.MapGridHeight + gameMap.MapGridHeight / 2);

                    GameManager.ClientMgr.ChangePosition(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, (int)clientMoveTo.X, (int)clientMoveTo.Y,
                                                         client.ClientData.RoleDirection, (int)TCPGameServerCmds.CMD_SPR_CHANGEPOS, 3);
                }
                else
                {
                    Point clientMoveTo = new Point(lMovePointsList[lMovePointsList.Count - 1].X * gameMap.MapGridWidth + gameMap.MapGridWidth / 2, lMovePointsList[lMovePointsList.Count - 1].Y * gameMap.MapGridHeight + gameMap.MapGridHeight / 2);

                    GameManager.ClientMgr.ChangePosition(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, (int)clientMoveTo.X, (int)clientMoveTo.Y,
                                                         client.ClientData.RoleDirection, (int)TCPGameServerCmds.CMD_SPR_CHANGEPOS, 3);
                }

                List <Object> objsList = Global.GetAll9Clients(client);
                string        strcmd   = string.Format("{0}", client.ClientData.RoleID);
                GameManager.ClientMgr.SendToClients(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, null, objsList, strcmd, (int)TCPGameServerCmds.CMD_SPR_ENDBLINK);

                RemoveDelayAction(action);
            }
            break;

            default:
                break;
            }
        }