• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[郭立员] 「按键精灵」一篇文章学会封装函数 [复制链接]

1#

大家好,我是公众号3分钟学堂的郭立员~

前言

从广义上说,脚本程序中每一个命令都是一个函数,但是通常我们会把用function命令封装的代码段叫做函数。

函数的核心作用就是减少代码的行数

我们使用函数的目的是可以提高编写脚本的速度,因为原本需要很多行代码实现的功能,在封装成函数后,只需要一行调用函数的代码就可以使用,如果使用别人封装好的函数,你可以在不需要知道函数内代码是什么的情况下直接调用。

一、函数的组成部分

一个函数的定义包含4个部分:

函数名(function name)

形参列表(parameter list),函数名后面括号内的部分,允许为空

函数体(function body)

返回值(return value)

隐藏部分 返回类型(return type)

用一个简单的例子来介绍函数的组成部分

  1. Function 加法(a,b)
  2. Dim c
  3. c = a + b
  4. 加法=c
  5. End Function
复制代码

在例子中,

①函数名是“加法”

②形参列表是(a,b)

③函数体是

  1. Dim c
  2. c = a + b
复制代码

④返回值是“加法=c”,也就是把c的值作为函数的返回值

⑤返回类型,也就是返回值的类型,在例子中c是返回值,c是来自a和b的加法运算,所以c是数值型,那么返回类型就是数值类型。

对于按键来说并没有强制要求写上返回类型,所以这部分是可以忽略的。

二、封装函数的流程

以下我们用封装一个找图函数作为例子:

①先编写“函数体”部分的内容,因为它是函数的核心功能,每个函数之所以不同,就是因为函数体的代码不同。

所谓函数体就是我们正常编写脚本的代码,比如我们要封装一个找图函数。

它的函数体是

  1. Dim intx,inty
  2. FindPic 0, 0, 0, 0, "Attachment:1.png","000000", 0, 0.9, intX, intY
  3. If intX > -1 And intY > -1 Then
  4. TracePrint intx,inty
  5. End If
复制代码

②填写一个函数名,封装一个无参无返回值的函数

  1. Function 找图()
  2. Dim intx,inty
  3. FindPic 0, 0, 0, 0, "Attachment:1.png","000000", 0, 0.9, intX, intY
  4. If intX > -1 And intY > -1 Then
  5. TracePrint intx,inty
  6. End If
  7. End Function
复制代码

很多新手朋友写到这一步就完事了,在语法和用法上没有错误,但是定义的是“死函数”,函数内部都是不变的,并且在调用函数时没有反馈。

③给函数添加形参列表

什么是形参、什么是实参?

形参:找图(a)

实参:找图("1.png")

在脚本中,括号里面是变量的就是形参,一般是用在定义函数时

Function 找图(a)

在脚本中,括号里面是字符串、数值或者其他非变量的,就是实参,一般是用在调用函数

call 找图("1.png")

为什么这一步叫添加形参列表呢?

因为形参不止有一个,可以添加无数个,至于有没有上限,在按键中我没有测试过,至少添加十几二十个形参是没问题的。

为了方便大家学习,以下所有形参和实参,我们统一写成参数

函数的参数是可以让函数具有可变性的,比如:

找图函数,如果把图片路径名称当做参数,就可以用在不同图片上。

  1. Function 找图(图片名称)
  2. Dim intx,inty
  3. FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
  4. If intX > -1 And intY > -1 Then
  5. TracePrint intx,inty
  6. End If
  7. End Function
复制代码

在代码中我们用 “图片名称”代替"Attachment:1.png",在调用找图函数的时候,就不只是可以找图片1.png了,可以是任意图片了

  1. 找图("Attachment:1.png")
  2. Function 找图(图片名称)
  3. Dim intx,inty
  4. FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
  5. If intX > -1 And intY > -1 Then
  6. TracePrint intx,inty
  7. End If
  8. End Function
复制代码

