2024年4月21日发(作者:)

按键精灵教程:炫舞类自动跳舞脚本

来源:按键学院 【按键精灵】

跳舞类游戏的脚本要怎么写呢?

带着这个疑问,小编找了一款十分炫酷的网页游戏《Touch炫舞》

游戏画面真是带感,还有那音乐,那妹子的舞姿……啧啧,好妖娆好妩媚……

好吧,扯远了, 接下来我们进入今天的主题

分享下《Touch炫舞》自动跳舞脚本的制作流程

由于本帖图片比较多,请各位看官耐心等待图片加载~~

流程

1、分析游戏

2、绑定游戏

3、获取箭头的点阵信息,做成字库

4、查找箭头

游戏画面只出现一个箭头的处理方法

游戏画面出现两个箭头的处理方法

分析游戏

【游戏画面】

【游戏规则】

1.当箭头的外圈,收缩到箭头内圈时,按下对应的方向键则可以获得最高分。

如果外圈还未收缩到内圈时就按下方向键,则获得一般评价。

如果外圈收缩到箭头中心点消失不见时,还未按下方向键,则不得分。

2.根据歌曲的难度,箭头消失的速度,箭头的个数和复杂程度各不相同。

今天的例子,是以难度为1的歌曲作为操作对象

难度为1的歌曲:

箭头有两种颜色,粉色和蓝色,上下键为粉色,左右键为蓝色

箭头有普通箭头和大箭头

普通箭头:

大箭头:

箭头出现的个数有两种情况

只出现一个箭头:

按下对应的方向键即可

同时出现两个箭头:

上下箭头同时出现:按下方向键上不放,然后按 方向键下,再松开方向键上

左右箭头同时出现:按下方向键左不放,然后按 方向键右,再松开方向键左

3.游戏支持关闭背景

有背景的游戏画面:

没有背景的游戏画面:

注意:关闭背景能减少cpu负荷,减少干扰,有利于脚本运行

4.游戏窗口如果是非激活的状态,画面被锁定,不接受键盘消息以及鼠标消息

绑定游戏

本例中用大漠插件来做后台脚本

首先,我们需要测试下,这个游戏要用什么绑定模式

小编测试了几种后台模式,发现键盘如果使用 "windows"绑定模式,

当游戏窗口处于非激活的状态下(窗口被遮挡),游戏画面会被锁定。

难道不能后台?

就当小编心如死灰之际,测试了dx模式

成了,键盘用dx模式之后,游戏窗口被遮挡游戏画面也不会被锁定

绑定模式:

图色模式:dx2

鼠标模式:dx

键盘模式:dx

注意:

绑定游戏窗口之前,要先激活游戏窗口之后再绑定

如果是非激活状态下(游戏画面锁定)绑定了窗口,需要点击下窗口标题栏激活窗口

获取箭头点阵信息,做字库

小编使用做字库的方式,来查找箭头

有童鞋看到这里可能会有疑问,为什么不用找图的方式呢?

其实,找图和找字的方式都可以。

小编喜欢用找字的方式,主要原因是因为找字的效率高于找图

好吧,我说实话,其实是因为我比较懒,小编觉得抠图老麻烦了~~

箭头的偏色还是相当厉害的,我们怎么才能获取到它的点阵呢?

小编使用的是HSV模式来计算偏色

根据计算

粉色箭头的偏色描述为:308.57.100-25.60.10

蓝色箭头的偏色描述为:180.60.100-25.60.0

用大漠工具提取图像点阵,我们发现它提取到的点阵范围大小是有限制的,

不能将整个箭头的点阵都提取到

那我们该提取那一部分呢?

粉色箭头

红色箭头小编提取的是箭头双角部分的点阵,

因为这部分点阵特征比较明显,识别起来准确度高

点阵信息命名为:上(粉色大箭头用此点阵也能识别到)

粉色朝下的箭头也是提取双角部分的点阵

点阵信息命名为:下

蓝色箭头

蓝色箭头小编提取的是箭头中部的点阵

点阵信息命名为:左

蓝色往右方向的箭头也是提取箭头中部的点阵

点阵信息命名为:右

但是问题来了,发现蓝色箭头有很多不能识别到

原来蓝色箭头还有另一种情况

箭头的中间部位有一条是白色的,所以偏色没有覆盖到(蓝色大箭头也是这种情况)

这种情况,小编提取了箭头上方角的部分,

点阵信息命名为:大左(蓝色大箭头用此点阵也能识别到)

蓝色朝右的箭头也是提取箭头上方角的部分

点阵信息命名为:大右

查找箭头

游戏画面里的箭头

有的时候出现一个,有的时候同时出现两个

所以,这里我们使用大漠的 FindStrFastEx 找字命令

这个命令,支持找多字

命令名称

命令功能

命令参数

FindStrFastEx

区域找字

x1 :区域的左上X坐标

y1 :区域的左上Y坐标

x2 :区域的右下X坐标

y2 :区域的右下Y坐标

string :待查找的字符串, 可以是字符串组合,比如"长安|洛阳|大雁塔",中间用"|"来分割字符串

color_format :颜色格式串, 可以包含换行分隔符,语法是","后加分割字符串.

sim :相似度,取值范围0.1-1.0

返回所有找到的坐标集合,格式如下:

返 回 值

"id,x0,y0|id,x1,y1|......|id,xn,yn"

比如"0,100,20|2,30,40" 表示找到了两个,第一个,对应的是序号为0的字符串,坐标是(100,20),

第二个是序号为2的字符串,坐标(30,40)

找字的范围怎么定?

我们观察下,箭头会出现的大概范围,发现并不是整个窗口都覆盖的

所以,小编设置的范围是:91,59,1124,689

