多语言展示
当前在线:1344今日阅读:155今日分享:35

疾风之刃脚本:按键精灵自动创建角色

上一期院刊中,我们分享了DNF自动登录的思路,以及代码。今天我们体验下《疾风之刃》的创建角色。并且附带上,《疾风之刃》自动登录代码。
工具/原料

按键精灵2014

方法/步骤
1

疾风之刃自动登录《疾风之刃》的自动登录和上一期的DNF的思路流程是一样的,套用进去即可。

2

创建角色——流程图

3

脚本界面

4

1、Form1.InputBox1    帐号信息。(帐号多,可使用txt方式记录读取)2、Form1.InputBox2    密码信息。3、Form1.ListBox1       角色职业信息。(疾风之刃目前暂时只有四类角色。)4、Form1.OptionBox1  、Form1.OptionBox1 在该区服是否有创建过角色(如果在该区服是第一次建立角色,选择区服登录游戏之后,播放完游戏动画后会直接跳转到创建角色的界面)(如果在该区服已经建立过角色,选择区服登录游戏之后,会跳转到选频道的界面)

5

在该区服已创建过角色

6

目前疾风之刃有四个大区。自动登录里,小编做的选区例子选择的是电信一区的幽眠峡谷。如果之前在这个区服中创建过角色,点击进入游戏,游戏动画播放完之后会进入选频道的界面。那么,问题来了,播放动画很耗时,跳过动画播放的方法是点击游戏窗口按ESC键。但是,我们在上期的时候提到过,游戏窗口句柄生成并不代表窗口界面已经完全加载好显示出来了。所以估摸不好,要在什么时候按下ESC键。性能不好点的电脑,加载游戏的时候,虽然窗口边缘出来了,但是窗口内里还是空的透明的。所以通过找窗口标题条的图片也不得行。例子中,小编没有跳过动画,而是等动画播放完毕。如果童鞋们有好的解决方法,欢迎跟帖分享~~

7

所以,选好区服点击 进入游戏 按钮之后,咱们就开始循环找图,

8

找选频道界面的这个选择频道按钮。如果找到了,说明动画已经播放完毕。接着就是绑定窗口了,游戏窗口的类名为'JFZR'我们就用类名来查找窗口。与登录窗口不同,游戏窗口是支持后台图色模式的,测试发现,dx模式可以截取到后台图色。图色模式:dx模式鼠标模式:windows模式键盘模式:windows模式文本输入:SendString2本例子中,游戏窗口的分辨率为1280*720,窗口模式。

9

选择频道默认选中的是上次登录过的频道。不需去改变它。绑定窗口之后我们点击进入频道进入选角色的界面。

10

循环找图判断 “创建角色” 按钮 是否出现,出现则说明到了选择角色界面。注意:找到创建角色按钮图片的时候,界面并没有完全加载,所以如果找到就马上点击的话,会出现没有响应的情况。在找到创建角色 按钮图片的代码之后,我们可以加点延时。延时过后再点击创建角色按钮 进入创建角色界面。

11

在该区服未创建过角色未创建过角色,在选好区服点击进入游戏之后,游戏动画播放完毕直接进入到创建角色界面。

12

我们通过循环找 “生成”按钮,来判断是不是已经到了创建角色界面。疾风之刃选择角色职业的方式,是靠点击来选择的,点击生成按钮上方的小圈圈选择中意的职业。每个圈圈之间间隔87个像素点(没有很精确,小编估算了下是87。误差一点没有关系,只要保证四个角色,点击的位置都在有效范围即可。)第一个职业圈圈的中心点为 500,590.也就是说,如果我们想要点击第二个的话,要在第一个的基础上,x坐标加上87个像素点,y坐标不变。第三个的x坐标加上2个87第四个的x坐标加上3个87我们用列表框来作为职业选择框,列表框的索引起始是0剑斗士放在第一位,它的索引为0刃武者第二位,索引为1控魔师第三位,索引为2千月姬第四位,索引为3

13

列表框的ListIndex属性,返回的是当前列表框选中项的索引值。x坐标 = 500 + 87 *   Form1.ComboBox1.ListIndex这样,一行代码就可以计算出当前要创建的职业的图标x坐标的值。x坐标的值知道了,y坐标值不变,我们就可以开始点击要创建的职业图标,点击之后会切换职业画面,我们设置个延时,等画面切完之后,点击“生成”按钮

14