上面是图片路径整体替换,也可以局部替换,比如用“图片名称”替换“1.png”

  1. 找图("1.png")
  2. Function 找图(图片名称)
  3. Dim intx,inty
  4. FindPic 0, 0, 0, 0, "Attachment:"&图片名称,"000000", 0, 0.9, intX, intY
  5. If intX > -1 And intY > -1 Then
  6. TracePrint intx,inty
  7. End If
  8. End Function
复制代码

函数加什么参数,是根据我们的功能需要,如果在函数体中是可变的部分本质上是都可以作为参数的。

比如找图函数加个找图范围的参数:

  1. 找图(0,0,0,0,"1.png")
  2. Function 找图(x1,y1,x2,y2,图片名称)
  3. Dim intx,inty
  4. FindPic x1,y1,x2,y2, "Attachment:"&图片名称,"000000", 0, 0.9, intX, intY
  5. If intX > -1 And intY > -1 Then
  6. TracePrint intx,inty
  7. End If
  8. End Function
复制代码

因为可变性的原因,同一个功能不同人定义的函数参数未必是一样的,有的人定义的函数有1个参数,有的人定义的函数有10个参数。

两者都是正确的,同时在使用函数过程中,也可以随时添加参数以满足需要。

在网上还有很多老师讲到把数组当做函数的参数,这种是用在有很多参数的情况,就是把多个参数放到一个数组里面,每一个参数对应一个数组下标。

  1. Dim 图1={0,0,0,0,"1.png"}
  2. 找图(图1)
  3. Function 找图(arr)
  4. Dim intx,inty
  5. FindPic arr(0),arr(1),arr(2),arr(3), "Attachment:"&arr(4),"000000", 0, 0.9, intX, intY
  6. If intX > -1 And intY > -1 Then
  7. TracePrint intx,inty
  8. End If
  9. End Function
复制代码

在函数中参数只有一个数组类型的参数arr,它是所有参数的合集,在函数体内部还是要把每一个数组下标内容写到对应位置,形成一一对应的关系。


这种使用方式一般是在脚本开始部分定义大量的数组参数,后期使用的时候,直接填写对应的数组名称当做参数。

  1. Dim 图1={0,0,0,0,"1.png"}
  2. Dim 图2={0,0,0,0,"2.png"}
  3. Dim 图3={0,0,0,0,"3.png"}
  4. Dim 图4={0,0,0,0,"4.png"}
  5. Dim 图5={0,0,0,0,"5.png"}


  6. 找图(图1)
  7. Function 找图(arr)
  8. Dim intx,inty
  9. FindPic arr(0),arr(1),arr(2),arr(3), "Attachment:"&arr(4),"000000", 0, 0.9, intX, intY
  10. If intX > -1 And intY > -1 Then
  11. TracePrint intx,inty
  12. End If
  13. End Function
复制代码

注意:在按键中自定义函数不能有可省略参数,也就是你定义几个参数,调用函数就必须填写几个,否则就会报语法错误。

④返回值

返回值的写法很简单,就是函数名=要返回的内容

需要注意的是返回值的有效性

比如:找图函数的返回值可以是找图得到坐标,这就是一个有效的返回值。

如果找图函数中包含了点击找到位置的功能,此时返回值写成是否找到图(是否点击)的true或者false可能会更好一些。

返回值还有一个相对难点,就是返回值是多个值。

还是找图函数的例子,如果返回值是坐标,那么就是2个值,intx,inty

这种情况写法有两种:一是多个返回内容拼接在一起,用分隔符号隔开。二是用数组,把每一个返回内容放入数组当中。

两者不同之处是返回值的类型,前者是字符串类型,后者是数组类型。

a.拼接返回值写法



b.数组返回值写法

  1. Dim 返回数组=找图("Attachment:1.png")
  2. TracePrint 返回数组(0)
  3. TracePrint 返回数组(1)


  4. Function 找图(图片名称)
  5. Dim intx,inty
  6. Dim arr()
  7. FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
  8. If intX > -1 And intY > -1 Then
  9. arr(0) = intx
  10. arr(1) = inty
  11. 找图 = arr
  12. End If
  13. End Function
