约吗?相约决战拳皇

社区服务
高级搜索
猴岛论坛辅助工具约吗?相约决战拳皇
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
0个回复

约吗?相约决战拳皇

楼层直达
mimi_rice

ZxID:55494225

等级: 上士
举报 图酷模式  只看楼主 使用道具 楼主   发表于: 2015-02-10 0
— (韓小柒。) 请及时补充查毒链接

该辅助无查毒链接,请各位会员谨慎下载 (2015-02-14 18:23) —
[content too large, truncated for display]



约吗?相约决战拳皇
本文按键学院提供技术支持

按键学院交流群(1群已满):376122403
零基础学按键精灵群(2群):372671254
引用

目前官方正在举办的 “第二届脚本大赛”已经结束。
这次的大赛主题是“拳皇”
看小伙伴们脚本写的火热,我们风骚的06工程师也忍不住写了个战斗脚本
据说,此脚本非常牛逼,能成功模拟拳皇里百分之百的招式动作


有没有这么厉害啊?
小伙伴们和小编一起去来欣赏下06老湿的骚姿吧~





前言


   拳皇游戏里的招式,按键的情况大致分为三种:

1、
  1. keyDown方向键
  2. keypress 技能键
  3. keyup方向键
2、
  1. keypress 方向键
  2. keypress 技能键
3、
  1. keydown 技能键1
  2. keydown 技能键2
  3. keyup 技能键1
  4. keyup 技能键2
       而且,招式不同,延时也是不一样的,这个招式50毫秒可以连贯发出,那个招式可能需要100毫秒
       有这么多状况,那么怎样才能写出兼容性百分百的出招脚本呢?我们继续往下看。



脚本流程



绑定游戏


引用
脚本使用了大漠插件,先注册大漠插件之后进行绑定游戏


查找游戏窗口句柄


    使用大漠的 FindWindow 命令来查找游戏窗口句柄
   FindWindow命令是模糊查找
    当要查找的窗口句柄,类名或者标题有一部分不固定会变化的时候,我们可以使用FindWindow命令进行模糊查找

    例如许多类名为Afx:¥%#¥……%#¥ 的窗口,Afx后面的值通常都是变化的
    研究了下,拳皇里的这个类名倒是不会变化,但是为了安全起见,咱们还是模糊查找吧。
  



角色定位



引用
角色在左边和角色在右边时,出招里的方向键是不一样的,所以需要判断下角色当前是在什么位置。那么,要如何判断呢?



     我媚静舟察游戏里的角色动作,站着、蹲着、或者摆一个招式的时候,总有一些地方是不会变化的。
     这里我们选择蹲着,因为蹲着相较于其他动作静态,便于识别。


  


     八神蹲着的时候,上半身是会动的,所以截取八神大腿部分的一小块图片。
    同理,我们把角色移动到右边,蹲下,截取一张八神大腿图。
     启动脚本之后,我们先按下下蹲键也就是S,蹲下后进行找图判断,

    如果找到的是左边截取到的八神大腿图,那么就说明八神在左边,
    如果找到的是右边截取到的八神大腿图,那么就说明八神在右边。


小技巧
     当我们测试的时候,游戏里的人物如果会反抗的话,非常影响调试,所以我们可以按下 Alt+c组合键
     把p2设置为攻击无效,这样我们就可以毫无顾忌进行调试了

  
调用InputKeys函数




InputKeys函数用于分析按键,是按下按住还是松开
用键盘 WASD来操作方向,很多招戳不出来。为什么呢?
键盘WASD和摇杆不同,例如:
禁千二百十一式·八稚女:↓↘→↘↓↙←+A或C
八神的这一招八稚女,用摇杆摇就是 下、右下、右、右下、下、左下、左、A或者C
但是,在键盘上操作的话,右下这个操作我们需要同时按下S和D,左下需要同时按下WA
既然键盘WASD操作起来这么麻烦
我们就来模拟摇杆







         我们将5想象成摇杆的杆子
        
          那么,4、6、8、2就分别是左、右、上、下 (键盘操作:A、 D 、W 、S)
          7、9、1、3 对应左上、右上、左下、右下
键盘操作:WA、WD、 AS、DS)
          技能键为:A、B、C、D
对应轻拳、轻脚、重拳、重脚 (键盘操作:J、K、L、U)
          注意:我们并不是要在小键盘上按键,而是借用小键盘来更好的理解模拟摇杆的操作
                     而实际上,我们应用到的只是 1到9的这几个数字
                     当输入4的时候,经过函数的判断处理,按下的则是A键

                     当按下A键时,经过函数的判断处理,则按下J键




