分享

【新提醒】关于技能释放冲突问题的解决【荐】1

 淳爷们 2013-08-28
 本帖最后由 我是新手 于 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开始滴。
   现在放寒假了,准备写些脚本赚点零花钱。。呵呵

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多