复制代码

三、局部变量和全局变量

在函数内部用dim 定义的变量就是局部变量,在函数外面定义的就是全局变量。

优先级:在函数内部局部变量优先级高于全局变量,也就是同一个变量,在函数内部和函数外部同时定义了,函数调用的是内部定义的变量。

  1. Dim a=1
  2. Call 函数()


  3. Function 函数()
  4. Dim a=2
  5. TracePrint a
  6. End Function
复制代码

调试输出结果:a=2

考虑到优先级的原因,如果函数内部想要调用函数外部定义的全局变量,就不能再函数内定义此变量(局部变量)。

  1. Dim a=1
  2. Call 函数()


  3. Function 函数()
  4. TracePrint a
  5. End Function
复制代码

调试输出结果:a=1

当只有全局变量时,这个变量既可以在函数内部使用,也可以在函数外部使用,利用这个特性,我们在需要多个返回值的时候,用全局变量代替返回值。

  1. Dim x,y
  2. 找图 ("Attachment:1.png")
  3. TracePrint x,y
  4. Function 找图(图片名称)
  5. Dim intx,inty
  6. FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
  7. If intX > -1 And intY > -1 Then
  8. x = intx
  9. y = inty
  10. End If
  11. End Function
复制代码

用全局变量x,y代替返回值,在函数中把intx、inty分别复制给x、y,在函数外面直接输出x、y即可。

这种用全局变量代替的方式是假的返回值,对于函数本身返回值可以写true或者false

找到图的情况

找图=true

没找到图的情况

找图=false

有个是否找到图的返回值,可以加上判断

  1. Dim x,y
  2. If 找图("Attachment:1.png") Then
  3. TracePrint x,y
  4. Else
  5. TracePrint "没找到图"
  6. End If


  7. Function 找图(图片名称)
  8. Dim intx,inty
  9. FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
  10. If intX > -1 And intY > -1 Then
  11. 找图=true
  12. x = intx
  13. y = inty
  14. Else
  15. 找图=false
  16. End If
  17. End Function
复制代码

总结:

函数自定义尽可能把函数的4部分都写全,对于多个返回值的情况,可以用拼接、数组方式作为返回值,也可以用全局变量代替。

记住函数的目的节省代码提高编写速度,如果你愿意所有自定义函数都是可以省略的。

=正文完=


扫码免费获取我的基础教程【视频教程】
扫码下方二维码关注我的公众号:3分钟学堂

QQ交流群:936858410
2#

call 找图(0,0,1024,768,"练功.bmp")
Function 找图(x1,y1,x2,y2,图片名称)
Dim intx,inty
FindPic x1,y1,x2,y2, "Attachment:"&图片名称,0.9, intX, intY
If intX > 0 And intY > 0 Then
intx=intX
inty=intY
TracePrint intx& "," &inty
End If
End Function
//
Dim intx,inty
FindPic 0,0,1920,1080,"Attachment:\练功.bmp",0.9,intX,intY
If intX > 0 And intY > 0 Then
intx=intX
inty=intY
TracePrint intx& "," &inty
End If

3#

请问下面的找图代码,为什么函数封装后,找不到图了?

call 找图(0,0,1024,768,"练功.bmp")
Function 找图(x1,y1,x2,y2,图片名称)
Dim intx,inty
FindPic x1,y1,x2,y2, "Attachment:"&图片名称,0.9, intX, intY
If intX > 0 And intY > 0 Then
intx=intX
inty=intY
TracePrint intx& "," &inty
End If
End Function
//
Dim intx,inty
FindPic 0,0,1920,1080,"Attachment:\练功.bmp",0.9,intX,intY
If intX > 0 And intY > 0 Then
intx=intX
inty=intY
TracePrint intx& "," &inty
End If

4#

,

提醒新手注意:FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY,这个封装只适合于按键手机版,PC版不支持

发新话题 回复该主题