找字的范围尽可能小点,可以提高效率

我们找多字,所以命令中 string 这个参数,我们将需要找的字都填进去:

"上|下|左|大左|右|大右"

Color_format参数,填写偏色描述,将粉色箭头和蓝色箭头的偏色描述一起填写进去:

"180.60.100-25.60.0|308.57.100-25.60.10"

怎么知道找到的是哪个箭头?怎么知道找到的箭头有几个?

如果只找到一个箭头,例如:上箭头

我们看string这个参数里,上是在第一个,所以它的序号为0,而下的序号为1,以此类

那么,FindStrFastEx命令的返回值就为: 0,x坐标,y坐标

我们需要将这个返回值分割,获取到“0”这个序号,才能判断出找到的是哪个箭头

如果同时找到了两个箭头,例如:上箭头和下箭头

那么,FindStrFastEx命令的返回值就为: 0,x坐标,y坐标|1,x坐标,y坐标

我们需要将返回值分割两次,第一次以 | 线为分割符号,第二次以 ,号为分隔符

这样才能将两个箭头的序号获取到,然后根据序号判断是哪个箭头

看到这里,细心的童鞋一定发现了,如果找到两个箭头,FindStrFastEx命令的返回值里会

出现一个竖线

如果只找到一个的话,就不会出现竖线,所以我们只要判断竖线有没有即可知道找到了几个

箭头

按方向键

如果只找到一个箭头,我们判断是哪个箭头,然后按下对应的方向键即可

例如找到左箭头,我们就按 方向键 "←"

如果同时找到了两个箭头,有两种情况

情况1:上下箭头同时出现

情况2:左右箭头同时出现

我们知道找字是从左往右,从上往下找,所以两个箭头同时出现时,先找到的是上/左箭头

所以我们判断找到的第一个箭头是上箭头还是左箭头

如果是上箭头,我们就按住 方向键 "↑"不放,然后按下 方向键 "↓",再松开 方向键 "↑"

如果是左箭头,我们就按住 方向键 "←",然后按 方向键 "→",再松开 方向键 "←"

代码

Call 注册大漠()

Set dm = CreateObject("")'创建大漠对象

dm_ret = h("C:test_game")'设置大漠全局路径

dm_ret = t(0,"")'设置字库文件

Hwnd = ("UnityWndClass", "Touch")'获取Touch炫舞的窗口句柄

dm_ret = dowState(Hwnd,1) '激活窗口

dm_ret = ndow(Hwnd, "dx2", "dx", "dx", 1)'绑定窗口

If dm_ret = 1 Then

TracePrint "绑定窗口成功"

Do

//查找箭头

dm_ret = rFastEx(91,59,1124,689, "上|下|左|大左|右|大右", "180.60.100-25.60.0|308.57.100-25.60.10",

0.9)

If len(dm_ret) > 0 Then

Delay 200 '外圈还未收缩到内圈时就按键的情况下,调高延时。相反则调低延时。

Call StrToArr(dm_ret)

If UBound(ArrMap) = 0 Then '1个箭头

SS = split(dm_ret, ",")

Call InputKey(CInt(SS(0)),0)

Delay 200 '如果一个键判断了两次,导致按键错误的情况,调高延时

Elseif UBound(ArrMap) = 1 Then '2个箭头

TracePrint "2键"

Call InputKey(CInt(ArrMap(0,0)),1)

TracePrint "================"

End If

End If

Loop

Else

TracePrint "绑定失败"

End If

//按方向键

Sub InputKey(key,mode)

If mode=0 then '一个箭头

If key = 0 Then ss 38 :TracePrint "↑"

If key = 1 Then ss 40 :TracePrint "↓"

If key = 2 or key = 3 Then ss 37 :TracePrint "←"

If key = 4 or key = 5 Then ss 39 : TracePrint "→"

Else '两个个箭头

If key = 0 Then '判断是否是上箭头:上箭头=0 /左箭头=2

n 38:TracePrint "按下↑"

ss 40:TracePrint "按↓"

38:TracePrint "松开↑"

Else '左箭头

n 37:TracePrint "按下←"

ss 39:TracePrint "按→"

37:TracePrint "松开←"

End If

End if

End Sub

//分割坐标字符串

Sub StrToArr(字符串)

Dim i, j, ArrX, ArrY

ArrX = Split(字符串, "|")

For i = 0 To UBound(ArrX)

ArrY = Split(ArrX(i), ",")

For j = 0 To UBound(ArrY)

If j = 0 and i = 0 Then

Redim ArrMap(UBound(ArrX),UBound(ArrY))

End If

ArrMap(i, j) = ArrY(j)

next

Next

End Sub

//注册大漠

Function 注册大漠()

Dim i

PutAttachment "C:test_game", "*.*"

Set ws = createobject("")

For i = 0 To 20

("regsvr32 -s")

("regsvr32 C:test_ -s")

Delay 200

Set ws = nothing

Set dm = createobject("")

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 OnScriptExit()

dm_ret = Window()

End Sub

游戏设置:

注意:

1、外圈还未收缩到内圈时就按键的情况,需要调高延时。

每台电脑的情况不同,小编家里的笔记本电脑,延时设置为80毫秒就可以拿到高分

另一台台式电脑却需要设置为200毫秒

2、当按下方向键时,箭头消失的并没有我们想象中的快,

然后找字的判断速度会很快,这种情况下,很可能一个箭头会被循环找到两次

所以,当出现了这种情况,我们在按完键之后,需要加上一定的延时

本例子中的脚本初级版本,

对于游戏中有的箭头延时大有的箭头延时小,所导致的按键太迟

以及两个箭头出现的位置太粘合,所导致的另一个箭头来不及判断的情况暂未做处理