[content too large, truncated for display]
约吗?相约决战拳皇
本文由按键学院提供技术支持
零基础学按键精灵群(2群):372671254
前言
拳皇游戏里的招式,按键的情况大致分为三种:1、- keyDown方向键
- keypress 技能键
- keyup方向键
2、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,无延时。 {: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重新编辑 ]