一、 课前准备
1. 序言
按键精灵手机版游戏脚本教学(以下均称为手机按键),适用于零基础人群或者是写脚本无从下手的基础薄弱的人群,最终达到组建家庭小型工作室的目的。本教程仅针对游戏脚本的编写来进行教学的,对于其他类型APP处理,如抢单脚本、引流脚本之类的不太适用,写法上和学习思路上有较大的区别。学习30天左右,可以独自完成常见类型游戏的脚本编写(FPS射击类游戏、MOBA竞技类游戏、横版格斗类游戏除外),了解常见计算机硬件,可独自组建和维护家庭工作室。
1.1脚本和外挂的区别
脚本:一系列可以反复执行的命令。通过一些判断条件,可以让这些命令具有一定的智能效果。应用领域例如:
1.游戏中实现自动打怪,自动补血,自动说话等;
2.办公族可用按键精灵自动处理表格间数据的转换,自动调整文档格式、文章排版等;
3.利用按键精灵实现定时自动打开检验网页链接,文献检索,收集资料等重复操作;
外挂:篡改游戏原本正常的设定和规则,大幅增强游戏角色的技能和超越常规的能力。应用领域例如:
1.辅助外挂:重复运行游戏内需要重复性操作(不涉及篡改游戏数据),比如传奇自动打怪,但是很多游戏已经内置了这些功能,叫做内挂。
2.变态外挂:DNF全屏秒杀,FPS游戏透视爆头,传奇游戏加速等,一般是通过内存或者封包实现。
1.2手游脚本和PC脚本的区别
手游脚本原理和PC脚本的原理基本上是相似的,基本上都是图色、内存、封包那一套东西,但是PC端游都需要过保护,例如腾讯的TP验证,对于新手来说,根本过不了保护那一关,这一关都过不了,你会写图色脚本又有什么用呢?而且PC端游功能复杂,只会图色效率很低,内存和封包,不是科班出身的基本上都看不懂,就不要说学习了,所以外行学习按键精灵或者易语言去写图色脚本,没什么用处,浪费时间浪费钱而已。作为外行,我建议掌握按键手机版的写法后,再去学习易语言的中控,投入最少的钱和时间,获得最大的收益。
1.3了解我国相关刑法
1.破坏计算机信息系统罪,根据《中华人民共和国刑法》第二百八十六条规定,破坏计算机信息系统罪是指违反国家规定,对计算机信息系统功能或计算机信息系统中存储、处理或者传输的数据和应用程序进行破坏,或者故意制作、传播计算机病毒等破坏性程序,影响计算机系统正常运行,后果严重的行为。获利5000块钱以上或者造成一万块钱以上的损失处5年以下有期徒刑。
2.非法经营罪,根据《中华人民共和国刑法》第二百二十五条的规定,是指违反国家规定,有下列非法经营行为之一的犯罪:(一)未经许可经营法律、行政法规规定的专营、专卖物品或其他限制买卖的物品的;(二)买卖进出口许可证、进出口原产地证明以及其他法律、行政法规规定的经营许可证或者批准文件的;(三)未经国家有关主管部门批准,非法经营证券、期货或者保险业务的,或者非法从事资金结算业务的;(四)从事其他非法经营活动,扰乱市场秩序,情节严重的行为。个人营业额达到5万以上或者盈利达到一万以上处三年以下有期徒刑。
3.侵犯著作权罪,根据《中华人民共和国刑法》第二百一十七条规定,侵犯著作权罪,是指以营利为目的,未经著作权人许可复制发行其文字、音像、计算机软件等作品,出版他人享有独占出版权的图书,未经制作者许可复制发行其制作的音像制品,制作、展览假冒他人署名的美术作品,违法所得数额较大或者有其他严重情节的行为。如果不是情节特别严重,一般都是赔钱私了。
2.手机按键的学习思路
根据我的个人经验,我把按键图色脚本基础内容分为4部分
- 图色:既然是图色脚本,掌握常用的图色功能是重中之重,主要是学习找色、比色、找字、找图、文字识别的灵活使用。
- Function函数:通过封装函数,可以极大的减少不必要的代码,主要是学习参数的传递,封装,返回值
- 数组:稍微复杂的脚本,都会用到数组来进行传参,主要是学习数组的合成、分割、排序
- 多线程:复杂的脚本需要用到多线程来并行处理任务,主要是学习多线程的控制、防止线程之间的干扰
按键图色脚本进阶内容学习分为3部分
- 掌握常见功能模块,例如定时功能、循环遍历、循环查找、拾取物品、对接第三方平台、数组应用
- 实现一个完整的脚本
- 从面向过程编程到面向对象编程的思路转换
3.如何学好手机按键
- 看得懂源码或者视频不代表你就写的出来,再简单的东西也要自己过一遍才知道。
- 写功能之前先把思路理清楚,做这个功能分多少步,每一步干什么,每一步需要用到什么。
- 面向百度编程,不懂的东西去百度搜索,永远不要等着别人给你讲。
- 站在巨人的肩膀上,分析别人的作品可以快速成长。
- 不到万不得已,不要用别人的插件
- 自信,相信自己的技术
4.电脑调试&软件下载安装
电脑硬件要求:4核8线程CPU,内存8G及其以上
开启VT:新款电脑默认开启,老款电脑自行百度如何在BIOS中开启VT
笔记本电脑:在电池模式中,切换为高性能模式
按键精灵手机助手下载地址:http://download.myanjian.com/
二、 基础语法和命令学习
1. 基础语法
1.1标识符
为变量、常量、数据类型、子程序、函数等定义的名字
例如 Dim a
这里的a就是标识符,注意按键精灵中标识符不区分大小写,并且是唯一的,例如:
Dim a和dim A是一个意思
1.2关键字
关键字就是计算机中面向硬件的指令,简单的说就是方面用户和计算机进行交互的速记符,一般要求编程时用户定义的标识符的时候不能和关键字重名,否则程序运行出错。
我们在给程序命名时,不能使用这些关键字、保留字、命令名称进行命名。例如:
Dim dim
Dim true
这是错误的用法
1.3赋值
使用 = 把右边的值赋予给左边,例如:
Dim a=1
赋值可以被覆盖的,例如:
Dim 女朋友=夜刀神十香
女朋友=时崎狂三
如果等号表示赋值的时候,左边=右边 和 右边=左边 代表的含义是不一样的,例如
Dim a=1
Dim b=2
a=b的结果为 a=1 b=1 因为a=1,b=a,所以b=1
b=a的结果为 b=2 a=2 因为b=2,a=b,所以a=2
1.4常量
常量是一个不可变的值,在计算机中是只读的,例如
圆周率 π=3.1415926 ,假如我们要计算圆的面积S
Dim S=πR2 那么这个π的值一是不会再改变,这个π就是常量
1.5变量
变量是相对常量来说的,就是可以变化的值,再计算机中是可读可写的,例如
Dim S=πR2 半径R的是可以变化的,这个R就是变量,在按键精灵手机版中,变量可简单分为局部变量、全局变量、共享变量
局部变量:定义在所有子程序或者函数内的变量
全局变量:定义在所有子程序或者函数外的变量
共享变量:作用类似于全局变量,用于多线程中传递参数(全局变量不能直接用于多线程)
1.6数据类型
按键精灵安卓版中有如下几种类型,
布尔:取值范围是0或者1,即只能是true 或者false;
数值:1,2,3,i8(-2^n-1 - 2^n-1-1),i16,i32,u8(0 - 2^n-1),u16,u32,f32,f64 (了解即可)
字符:"a" "b" "c"
字符串:"abc132啊哦饿"
数组:a={1,2,3} a=array(1,2,3)
表:table = {"tb1":123, "tb2":"字符串123", "tb3":{1, 2, 3}}(了解即可)
时间日期:%Y-%m-%d %H:%M:%S (了解即可)
1.7数据转换
按键精灵中提供了6种数据转换
CBool:数字0转成布尔值为False,非0的数转为布尔值为True(了解即可)
CInt 转整数:转换成功后返回短整型数据类型的值,注意:返回此数值是经过四舍五入的结果
CLng 转整数:转换成功后返回长整型数据类型的值,注意:返回此数值是经过四舍五入的结果(了解即可)
CStr 转字符串:转换成功后返回字符串型后数据类型的值
CSng 转浮点数:转换成功后返回单精度浮点数数据类型的值
CDbl 转浮点数:转换成功后返回双精度浮点数的值(了解即可)
1.8注释
就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。注释只是为了提高可读性,不会被计算机编译。
按键精灵安卓版中,需要注释的类容前面加"//",注释的用法如下:
//橙苏博客
1.9调试信息
常用的调试信息有TracePrint 和ShowMessage,TracePrint可以再控制台中显示,ShowMessage可以在界面显示,例如:
TracePrint “橙苏博客”
ShowMessage “橙苏博客”,1000,500,500
1.10课后习题
- 指出下面的标识符
Dim 张三
Dim a=b
Dim c
2.指出下面错误的标识符命名
Dim TRUE
Dim true
Dim TRue
3.当 = 代表赋值时,a=b 和b=a 是否等价?
4.简述全局变量、局部变量、共享变量的区别?
5."0"和0是否等价?
6."a"&"b"&"c" 和"abc"是否等价?
7.123=CInt("123")正确吗?
- "123"=CStr(123)正确吗?
- 下面那个可以输出0.5
(1)Traceprint Int(0.5)
(2)Traceprint CInt(0.5)
(3)Traceprint CLng(0.5)
(4)Traceprint CSng(0.5)
(5)Traceprint CDbl(0.5)
2. 基本命令
2.1触摸命令
Keypress:按一下某个键,每个键都有对应的键代码,可查询键码表
应用场景:输入某些文字或按下某些功能键,例如:
Keypress 67 代表按下删除键
Keydown和keyup:按下某个键过一段时间再弹起(了解即可)
应用场景:长按功能键,例如:
模拟手动关机的例子
KeyDown "Power" //模拟按住电源键不放
Delay 3000 //延时3秒
KeyUp "Power" //松开电源键
备注:有按下就必须有弹起
Tap:单点一下屏幕
应用场景:模拟点击操作,例如:
Tap 200,200
Randomtap(X,Y,10)
备注:游戏中必须做到随机点击,不能固定点某一个地方,否则会被封号
Touch:按住某点一段时间后松开
应用场景:传奇中长按进行连续攻击,例如:
点击屏幕坐标(100,100)的点,并持续按住100毫秒(0.1秒)
Touch 100,100,100
Randomtap、Randomstap:随机范围的点击
应用场景:tap的升级版,以目标点位为中心的随机范围点击,例如:
Randomtap(100,100,100)
(0,0,200,200)
Swipe滑动:任意方向的滑动
应用场景:切换屏幕,摇杆类游戏,例如:
用300毫秒的时间,从点100,100划动到点200,200
Swipe 100,100,200,200,300
Touchdown、touchmove、touchup:类似于拖到的效果
应用场景:验证码滑块拖动,例如
TouchDown 100, 100, 1//按住屏幕上的100,100坐标不放,并设置此触点ID=1
TouchMove 300, 300, 1, 200//将ID=1的触点花200毫秒移动至300,300坐标
TouchUp 1//松开弹起ID=1的触点
备注:swipe可以做的,Touchdown、touchmove、touchup也可以做,但是Touchdown、touchmove、touchup能做,swipe不一定能做。
2.2控制命令
For:有限次的循环,默认步长为1
应用场景:遍历数组和二重循环,用的非常多
用法1:
For 10
Traceprint “我被循环了10次”
Next
用法2:
For i=1 to 10
Traceprint “这是第“& i &”次循环”
Next
用法3:(了解即可)
For i=0 to 10 step 2
Traceprint “我被循环了6次”
Next
用法4:
For each i in 数组
Traceprint 数组(i-1)
Next
用法5:
For i=0 to 5
For j=0 to 5
Traceprint i,j
Next
Next
If:如果……则
用法1:
If 1<2 then
Traceprint “1小于2”
End if
用法2:
If 1<2 then
Traceprint “1小于2”
Else
Traceprint “1不小于2”
End if
用法3:
If 1>2 then
Traceprint “1大于2”
ElseIf 1=2 then
Traceprint “1等于2”
Else
Traceprint “1小于2”
End if
备注:if语句中只能有一个else
else 只能在elseif后面
if的判断条件默认为true
两种结果的时候,用if ,三种及其以上结果的时候,select case
Select Case: 根据情况条件来选择执行对应语句
用法1:
Dim 变量=1
Select Case 变量
Case 0,1 //可支持判断多个值,中间以逗号隔开
TracePrint "你输入的数字为:0或者1"
Case 2
TracePrint "你输入的数字为:2"
Case 3
TracePrint "你输入的数字为:3"
End Select
备注://不支持判断语句 如:Case a>0
While:如果……则循环
用法1:
While true
Traceprint “一直循环”
Delay 100
Wend
用法2:
Dim t=0
While true
Traceprint “循环中”
t=t+1
If t>5 then
Exit while
End if
Delay 100
Wend
备注:循环时一定要加延迟,否则程序会因为CPU使用率增加而变卡
Do:循环
和while区别不大,一个是满足情况才循环,一个是满足情况下退出循环(了解即可)
Rem、Goto :跳转到标记(了解即可)
用法1:
Rem 标记
Traceprint “1”
Goto 标记
备注:可以做到循环的效果,但是不建议使用goto,容易打乱程序结构
Call:调用
用法1:
Call 测试程序()
用法2:
测试程序()
用法3:
Call 测试程序(参数一,参数二)
Sub:子程序
用法1:
Sub 测试程序()
Traceprint “测试程序”
End sub
用法2:
Sub 测试程序(参数1,参数2)
Dim a=参数1+参数2
End sub
Function:函数,用法和sub几乎一致,但是多了返回值
用法1:
Function 测试程序()
Traceprint “测试程序”
End function
用法2:
Function 测试程序(参数1,参数2)
Dim a=参数1+参数2
End function
用法3:
Function 测试程序(参数1,参数2)
Dim a=参数1+参数2
If a>0 then
测试程序=true
Else
测试程序=false
End if
End function
If 测试程序(参数1,参数2)=true then
Traceprint “测试程序”
End If
备注:sub和function自己调用自己的时候,要进行次数限制,否则会无限套娃。
掌握function传参和给自身赋值
EndScript:强制结束程序运行
用法1:
For 3
Tracetrint “1”
Endscript
Next
OnScriptExit:脚本结束事件
用法:
Function OnScriptExit()
//这里面写脚本停止时想自动运行的代码
End Function
2.3课后习题
1.keypress “a”和keypress “A”的效果一样吗?
2.执行keydown后,可以不执行keyup的正确吗?
3.Randomtap(10,10,10)的实际点击范围是多大?
4.Swipe指令能否完成图标的拖动效果?
5.for i=0 to 5 step 2 会循环多少次?
6.If语句中,else一般写在elseif前面正确吗?
7.If语句中,可以有两个及其以上的else正确吗?
8.Select case语句中,支持判断语句吗,如select case 1<2 ?
9.Sub子程序有返回值吗?
10.现有函数格式如下,测试程序(3,3)=true正确吗?
Function 测试程序(a,b)
Dim c=a+b
If c>6 then
测试程序=true
Else
测试程序=false
End If
End function
3. 图色命令
3.1颜色命令
Findcolor:区域找色
用法1:
FindColor x1,y1,x2,y2,"123456-000000|aabbcc-030303|ddeeff-202020",0,1.0,intX,intY
用法2:
返回值=FindColor(x1,y1,x2,y2, "0000FF-101010|FFFFFF-000000|FF00FF",0, 0.9, intX, intY)
Findmulticolor:多点找色
用法1:
FindMultiColor x1,y1,x2,y2,"FFFFFF","4|1|2F9772-000000|123456-101010,3|7|378757",0,0.9,intX,intY
CmpColorEx:多点比色
用法:
If CmpColorEx("300|500|FFFFFF|123456-102030,305|505|FFFFFF",0.9) = 1 Then
TracePrint "全部点颜色相等"
Else
TracePrint "有一个或多个颜色不符合"
End If
Getcolornum:获取区域颜色数量
用法1:
颜色数量 = GetColorNum(26,20,31,26,"FFFFFF|123456-000000",1.0)
用法2:
FindColor x1,y1,x2,y2,"123456-000000|aabbcc-030303|ddeeff-202020",0,1.0,intX,intY
If intX>-1 then
颜色数量 = GetColorNum(intX-10,intY-10, intX+10, intY+10,"FFFFFF|123456-000000",1.0)
End If
3.2图形命令
KeepCapture:截图至内存
Findpic:找图
用法1:
FindPic x1,y1,x2,y2, "Attachment:1.png","000000",0, 0.8, intX, intY
用法2:
返回值=FindPic(x1,y1,x2,y2, "Attachment:1.png|Attachment:2.png","000000",0, 0.8, intX, intY)
ReleaseCapture:释放内存中的截图
备注:使用截屏至内存,找图完毕后,要及时释放内存中的截图。
3.3文字命令
SetDictEx:设置字库文件
用法:
SetDictEx(0, "Attachment:xxx.txt")
UseDict:使用字库文件
用法:
UseDict(0)
Findstr:找字
用法1:
FindStr 0,0,2000,2000,"长安","9f2e3f-000000",1.0,intX,intY
用法2:
索引值 = FindStr(0,0,2000,2000,"长安|洛阳","9f2e3f-000000",0.9,intX,intY)
备注:
设置偏色时,字体清晰可见即可,偏色过大,会导致字体糊成一团。
找字的用途不仅仅局限于找字符串,其他形状也是可以的
Ocr:文字识别
用法:
识别文字 = Ocr(x1,y1,x2,y2,"9f2e3f-030303|2d3f2f-000000|3f9e4d-100000",0.9)
备注:一般不要使用Ocr做文字识别去判断,找字会快一些。
Image.OcrText:本地光学文字识别
用法:
识别文字=Image.OcrText(665,1138,690,1200, 0, 3)
备注:此命令用于识别白色中文方块字效果较好
smartOcr:智能识别数字(此命令为隐藏命令,准确度不高不稳定)
用法:
识别数字 = SmartOcr(665,1138,690,1200,"FFFFFF-101010")
备注:一般用于识别数字,不能识别坐标中的逗号。
3.4图色技巧总结
- 无论是找色,找图,找字,都应该尽可能缩小查找区域,区域越大,查找速度越慢,越容易出错
- 找不到图色时,应当先微调,再粗调,微调就是调偏色“FFFFFF-000000”,粗调就是调相似度。找色的偏色一般为“050505”或者“101010”,找图或者找字偏色一般为“202020”-“404040”,粗调不低于0.8。
- 找图色经常找错的时候,偏色设置为“050505”以下,相似度设置为1.0,来提高准确性
- 原则上使用优先度是:区域找色>多点比色>多点找色>找字>找图
3.5课后习题
- 简述多点找色和多点比色的区别?
- 使用KeepCapture命令后找图的截取的内容是实时的吗?
- 为什么使用完KeepCapture后要及时释放内存中的截图?
- Findstr找字,文字二值化后显示不完整,做成的字库将无法识别文字,正确吗?
- Findstr只能用于找字符不能用于找图案,正确吗?
- 将以上区域找色,多点找色,区域找图,区域找字使用function函数进行封装,并完成以下要求
1.查找到时返回true,未查找到时返回false
2.对于以上两种返回结果,都可以设置是否进行随机范围的点击
4. 扩展命令
4.1Device设备命令
Device.GetImsi()获取设备IMSI号(了解内容)
应用场景:制作本地收费系统时会用到,配合MD5进行加解密
用法:
设备IMSI号 = Device.GetImsi()
GetDeviceId:获取设备唯一编号(了解内容)
应用场景:制作本地收费系统时会用到,配合MD5进行加解密
用法:
返回值=GetDeviceID()
Device.GetDPI()获取屏幕DPI大小(了解内容)
应用场景:用户定制实体手机脚本时用到
用法:
返回值 = Device.GetDPI()
GetScreenX()获取屏幕宽度(了解内容)
应用场景:用户定制实体手机脚本时用到
用法:
屏幕横坐标X=GetScreenX()
GetScreenY()获取屏幕高度(了解内容)
应用场景:用户定制实体手机脚本时用到
用法
屏幕纵坐标Y=GetScreenY()
Device.Reboot()重启设备
应用场景:定时重启虚拟机,配合收费版的按键小精灵开机自启运行脚本
用法:
Device.Reboot()
4.2Sys系统命令
Sys.ClearMemory()清理内存
应用场景:类似于一键清理垃圾加速功能,按键精灵本身和白名单不会被清除,一定程度上可以防止脚本因长时间运行而崩溃
Sys.GetFront()获取当前应用包名(了解内容)
应用场景:不知道应用包名的时候,来读取前台应用包名
用法:
返回值 = Sys.GetFront()
GetRunningApp:获取应用包名(了解内容)
应用场景:读取所有运行中程序的包名
用法:
Dim arr() //定义一个数组变量
arr=GetRunningApp()
For each n in arr
TracePrint n
Next
Sys.isRunning()判断包名是否运行
应用场景:判断某后台运行应用是不是崩溃了,例如外服游戏挂VPN,判断VPN是否掉线
用法:
返回值 = Sys.isRunning(应用包名)
Sys.AppIsFront()判断应用是否在前台
应用场景:例如判断游戏是否掉线
用法:
返回值 = Sys.AppIsFront(应用包名)
4.3Log日志命令
Log.Open 开启日志
应用场景:将程序中的TracePrint打印保存在文本中,方便定位故障原因
用法:
Log.Open
Log.Close 关闭日志
用法:
Function OnScriptExit()
log.Close
End Function
4.4其他常用命令
Inputtext输入内容
应用场景:在对话框中输入字符串
用法
Inputtext "abcdefg"
Delay延迟
应用场景:程序运行完毕后,暂停一会在运行下一个程序
用法
Delay 50
Runapp启动应用
应用场景:启动某个APP
用法
Runapp “com.android.settings”
Killapp关闭应用
应用场景:关闭某个APP
用法
Killapp “com.android.settings”
Import导入插件
应用场景:使用插件时的导入命令,注意插件名称的大小写。
用法
Import "shanhai.lua"
Readuiconfig读界面配置
应用场景:读取脚本UI界面中的数据
用法1:
ReadUIConfig("多选框")=true
备注:读取出来的是布尔值
用法2:
ReadUIConfig("下拉框")=1
备注:读取出来的是数值
用法3:
ReadUIConfig("输入框")=""
备注:读取出来的是字符串
//调试的时候,记得先在预览界面上保存
4.5课后习题
- 了解UTF-8字符串命令、字符串函数、界面函数
- 判断下拉框的第一条数据的代码为ReadUIConfig("下拉框")=1正确吗?
- ReadUIConfig("下拉框")>0的写法正确吗?
- ReadUIConfig("输入框")读取到的内容是字符串还是数值?
5. 标准库函数
5.1数学函数
Abs绝对值
应用场景:将负值转化为正值
用法
Abs(-10)
Fix取整
应用场景:删除数值的小数部分并,返回以整数表示的结果
用法:
Fix(-8.5)
Int取整
应用场景:删除数值的小数部分,并返回以整数表示的结果
用法:
Int(-8.5)
备注:Int返回小于或等于数值的第一个负整数,Fix返回大于或等于数值的第一个负整数
Randomize初始化随机数
Rnd随机数
应用场景:在生成随机数前使用一次
用法:
//Int((最大值 - 最小值 + 1) * Rnd() + 最小值)
Dim MyValue
Randomize
MyValue = Int(((6-2+1) * Rnd()) + 1)
Traceprint MyValue
Round四舍五入
用法
Round(4.5)
5.2数组函数
Array合成数组
应用场景:给数组函数传参
用法
Dim i=array(1,”abc”,{4,5})
Dim i={1,2,3}
Split分割数组
应用场景:将数组分割为若干段字符串,格式Split(数组,分隔符)
用法
Dim a={“123|456”,”789|369”}
Dim 数组()=Split(a(0),”|”)
Ubound数组长度
应用场景:获取数组长度,一般循环时会用到
用法
For i=0 to ubound(数组)
Traceprint 数组(i)
Next
练习例子:数组传参、二分法排序、冒泡排序法
5.3时间日期函数
Time()当前系统从1970年1月1日至今所经过的秒数
应用场景:定时器
用法
Dim t=time()
Delay 1000
Time()-t>1 then
Traceprint “过去1秒了”
End If
Tickcount()获取脚本运行时间
应用场景:定时器
用法
Dim t= Tickcount()
Delay 1000
Tickcount()-t>1000 then
Traceprint “过去1秒了”
End IF
备注:以上2种常用于定时器功能
5.4运算符
5.4.1算术运算符
+加
-减
*乘
/除
\整除
用法
A=4\3
Mod求余
用法
A=4 Mod 3
5.4.2连接运算符
&强制连接:强制两个表达式进行字符串连接
用法
Traceprint 1&”1”
5.4.3关系运算符
=等于、赋值
<>不等于
>大于
<小于
>=大于等于
<=小于等于
5.4.4逻辑运算符
And与:全部为真,返回true,否则返回false
or或:有一个为真,就返回true;全部为假返回false
not非:真为假,假为真
5.5课后习题
- 简述常用的两种数组的赋值方法和遍历方法
- 使用时间日期函数写一个定时器功能
- 使用二分法原理找出数组中的最大值或者最小值
- 使用冒泡排序法对数组进行从从小到大的排序
6. 插件命令
6.1时间日期命令
DateTime.Hour()
DateTime.Minute()
DateTime.Second()
应用场景:游戏里面的定时活动,比如6点30分开始活动
用法
While true
If DateTime.Hour() = 14 and DateTime.Minute() >= 30 Then
Do Until DateTime.Hour() = 15
TracePrint "开始活动"&now()
Delay 5000
Loop
TracePrint "活动结束"
End If
Delay 1000
Wend
6.2多线程命令
Thread.setshareVar设置共享变量,变量可以是任意类型
用法
Thread.setshareVar”共享变量”,1
Thread.getshateVar 获取共享变量
用法
Thread.getshateVar(“共享变量”)
Thread.start启动线程
用法
Dim a=thread.start(主程序)
Sub 主程序()
Traceprint “这是主程序”
End Sub
Thread.stop结束线程
用法
Thread.stop(a)
Thread.wait等待线程(了解即可)
用法
Thread.wait(a)
备注:当需要并行处理任务的时候或者单线程处理任务不及时的时候,就需要用到多线程,但是不能滥用多线程。一般来说游戏脚本线程数量不应多于1条,并且要尽可能不使用多线程
注意事项:
- 主线程停止后子线程会停止
- 多线程中的无法直接使用全局变量,需要进行传参才可以使用
- 避免频繁启停多线程,容易导致内存堆栈溢出,从而脚本崩溃
- 多线程运行时需要避免出现线程间相互干扰的情况
6.3课后习题
1.了解File文件操作命令(课后了解)
2.简述多线程的控制思路