按键精灵游戏脚本开发教程:自动逛地图打怪
来源:按键学院【按键精灵】
学院实战班目前在教授的是回合制游戏《神武》的脚本功能
小编凑热闹,也跟着去玩了玩
今天在这里和大家分享下,自动战斗功能的脚本编写
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
~
流程
1、打开地图(快捷键Tab)
2、随机点击地图上的坐标点
3、如果遇到怪物则打怪(自动打怪快捷键Ctrl+A)
技术难点:
1、随机移动过程中,如何判断人物是否已经移动到了指定坐标点。
2、随机点击一组坐标的实用写法。
绑定游戏窗口
今天我们要写的脚本有使用到大漠插件。
因为是多开脚本,所以查找句柄使用的是Search命令
后台绑定模式:
图色模式:dx3
鼠标模式:dx
键盘模式:dx
关于Search命令的详细说明以及大漠绑定模式如何获知
请参阅相关院刊:
【院刊】-【201501期】沙盘后台绑定游戏
打开地图
《神武》游戏支持点击大地图进行移动的方式。打开地图的快捷键为Tab键。
为了避免地图已经打开的情况
我们要先判断地图有没有打开,没有打开的话才去按Tab键打开地图
这里要注意一点
那就是,地图没打开的情况下有两种情况
1、没进入战斗画面
2、进入了战斗画面
所以,打开地图的判断步骤如下
1、地图没打开——>在不在战斗画面?
在战斗画面——>开始战斗
不在战斗画面——>打开地图——>随机点击地图上的坐标点
2、地图打开了——>人物在不在移动?
在移动(说明还没到目的坐标)——> 不做任何操作
不在移动(说明到了目的坐标或者遇到了阻碍物停止了移动)——> 点击下一个随机坐标
本例子中,是通过找图方式来判断地图窗口是否出现
小编找的是红框框里的图片
蓝色框的区域里,经常会出现系统的横条提示信息,会遮挡住地图框影响找图,所以不取那个区域里的图片
随机点击地图上的坐标点
在QUI上画一个文本输入框
输入框里的内容为要移动的坐标信息
坐标与坐标之间用| 隔开
随后在脚本中,我们读取文本输入框的内容
读取之后用分割函数split依据 | 分隔符将其分割
Split函数分割之后,会将分割的内容存放在数组里
这里注意下
通过第一次分割,假如数组(0) 存放的是:28,29
dm.MoveTo 数组(0)
这样写显然是错误的,会提示参数个数不对,那怎么办呢?
不怕,我们有Execute函数
Execute "dm.MoveTo " & 数组(0)
这样写就可以执行了
然后,我们前面说的要随机点
只要将数组下标进行随机就可以了
例如:
Execute "dm.MoveTo " & 数组( Int(10* Rnd))
关于Execute函数、随机函数的详细内容
请参阅相关院刊
【院刊】-【201410期】神奇的Execute语句
【院刊】-【201411期】细说Rnd随机函数
随机点完地图的坐标,就等着人物移动过去
那怎么才能知道人物已经到了那个点了呢?
这就要用到大漠的IsDisplayDead函数了
当人物在移动的过程中,坐标肯定在不停的变化,当坐标一段时间不变
则说明已经到了目的地,
或者前方有障碍物过不去
不管是到了目的地还是有障碍物过不去
我们的处理方式都是点击下一个随机坐标点
所以,我们使用IsDisplayDead 函数监视坐标的变化即可
但是!在战斗画面里,坐标是一直不变的
所以,利用 IsDisplayDead 函数监视坐标变化时,我们要先排除战斗画面,在战斗画面我们就不做监视操作。
遇到怪物则打怪
小编的号是新号,所以选择的是《清河镇外》这个0-10级的练级地图,
在这个地图里走来走去,在走动的过程,走着走着就会进入战斗画面
小编是通过判断红框里的那个黄色三角形,来判断到了战斗画面了没如果到了,则按下Ctrl+A键开始自动战斗
代码
Global Hwnd
Call 注册大漠()
HwndEx = Plugin.Window.Search("神武- ")
arr1 = split(HwndEx, "|")
For i = 0 To UBound(arr1) - 1
TracePrint arr1(i)
Hwnd = arr1(i)
线程ID = BeginThread(主程序)
Next
Sub 主程序()
句柄= Hwnd
Set dm = createobject("dm.dmsoft")
dm_ret = dm.setpath("c:\test_game")
dm_ret = dm.bindwindow(句柄, "dx3", "dx", "dx", 0)
If dm_ret = 1 Then
TracePrint "绑定窗口成功"
Do
'判断地图是否打开
If 找图(101,491,143,536, "地图.bmp") = "没找到" Then
Delay 1800
'判断是否有在战斗界面
If 找图(518,1,558,30,"战斗.bmp") = "找到" Then
'自动出招(Ctrl+A)
dm.KeyDown 17
Delay 20
dm.KeyPress 65
Delay 20
dm.KeyUp 17
Do
If 找图(518,1,558,30,"战斗.bmp") = "没找到" Then
Exit Do
End If
Loop
Else
TracePrint "不在战斗画面"
Call 逛地图()
End If
Else
'判断是否停下来
If (dm.IsDisplayDead(112, 6, 190, 21, 3) = 1) and (找图(518,1,558,30,"战斗.bmp") = "没找到") Then TracePrint "不走了"
Call 逛地图()
Else
TracePrint "行走中"
End If
End If
Delay 300
Loop
Else
TracePrint "绑定失败"
End If
End Sub
Function 找图(x1, y1, x2, y2, 图片)
dm_ret = dm.FindPic(x1, y1, x2, y2,图片,"000000",0.9,0,intX,intY)
If intX >= 0 and intY >= 0 Then
找图= "找到"
Else
找图= "没找到"
End If
End Function
Function 逛地图()
Do
If 找图(101,491,143,536, "地图.bmp")="找到" Then Exit Do
Else
'打开地图窗口
TracePrint "打开地图窗口"
dm.KeyPress 9
Delay 300
End If
Delay 300
Loop
'随机点击一组坐标
坐标组= split(form1.inputbox1.text, "|")
随机元素= 随机(0, UBound(坐标组))
TracePrint 坐标组(随机元素)
Execute "dm.MoveTo " & 坐标组(随机元素)
Delay 20
dm.LeftClick
End Function
Function 随机(最小值, 最大值)
Randomize
随机= Int((最大值- 最小值+ 1) * Rnd + 最小值) End Function
Function 注册大漠()
Dim i
'释放附件内容
PutAttachment "C:\test_game", "*.*"
Set ws = createobject("Wscript.Shell")
For i = 0 To 20
'注册atl跟dm插件
ws.run("regsvr32 atl.dll -s")
ws.run ("regsvr32 C:\test_game\dm.dll -s")
Delay 200
Set ws = nothing
Set dm = createobject("dm.dmsoft")
ver = dm.ver()
'输出版本号
If ver <> "" Then
Exit For
End If
Next
If i >= 20 Then
TracePrint "大漠插件注册失败!"
EndScript
End If
Set dm = nothing
Delay 10
End Function
Sub OnThreadExit()
'解绑
dm_ret = dm.UnBindWindow() End Sub