- 初中三年级
- 2220985
- 396
- 0
- 532 朵
- 2506 个
- 334 个
- 480
- 2013-10-27
|
1#
t
T
发表于 2015-02-09 15:14
|
|只看楼主
拳皇战斗脚本——模拟出招成功率百分百 本文由按键学院提供技术支持
按键学院交流群(1群已满):376122403 零基础学按键精灵群(2群):372671254
目前官方正在举办的 “第二届脚本大赛”已经结束。 这次的大赛主题是“拳皇” 看小伙伴们脚本写的火热,我们风骚的06工程师也忍不住写了个战斗脚本 据说,此脚本非常牛逼,能成功模拟拳皇里百分之百的招式动作
有没有这么厉害啊? 小伙伴们和小编一起去来欣赏下06老湿的骚姿吧~
|
|
前言
拳皇游戏里的招式,按键的情况大致分为三种:
1、- keyDown方向键
- keypress 技能键
- keyup方向键
复制代码 2、- keypress 方向键
- keypress 技能键
复制代码 3、- keydown 技能键1
- keydown 技能键2
- keyup 技能键1
- 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,无延时。
上面我们说的八神的八稚女招式要如何调用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函数
此函数也是两个参数 参数1:需要操作的键 参数2:真假 |
此函数在对方向键进行操作之前会先判断方向键是按下还是弹起的状态, 例如: 上次按下了方向键左没有松开 先判断方向键左有没有被按下 如果有,则进一步判断新一次的操作需不需要按下方向键左,如果需要则不松开,不需要则松开
整体代码
- 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
- // 设置按键状态
- Select Case KeyChr
- Case "8"
- KeyStkS_8 = True
- Case "2"
- KeyStkS_2 = True
- Case "4"
- KeyStkS_4 = True
- Case "6"
- KeyStkS_6 = True
- Case "7"
- KeyStkS_4 = True
- KeyStkS_8 = True
- Case "9"
- KeyStkS_6 = True
- KeyStkS_8 = True
- Case "1"
- KeyStkS_2 = True
- KeyStkS_4 = True
- Case "3"
- KeyStkS_2 = True
- KeyStkS_6 = True
- End Select
- // 开始按键
- If KeyStkS_8 Then Call dm.KeyDown(87)
- If KeyStkS_2 Then Call dm.KeyDown(83)
- If KeyStkS_4 Then Call dm.KeyDown(iif(PlayPos=1, 68, 65))
- If KeyStkS_6 Then Call dm.KeyDown(iif(PlayPos=1, 65, 68))
- Else
- // 恢复按键
- If KeyStkS_8 Then Call dm.KeyUp(87)
- If KeyStkS_2 Then Call dm.KeyUp(83)
- If KeyStkS_4 Then Call dm.KeyUp(iif(PlayPos=1, 68, 65))
- If KeyStkS_6 Then Call dm.KeyUp(iif(PlayPos=1, 65, 68))
- KeyStkS_8 = False
- KeyStkS_2 = False
- KeyStkS_4 = False
- KeyStkS_6 = False
- End If
- End Function
- // 输入指令
- Function InputKey(KeyChr, KeyStk)
- // 设置键位状态
- KeyStkN_8 = False
- KeyStkN_2 = False
- KeyStkN_4 = False
- KeyStkN_6 = False
- Select Case KeyChr
- Case "8" // ↑
- KeyStkN_8 = True
- Case "4" // ←
- KeyStkN_4 = True
- Case "6" // →
- KeyStkN_6 = True
- Case "2" // ↓
- KeyStkN_2 = True
- Case "7" // ↖
- KeyStkN_8 = True
- KeyStkN_4 = True
- Case "9" // ↗
- KeyStkN_8 = True
- KeyStkN_6 = True
- Case "1" // ↙
- KeyStkN_2 = True
- KeyStkN_4 = True
- Case "3" // ↘
- KeyStkN_2 = True
- KeyStkN_6 = True
- End Select
- // 释放旧按键
- If KeyStkO_8 Then
- If KeyStkN_8 = False Then
- Call dm.KeyUp(87)
- TracePrint "释放 ↑"
- End If
- End If
- If KeyStkO_2 Then
- If KeyStkN_2 = False Then
- Call dm.KeyUp(83)
- TracePrint "释放 ↓"
- End If
- End If
- If KeyStkO_4 Then
- If KeyStkN_4 = False Then
- Call dm.KeyUp(iif(PlayPos=1, 68, 65))
- TracePrint "释放 ←"
- End If
- End If
- If KeyStkO_6 Then
- If KeyStkN_6 = False Then
- Call dm.KeyUp(iif(PlayPos=1, 65, 68))
- TracePrint "释放 →"
- End If
- End If
- // 按下新按键
- If KeyStkN_8 Then
- If KeyStkO_8 = False Then
- Call dm.KeyDown(87)
- TracePrint "按下 ↑"
- End If
- End If
- If KeyStkN_2 Then
- If KeyStkO_2 = False Then
- Call dm.KeyDown(83)
- TracePrint "按下 ↓"
- End If
- End If
- If KeyStkN_4 Then
- If KeyStkO_4 = False Then
- Call dm.KeyDown(iif(PlayPos=1, 68, 65))
- TracePrint "按下 ←"
- End If
- End If
- If KeyStkN_6 Then
- If KeyStkO_6 = False Then
- Call dm.KeyDown(iif(PlayPos=1, 65, 68))
- TracePrint "按下 →"
- End If
- End If
- // 备份键位状态
- KeyStkO_8 = KeyStkN_8
- KeyStkO_2 = KeyStkN_2
- KeyStkO_4 = KeyStkN_4
- KeyStkO_6 = KeyStkN_6
- // 点击命令键
- Select Case KeyChr
- Case "A" // 轻拳
- If KeyStk Then
- Call dm.KeyDown(74)
- TracePrint "按下 A"
- Else
- Call dm.KeyUp(74)
- TracePrint "释放 A"
- End If
- Case "B" // 轻脚
- If KeyStk Then
- Call dm.KeyDown(75)
- TracePrint "按下 B"
- Else
- Call dm.KeyUp(75)
- TracePrint "释放 B"
- End If
- Case "C" // 重拳
- If KeyStk Then
- Call dm.KeyDown(76)
- TracePrint "按下 C"
- Else
- Call dm.KeyUp(76)
- TracePrint "释放 C"
- End If
- Case "D" // 重脚
- If KeyStk Then
- Call dm.KeyDown(85)
- TracePrint "按下 D"
- Else
- Call dm.KeyUp(85)
- TracePrint "释放 D"
- End If
- End Select
- Delay 30
- End Function
- // iif 函数
- Function iif(tz_var_exp, tz_var_true, tz_var_false)
- If tz_var_exp Then
- iif = tz_var_true
- Else
- iif = tz_var_false
- End If
- End Function
- //注册大漠
- Sub Register()
- Set ws = CreateObject("Wscript.Shell")
- ws.run "regsvr32 atl.dll /s",1,True
- Set ws = Nothing
- PutAttachment "c:\tz_kof", "*"
- PutAttachment ".\Plugin" ,"RegDll.dll"
- Call Plugin.RegDll.Reg("c:\tz_kof\dm.dll")
- Set dm = CreateObject("dm.dmsoft")
- ver = dm.ver()
- If len(ver) = 0 Then
- MessageBox "插件注册失败,检查系统是否禁用了vbs脚本权限"
- EndScript
- End If
- End Sub
- Sub OnScriptExit()
- Call dm.UnBindWindow()
- End Sub
复制代码 Q文件下载:- 您所在的用户组无法下载或查看附件
本文由按键学院提供技术支持 【招生】主流回合制常见功能网络辅助教学——你懂得!
|