mimi_rice 发表于 2015-3-24 14:06:42

秒杀所有类似疾风之刃的创建角色思路

秒杀所有类似疾风之刃的创建角色思路 本文由按键学院提供技术支持
按键学院交流群(1群已满):376122403零基础学按键精灵群(2群):372671254


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





疾风之刃自动登录



《疾风之刃》的自动登录和上一期的XNF的思路流程是一样的,套用进去即可。
上期院刊链接地址:**** Hidden Message *****




创建角色——流程图








脚本界面





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





在该区服已创建过角色







目前疾风之刃有四个大区。
自动登录里,小编做的选区例子选择的是电信一区的幽眠峡谷。
如果之前在这个区服中创建过角色,点击进入游戏,游戏动画播放完之后会进入选频道的界面。


{:4_88:}
那么,问题来了,播放动画很耗时,跳过动画播放的方法是点击游戏窗口按ESC键。
但是,我们在上期的时候提到过,游戏窗口句柄生成并不代表窗口界面已经完全加载好显示出来了。
所以估摸不好,要在什么时候按下ESC键。
性能不好点的电脑,加载游戏的时候,虽然窗口边缘出来了,但是窗口内里还是空的透明的。所以通过找窗口标题条的图片也不得行。
例子中,小编没有跳过动画,而是等动画播放完毕。如果童鞋们有好的解决方法,欢迎跟帖分享~~





所以,选好区服点击 进入游戏 按钮之后,
咱们就开始循环找图,
找选频道界面的这个选择频道按钮。
如果找到了,说明动画已经播放完毕。


{:4_91:}
接着就是绑定窗口了,游戏窗口的类名为"JFZR"
我们就用类名来查找窗口。
与登录窗口不同,游戏窗口是支持后台图色模式的,
测试发现,dx模式可以截取到后台图色。

图色模式:dx模式
鼠标模式:windows模式
键盘模式:windows模式
文本输入:SendString2

本例子中,游戏窗口的分辨率为1280*720,窗口模式。





{:4_87:}

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





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



在该区服未创建过角色


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




我们通过循环找 “生成”按钮,来判断是不是已经到了创建角色界面。

疾风之刃选择角色职业的方式,是靠点击来选择的,点击生成按钮上方的小圈圈选择中意的职业。
每个圈圈之间间隔87个像素点(没有很精确,小编估算了下是87。误差一点没有关系,只要保证四个角色,点击的位置都在有效范围即可。)
第一个职业圈圈的中心点为 500,590.
也就是说,如果我们想要点击第二个的话,要在第一个的基础上,x坐标加上87个像素点,y坐标不变。
第三个的x坐标加上2个87
第四个的x坐标加上3个87

{:4_95:}
我们用列表框来作为职业选择框,列表框的索引起始是0
剑斗士放在第一位,它的索引为0
刃武者第二位,索引为1
控魔师第三位,索引为2
千月姬第四位,索引为3

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


拓展:
有的游戏是通过点击左右键来滚动切换角色,进行角色职业的选择。
角色排列顺序是固定的情况下,我们可以 以默认职业作为基点,计算到自己要创建的角色,需要再此基础上点击多少次右键或者左键才能选到。
通过这样的方式,即可选择要创建的职业。
取名界面






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

{:4_92:}
怎么个随机法呢?

我的命令库——》算法







算法下就有随机取姓名函数
直接调用十分方便。
如果不想随机取中规中矩的姓名,
我们也可以自己设置要随机的名字。

详细内容可参见:**** Hidden Message *****
输入名称之后,点击 创建角色 按钮。


判断名字是否重复





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




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



整体代码






////////////////////////////////////////////////////////////////////////////////
//                              自动登录                        ////////////////
//////////////////////////////////////////////////////////////////////////////
帐号 =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 200
Loop 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 1000
MoveTo x1 + 966, y1 + 565'点击帐号输入框
LeftClick 1



////////////////////////////////////
////      删除之前的帐号    ////////
//////////////////////////////////
For 20
    KeyPress 8,1
Next
For 20
    KeyPress 46,1
Next



////////////////////////////////////
////      输入帐号          ////////
//////////////////////////////////
SayString 帐号



////////////////////////////////////
//// 输入密码、点击 进入游戏 按钮//
//////////////////////////////////
movetox1+974,y1+608'点击密码输入框
LeftClick 1
Delay 1000
Call Lib.键盘.KeyList(密码, 2, 20)'输入帐号

dm.moveto1023,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 200
Loop 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 200
Loop While dm_ret = - 1



////////////////////////////////////
////点击"进入游戏" 按钮    ///////
//////////////////////////////////
dm.moveto 1035,714
dm.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 200
Loop While hwnd = 0
dm_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 1000
dm.moveto 637,653
dm.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 If
Loop While dm_ret = - 1

Endif
///////////////////////////////////////
//////                         ////////
//////////////////////////////////////






//////////////////////////////////////
////// 判断是否在创建角色界面////////
/////////////////////////////////////   
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.ListIndex
x坐标 = 500 + 87 * 职业序号
dm.moveto x坐标, 590
dm.leftclick



////////////////////////////////////////
////////    点击"生成"按钮       ////////
///////////////////////////////////////
Delay 2000
dm.moveto 634,673
dm.leftclick



////////////////////////////////////////
////////    输入随机姓名         ////////
///////////////////////////////////////
rem 输入随机姓名
Call 判断(x1, y1, x2, y2, "输入名字.bmp")
随机姓名 = Lib.算法.随机取姓名()
dm.moveto 566,576 '点击输入框
dm.leftclick
dm.SendString2 hwnd, 随机姓名
Delay 200
dm.moveto 630,670
dm.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
Q文件下载:







**** Hidden Message *****










JolaSia 发表于 2015-3-24 16:38:22

强烈支持楼主ing……

学习辅助 发表于 2015-4-4 14:11:08

强烈支持楼主ing……

一眼万年wb 发表于 2015-4-9 23:26:45

我没有我没有哦

゛永卟分离﹏ 发表于 2015-4-15 09:34:04

我只是看看这个是什么

小圣 发表于 2015-4-15 09:45:10

谢谢楼主分享,支持 海论坛

小圣 发表于 2015-4-15 09:59:43

{:3_59:}支持下

左手の天空 发表于 2015-4-16 19:32:40

非常感谢楼主分享

眼角存留的泪 发表于 2015-4-23 03:01:49

好腻害的样子

卩s团团丨 发表于 2015-4-28 11:27:55

V5,支持楼主!
页: [1] 2 3 4 5
查看完整版本: 秒杀所有类似疾风之刃的创建角色思路