机器人的异步代码同步实现

public async Task MoveToAsync(float destX, float destY)

        {

            var x = PlayerEntity.GetProp<float>(CsPropDef.X);

            var y = PlayerEntity.GetProp<float>(CsPropDef.Y);

            var src = new Vector2(x, y);

            var dest = new Vector2(destX, destY);



            var seeks = PathSeeker.GetInstance(SelectedRole.curScence.ToString()).Seek(src, dest);

            if (seeks == null)

                return;

            var pathQueue = new Queue<Vector2>(seeks);



            while (pathQueue.Count != 0)

            {

                dest = pathQueue.Dequeue();

                await MoveToAsync(src, dest);

                src = dest;

            }

        }



        private async Task MoveToAsync(Vector2 src, Vector2 dest)

        {

            MoveTo(src.X, src.Y, dest.X, dest.Y);



            var distance = Vector2.Distance(src, dest);

            var time = (int)(distance * 1.01f / PlayerEntity.GetProp<float>(CsPropDef.RunSpeed));



            await TaskEx.Delay(time + 1);



            PlayerEntity.props[CsPropDef.X] = dest.X;

            PlayerEntity.props[CsPropDef.Y] = dest.Y;

        }



        /// <summary>

        /// 移动到NPC

        /// </summary>

        /// <param name="npcId"></param>

        /// <returns></returns>

        public async Task<ObjId> MoveToNpc(int npcId)

        {

            var pos = GetNpcPos(npcId);

            await MoveToAsync(pos.X, pos.Y);

            var obj = GetObjByIdFromScene(npcId);

            return obj;

        }



        /// <summary>

        /// 移动到怪物并攻击

        /// </summary>

        /// <param name="monsterId"> </param>

        /// <returns></returns>

        public async Task MoveToMonsterAtt(int monsterId)

        {

            var pos = GetNpcPos(monsterId);

            await MoveToAsync(pos.X, pos.Y);

            var obj = GetObjByIdFromScene(monsterId);

            SelectTarget(obj);



            Castskill(GetDefaultSkill());

            //比对杀怪数量

            await MonsterDead();

            await MonsterAttWrong();

        }



        /// <summary>

        /// 打怪失败返回消息

        /// </summary>

        /// <returns>2-距离超出、4-CD中、其他-重新选择目标(目标无敌或者目标无效)</returns>

        private async Task<int> MonsterAttWrong()

        {

            var tcs = new TaskCompletionSource<VarList>();

            EventHandler<DataEventArgs<VarList>> d = (s, e) => tcs.TrySetResult(e.Arg1);

            OnMonsterCannotAttack += d;

            var acc = await tcs.Task;

            OnMonsterCannotAttack -= d;

            return acc.Int32(1);

        }



        /// <summary>

        /// 杀怪完成

        /// </summary>

        /// <returns></returns>

        public async Task MonsterDead()

        {

            var tcs = new TaskCompletionSource<object>();

            EventHandler d = (s, e) => tcs.TrySetResult(s);

            OnMonsterDead += d;

            var acc = await tcs.Task;

            OnMonsterDead -= d;

        }

  

你可能感兴趣的:(同步)