本帖最后由 我是新手 于 2010-12-20 20:11 编辑 大家一定都经历过这样的状况:假设有两个技能 skill1 和 skill2,某一时刻 skill1 开始释放,释放时间是2秒,但此时skill2在冷却, 其冷却时间为1秒,因此当skill1释放一半时由于skill2冷却结束,又会去释放skill2,这样就造成了冲突,不同游戏会有不同的冲突结果,有 的游戏会不理会skill2的释放,有的游戏会打断skill1,转去释放skill2。 如何解决这个问题? 以下我要介绍的就是技能释放池(通俗点就是数据结构里的队列:先进先出): 定义一个数组skillPool(20),初始化时每项都为-1 假设skill1使用0建释放 释放时间2000毫秒 skill2使用1键释放 释放时间3000毫秒 例如skillPool(1)=48 skillPool(2)=2000 skillPool(3)=49 skillPool(4)=3000 意思:释放skill1 ,延时2000毫秒,释放skill2,延时3000毫秒(相邻两个代表一个技能释放的信息) 但是光有一个数组不够,还需要两个"指针"p和q,他们的初值都附1(第一次接触vbs,貌似数组的起始索引是1) p:指向当前技能释放池中待释放技能 q:指向需释放技能在技能释放池中的插入点 下面来结合例子,说明"指针"p和q的作用: 首先来定义一个技能释放的线程 sub useSkillThread while true delay 5 //判断当前是否有需要释放的技能 if skillPool(p)<>-1 //向指定窗口发送释放skill1的消息 Plugin Bkgnd.KeyPress(hwnd,skillPool(p)) //skill1的释放时间 delay skillPool(p+1) //释放完技能后要清空技能 skillPool(p)=-1 skillPool(p+1)=-1 //指针移向下一个待释放技能 p=(p+2) Mod 20 endif endwhile return 接下来定义一个向技能释放池中添加技能的线程(在实际的游戏wai挂中就是检测当前需要释放哪个技能) sub addSkillThread //这里省略如何检测技能是否准备释放,因为这又得涉及很多,且偏离今天的主题 //假定技能的释放顺序是skill1 skill2 //向技能释放池中添加待释放技能skill1的信息 skillPool(q)=48 skillPool(q+1)=2000 q=q+2 //向技能释放池中添加待释放技能skill2的信息 skillPool(q)=49 skillPool(q+1)=3000 q=q+2 return 通过以上的机制就可以实现:让准备释放的技能排成一个队列,我们从队列同开始逐一释放技能,确保技能释放间没有冲突 其实我还是故意隐蔽的很多细节,例如: 当线程addSkillThread 向skillPool中写入准备释放的技能的信息时(注意同前文,需要写两个信息,一是按键码,而是技能释放时间) 但是正当写完按键码准备写技能释放时间时(注意,此时还没写技能释放时间),由于是多个线程同时执行,cpu把执行权转交给线程 useSkillThread,由于addSkillThread 没有将准备释放技能的信息写完全,会造成技能释放发生错误,这就涉及到线程间同步的问题, 在按键精灵或者说vbs里貌似没有线程同步机制吧,因此得使用操作系统里的信号量机制来解决线程同步,这会涉及到很多。所以以后有时间会 把每个方面都讲解一下。 PS:估计大部分新手都读不懂。但经常写脚本的人可能会理解我的意思。 可以说我现在是重新接触按键精灵,因为很早以前学的那点东西基本全忘记了,几乎是从0开始滴。 现在放寒假了,准备写些脚本赚点零花钱。。呵呵 |
|