拓展:有的游戏是通过点击左右键来滚动切换角色,进行角色职业的选择。角色排列顺序是固定的情况下,我们可以 以默认职业作为基点,计算到自己要创建的角色,需要再此基础上点击多少次右键或者左键才能选到。通过这样的方式,即可选择要创建的职业。n style��os���X��yes'; font-family:微软雅黑; color:rgb(65,105,225); font-size:14px; mso-font-kerning:1px; background:rgb(255,255,255); mso-shading:rgb(255,255,255); ' >切换职业画面,我们设置个延时,等画面切完之后,点击“生成”按钮 �黑; 3`rr���X��68); font-size:14px; mso-font-kerning:1px; background:rgb(255,255,255); mso-shading:rgb(255,255,255); ' >也就是说,如果我们想要点击第二个的话,要在第一个的基础上,x坐标加上87个像素点,y坐标不变。第三个的x坐标加上2个87第四个的x坐标加上3个87我们用列表框来作为职业选择框,列表框的索引起始是0剑斗士放在第一位,它的索引为0刃武者第二位,索引为1控魔师第三位,索引为2千月姬第四位,索引为3

15

取名界面

16

通过循环找 “名称”字样,来判断是不是已经到了取名界面。用dm插件的SendString2命令向输入框输入名称,可以是指定的名称,也可以是随机的。例子中,我们使用随机取名。怎么个随机法呢?我的命令库——》算法

17

算法下就有随机取姓名函数直接调用十分方便。如果不想随机取中规中矩的姓名,我们也可以自己设置要随机的名字。输入名称之后,点击 创建角色 按钮。

18

判断名字是否重复

19

如果取的名字重复了会出现上图中的提示如果名字可以使用,则角色创建成功,会返回到选择角色的界面。

20

所以,我们点击创建角色之后,循环判断上图中的“是”按钮有没有出现(出现则返回到随机取名的步骤,重新取名重新输入。)  同时判断 “创建角色” 按钮是否出现,出现则说明创建成功,脚本结束。

21

整体代码    //////////////////////////////////////////////////////////////////////////////////                              自动登录                        //////////////////////////////////////////////////////////////////////////////////////////////帐号 =  Form1.InputBox1.Text 密码 = Form1.InputBox2.Text    ////////////////////////////////////   释放附件、注册大漠等  /////////////////////////////////////////PutAttachment 'D:\test','*.*''释放附件Call register()'调用注册大漠子程序 dm_ret = dm.SetDict(0, 'test.txt')'加载字库RunApp 'E:\疾风之刃\TCLS\Client.exe''启动游戏    ////////////////////////////////////////    查找登录窗口句柄     ///////////////////////////////////////////Do    hwnd = Plugin.Window.find(0, '疾风之刃登录程序') '查找登录窗口句柄    Delay 200Loop While hwnd = 0   ////////////////////////////////////////      绑定窗口句柄       ///////////////////////////////////////////dm_ret = dm.BindWindow(hwnd,'normal','windows','windows',0)'绑定窗口dm_ret = dm.GetClientRect(hwnd, x1, y1, x2, y2)'获取窗口客户区大小    ////////////////////////////////////////  判断是否在帐号输入界面 //////////////////////////////////////////Call  判断(x1, y1, x2, y2, '判断是否在帐号输入界面.bmp')Rem 输入帐号密码Delay 1000MoveTo x1 + 966, y1 + 565'点击帐号输入框LeftClick 1   ////////////////////////////////////////      删除之前的帐号    //////////////////////////////////////////For 20    KeyPress 8,1 NextFor 20    KeyPress 46,1Next   ////////////////////////////////////////      输入帐号          //////////////////////////////////////////SayString 帐号   //////////////////////////////////////// 输入密码、点击 进入游戏 按钮  ////////////////////////////////////moveto  x1+974,y1+608  '点击密码输入框LeftClick 1Delay 1000Call Lib.键盘.KeyList(密码, 2, 20)'输入帐号 dm.moveto  1023,725'点击 进入游戏 按钮dm.LeftdoubleClick    //////////////////////////////////////  判断是否在选区界面、选区   /////////////////////////////////////////Do    dm_ret = dm.FindStr(x1, y1, x2, y2,'电信一区','ffffff-000000',1.0,intX,intY)    If intX >= 0 and intY >= 0 Then         dm.moveto intx, inty        dm.leftclick     '点击'电信一区'     End If    Delay 200Loop While dm_ret = - 1 Do    dm_ret = dm.FindStr(x1, y1, x2, y2,'幽眠峡谷','ffffff-000000',1.0,intX,intY)    If intX >= 0 and intY >= 0 Then         dm.moveto intx, inty        dm.leftclick     '点击'幽眠峡谷'     End If    Delay 200Loop While dm_ret = - 1    ////////////////////////////////////////  点击'进入游戏' 按钮    /////////////////////////////////////////dm.moveto 1035,714dm.leftclick    ////////////////////////////////////////    判断登录是否成功    //////////////////////////////////////////Do    ' 查找 密码错误  界面     dm_ret = dm.FindPic( x1, y1, x2, y2,'确定.bmp','000000',0.9,0,intX,intY)    If intX >= 0 and intY >= 0 Then         Delay 1000        dm.moveto intX, intY        dm.leftclick         Goto 输入帐号密码  '出现错误提示,点击确定按钮之后,重新开始输入帐号密码        Exit Do    End If    '查找创建角色窗口句柄        hwnd = Plugin.Window.find('JFZR',0)         Delay 200Loop While hwnd = 0dm_ret = dm.UnBindWindow() '解绑登录窗口      //////////////////////////////////////////////////////////////////////////////////////////                             创建角色                         //////////////////////////////////////////////////////////////////////////////////////////////////    ///////////////////////////////////////////////////////////////////////// 该区服已创建过角色,则执行选频道操作。未创建过则不选频道    /////////////////////////////////////////////////////////////////////If Form1.OptionBox1.Value = 1 Then     /////////////////////////////////////////  判断是否在选择频道界面     ////////////////////////////////////////////Call 判断(0, 0, 2000, 2000, '选择频道界面.bmp')   ////////////////////////////////////////////      绑定窗口句柄       ////////////////////////////////////////dm_ret = dm.BindWindow(hwnd,'dx','windows','windows',0)'绑定窗口dm_ret = dm.GetClientRect(hwnd, x1, y1, x2, y2)'获取窗口客户区大小    /////////////////////////////////////////     点击 选择频道  按钮     ////////////////////////////////////////////Delay 1000dm.moveto 637,653dm.leftclick     ////////////////////////////////////////////  查找创建角色按钮        //////////////////////////////////////////// Do    dm_ret = dm.FindPic( x1, y1, x2, y2,'创建角色.bmp','000000',0.9,0,intX,intY)    If intX >= 0 and intY >= 0 Then         Delay 2000        dm.moveto intX, intY        dm.leftclick              Exit Do    End IfLoop While dm_ret = - 1  End  if /////////////////////////////////////////////                         //////////////////////////////////////////////      //////////////////////////////////////////// 判断是否在创建角色界面  /////////////////////////////////////////////   Call 判断(0, 0, 2000, 2000, '判断是否在创建角色界面.bmp')   ////////////////////////////////////////////      绑定窗口句柄       ////////////////////////////////////////dm_ret = dm.BindWindow(hwnd,'normal','windows','windows',0)'绑定窗口dm_ret = dm.GetClientRect(hwnd, x1, y1, x2, y2)'获取窗口客户区大小   ////////////////////////////////////////////////      点击职业图标      ///////////////////////////////////////////////  职业序号= Form1.ComboBox1.ListIndexx坐标 = 500 + 87 * 职业序号dm.moveto x坐标, 590dm.leftclick    ////////////////////////////////////////////////    点击'生成'按钮       ///////////////////////////////////////////////  Delay 2000dm.moveto 634,673dm.leftclick    ////////////////////////////////////////////////    输入随机姓名         ///////////////////////////////////////////////  rem 输入随机姓名 Call 判断(x1, y1, x2, y2, '输入名字.bmp')随机姓名 = Lib.算法.随机取姓名()dm.moveto 566,576 '点击输入框dm.leftclick dm.SendString2 hwnd, 随机姓名Delay 200dm.moveto 630,670dm.leftclick     ////////////////////////////////////////////////   判断名字是否被占用    ///////////////////////////////////////////////  Do    dm_ret = dm.FindPic( x1, y1, x2, y2,'名字被占用.bmp','000000',0.9,0,intX,intY)    If intX >= 0 and intY >= 0 Then         Delay 1000        dm.moveto intX, intY        dm.leftclick         Goto 输入随机姓名  '出现错误提示,点击确定按钮之后,重新开始输入随机姓名        Exit Do    End If        ks = dm.FindPic( x1, y1, x2, y2,'创建角色.bmp','000000',0.9,0,intX,intY)Loop While ks = - 1    //////////////////////////////////////////////   '判断图片是否存在'子程序    ///////////////////////////////////////////  Sub 判断(x, y, x2, y2,图片名称)    Do        dm_ret = dm.FindPic(x1, y1, x2, y2,图片名称,'000000',0.9,0,intX,intY)        Delay 200    Loop While dm_ret = - 1 End Sub    //////////////////////////////////////////////        注册大漠          ///////////////////////////////////////////////  Sub register()    Set ws = createobject('Wscript.Shell')    ws.run 'regsvr32 atl.dll /s'    Set ws = nothing    call Plugin.RegDll.Reg ( 'D:\test\dm.dll')    Set dm = createobject('dm.dmsoft')    ver = dm.ver()    If len(ver) = 0 Then        MessageBox '插件注册失败,检查系统是否禁用了vbs脚本权限'        EndScript    End If    dm.SetPath 'D:\test'End Sub    //////////////////////////////////////////////      '脚本停止子程序'     ///////////////////////////////////////////////  Sub OnScriptExit()    dm_ret = dm.UnBindWindow() //解绑窗口End Sub

推荐信息