机器人的异步代码同步实现
2012-02-22 09:26
447 查看
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; }
相关文章推荐
- JavaScript文件的同步和异步加载的实现代码
- 分享:FIFO 同步、异步以及Verilog代码实现
- FPGA基础知识12(FIFO 同步、异步以及Verilog代码实现)
- FIFO 同步、异步以及Verilog代码实现
- iOS GCD 同步异步的区别 Swift 代码的简单实现
- 线程的同步异步,以及具体代码实现,使用场景
- 同步异步实现代码小结
- FIFO 同步、异步以及Verilog代码实现
- 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。
- java代码实现加密解密(MD5签名(同步接口))
- 实现Runnable接口的方式卖电影票(同步代码)
- 验证通知是同步还是异步执行....据代码验证,通知其实是一个同步执行的过程,按照通知中心发布通知,然后订阅通知,接收通知step by step
- 伪异步I/O编程及代码实现
- NSURLConnection和NSMutableURLRequest 实现同步、异步请求
- mac下实现代码远程同步
- C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
- C#完整的通信代码(二)(点对点,点对多,同步,异步,UDP,TCP)
- C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
- C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
- 异步FIFO的Verilog代码 DCFIFO实现