InputKeys函数
  语法:    Call InputKeys("+/-方向键,+/-技能键,延时")
             方向键和技能键前
             加上+号:按住方向键或者技能键不放
             加上-号 :松开方向键或者技能键
             无符号  :按下方向键或者技能键

          如果有多个操作,操作于操作之间用|线连接
          例如八神的横踢动作:
          
          这个动作需要按住方向键S不放,再按下技能键U,按完技能键U之后再松开S键
          如果,按下S键马上放开再去按J键,招式就发不出。

        
          好了,我们前面说用数字1到9来模拟摇杆的方向
          用 ABCD模拟技能键JKLU


          那么,我们调用InputKeys函数:
          Call InputKeys("+2,,100|,D,800|-,,0")
         第一个动作下蹲:
              +2,,100:第一个参数+2,+代表按住不放,按住方向键(下)不放。
                       第二个参数空着,说明这里不按技能键。
                       第三个参数100,下蹲动作操作完之后延时100毫秒再执行下一个动作。

         第二个动作重脚:
               ,D,800:第一个参数空着,说明这里不按方向键。
                       第二个参数D,按下技能键(重脚)。
                       第三个参数800,重脚动作操作完之后延时800毫秒再执行下一个动作。


         第三个动作松开前面按下的所有方向键:
                -,,0第一个参数-,-后面没有填写确切的方向键则说明松开所有的方向键。
                      第二个参数空着,说明没有任何技能键操作。
                      第三个参数0,无延时。



{:4_89:}
        上面我们说的八神的八稚女招式要如何调用
inputkeys函数呢?
        八神的八稚女:↓↘→↘↓↙←+A或C

        调用inputkeys函数:
        Call InputKeys("2363214,A,1200")
        



InputKeys函数





          将传进来的参数进行分解:

           先用split函数 按照 竖线|”将   +2,,100|,D,800|-,,0   分解成三个部分存放在数组里
           然后在针对数组元素,例如数组(0)中存放的是   +2,,100
           用split函数 按照 逗号,”将   +2,,100   分解成三个部分存放在三个变量中:KeyStr、KeyCmd、KeySlp
            
           然后用字符串截取函数Left截取三个变量里存放的字符串的第一个字符
           如果方向键有符号则调用 StateKey函数
           如果技能键有符号/没符号、
方向键无符号则调用InputKey函数



StateKey函数






此函数有两个参数
参数1:需要操作的方向键
参数2:真假
参数2为真,则按下参数1中的方向键  
参数2为假,则松开参数1中的方向键




  
      

InputKey函数

  


[table=98%,#8FBC8,,1][/table]
引用
此函数也是两个参数
参数1:需要操作的键
参数2:真假


                    此函数在对方向键进行操作之前会先判断方向键是按下还是弹起的状态,
                    例如: 上次按下了方向键左没有松开
                            先判断方向键左有没有被按下
                            如果有,则进一步判断新一次的操作需不需要按下方向键左,如果需要则不松开,不需要则松开



整体代码
  


[table=98%,#8FBC8,,1][/table][code]Dim Player                                // 角色 : 八神、火舞、胖子、雅典娜
Dim PlayPos                                // 0 = 左 、 1 = 右 、 -1 = 未知
Dim KeyStkN_8, KeyStkN_2, KeyStkN_4, KeyStkN_6        // 需要按下的按键
Dim KeyStkO_8, KeyStkO_2, KeyStkO_4, KeyStkO_6        // 需要释放的按键
Dim KeyStkS_8, KeyStkS_2, KeyStkS_4, KeyStkS_6        // 独立控制的按键


Call Register()
Call dm.SetPath("c:\tz_kof")
Call dm.SetShowErrorMsg(0)

// 绑定游戏窗口
hwnd = dm.FindWindow("Afx:", "Kawaks")
Call dm.SetWindowState(hwnd, 12)
Call dm.BindWindowEx(hwnd, "gdi", "normal", "normal", "dx.public.active.api|dx.public.active.message", 0)

Player = "八神"
/*---------------------------出招---------------------------*/
'/* 八神
        Do
                // 重新定位角色方向
                Call PlayerPos()
                // 轻拳
                Call InputKeys("6,D,0|+1,,300|-,,0")
                // 梦弹
                Call InputKeys("+6,A,50|,A,100|-,,0|+1,,400|-,,0")
                // 八稚女近身
                Call InputKeys("2363214,A,0|+1,,1000|-,,0")
                // 琴月d阴近身
                Call InputKeys("63214,B,0|+1,,800|-,,0")
                // 三段葵花
                Call InputKeys("214,A,60|214,A,60|214,A,60|214,A,60|214,A,0|+1,,300|-,,0")
                // 下蹲重脚
                Call InputKeys("+2,,60|,D,200|-,,0|+1,,600|-,,0")
                // 暗勾手 + 三发琴月阴抢开
            Call InputKeys("63214,B,0|+1,,1600|-,,0")
                Call InputKeys("63214,B,0|+1,,1600|-,,0")
                Call InputKeys("63214,B,0|+1,,1600|-,,0")
            // 三段葵花
            Call InputKeys("214,A,60|214,A,60|214,A,60|214,A,60|214,A,0|+1,,800|-,,0")
        Loop
'*/
/*---------------------------出招---------------------------*/


// 角色定位
Function PlayerPos()
        dm.KeyDown 83
        Delay 400
        PlayPos = dm.FindPic(0, 0, 610, 450, Player & "_定位_左.bmp|" & Player & "_定位_右.bmp", "000000", 0.9, 0, intX, intY)
        Select Case PlayPos
                Case 0
                        TracePrint "角色在左侧"
                Case 1
                        TracePrint "角色在右侧"
                Case Else
                        TracePrint "无法识别角色方向"
        End Select
        dm.KeyUp 83
        Delay 100
End Function


// 指令串解析
Function InputKeys(KeyList)
        KeyStu = Split(KeyList, "|")
        For j = 0 To UBound(KeyStu)
                KeyStr = Split(KeyStu(j), ",")(0)        // 方向键
                KeyCmd = Split(KeyStu(j), ",")(1)        // 指令键
                KeySlp = Split(KeyStu(j), ",")(2)        // 延时
                // 解析方向控制 [状态指令还是连贯指令]
                Select Case Left(KeyStr,1)
                        Case "+"        // 状态指令输入
                                KeyStr = Replace(KeyStr, "+", "")
                                For i = 1 To Len(KeyStr)
                                        KeyChr = Mid(KeyStr, i, 1)
                                        Call StateKey(KeyChr, True)
                                Next
                        Case "-"        // 状态指令取消 [后面的指令连贯输入]
                                KeyStr = Replace(KeyStr, "-", "")
                                Call StateKey(KeyChr, False)
                                For i = 1 To Len(KeyStr)
                                        KeyChr = Mid(KeyStr, i, 1)
                                        Call InputKey(KeyChr, False)
                                Next
                        Case Else        // 连贯指令输入
                                For i = 1 To Len(KeyStr)
                                        KeyChr = Mid(KeyStr, i, 1)
                                        Call InputKey(KeyChr, False)
                                Next
                End Select
                // 控制按键
                Select Case Left(KeyCmd, 1)
                        Case "+"        // 状态指令输入
                                KeyCmd = Replace(KeyCmd, "+", "")
                                For i = 1 To Len(KeyCmd)
                                        KeyChr = Mid(KeyCmd, i, 1)
                                        Call InputKey(KeyChr, True)
                                Next
                        Case "-"        // 状态指令取消 [后面的指令连贯输入]
                                KeyCmd = Replace(KeyCmd, "-", "")
                                For i = 1 To Len(KeyCmd)
                                        KeyChr = Mid(KeyCmd, i, 1)
                                        Call InputKey(KeyChr, False)
                                Next
                        Case Else        // 连贯指令输入
                                For i = 1 To Len(KeyCmd)
                                        KeyChr = Mid(KeyCmd, i, 1)
                                        Call InputKey(KeyChr, True)
                                Next
                                For i = 1 To Len(KeyCmd)
                                        KeyChr = Mid(KeyCmd, i, 1)
                                        Call InputKey(KeyChr, False)
                                Next
                End Select
                Delay CLng(KeySlp)
        Next
End Function

// 输入状态指令
Function StateKey(KeyChr, KeyStk)
        If KeyStk Then
                // 设置按键状态
      
[ 此帖被mimi_rice在2015-02-10 15:43重新编辑 ]
附件: tz_拳皇.rar (774 K) 下载数:0
« 返回列表
发帖 回复