870 lines
31 KiB
Plaintext
870 lines
31 KiB
Plaintext
|
Thyme 语 言 介 绍
|
|||
|
|
|||
|
Thyme 语言是专门为Algodoo 设计的内置编程语言。其本身具有的简单易用的特点给 用户提供了极其方便的编程环境,可以让用户快速上手使用。同时, Thyme 语言也是非常 强大的,在Algodoo 中用好了Thyme 语言,可以帮助您做出更多更有趣的场景,但它不仅 仅局限于此,因Algodoo 本身是由 C++制作的,如果可以找到并借用外部的接口,那么
|
|||
|
Algodoo 将会拥有属于自己的额外内容包。
|
|||
|
本教程主要针对Thyme 语言进行讲解,不会涉及到C++, 如果想要学习C++的话,可 以去百度上查找C++相关教程自行学习。
|
|||
|
|
|||
|
2.Algodoo 控 制 台
|
|||
|
|
|||
|
1. 控制台是什么
|
|||
|
|
|||
|
Algodoo 控制台是一个工作在后台的信息处理终端,在 Algodoo所做的大部分操作都会 显示在控制台中。同时,控制台也是一个可以进行代码编辑的地方,用户在场景中所编辑 的所有代码都能在控制台中找到,当然,控制台中所做的大部分修改也能在场景中体现出 来。
|
|||
|
总之,控制台是一个编程学习的好地方。
|
|||
|
|
|||
|
2. 如何打开控制台
|
|||
|
|
|||
|
在 Algodoo 打开后我们会进到一个场景里,这时我们只要按下“ESC”键下面的“~” 键或者 F10 键,就会从屏幕上方弹出一个黑色窗口,这代表着我们已经进入到控制台中了, 同样的,再次按下会隐藏控制台。
|
|||
|
|
|||
|
3. 控制台操作按键
|
|||
|
|
|||
|
因为 Algodoo 的控制台不能像别的窗口一样随便查看,下面将简单介绍几个控制台使 用的按键:
|
|||
|
“←”“→ ”方向键:可以在控制台中最后一个“>”下方所在的可编辑输入框中调整 光标位置
|
|||
|
“个”“↓”方向键:可以让执行过的代码再此出现到输入框中,以便于再次手动执 行
|
|||
|
“tab” 键:当输入任意字符时,按下这个键即可自动补全完整代码
|
|||
|
“home”“end” 键:可以让光标快速定位到该行的最前和最后
|
|||
|
“page up”“page down”键:可以让控制台的显示上翻和下翻
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Algodoo 贴吧专属 2 不可商用,违者必究
|
|||
|
|
|||
|
3.Thyme 语法
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1.基础部分
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(1)变量
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A.变量声明
|
|||
|
|
|||
|
|
|||
|
变量是编程语言中最重要的一部分,声明一个变量首先要有变量名,这里举几个例子:
|
|||
|
Variable1=1
|
|||
|
Variable2=true
|
|||
|
Variable3=2.41
|
|||
|
Variable4="Var"
|
|||
|
上述四个均是变量声明, Variable1~Variable4 均是变量名,赋值符号后面的则是该变量的值, 这样做完之后, 一个变量就声明好了,接下来怎么用,就要看自己的需要了。
|
|||
|
|
|||
|
注意:Thyme 语言的变量命名规则:变量通常只能由英文、数字和下划线组成,且数字不 能放在变量名的最前面(这个很重要!!!这个很重要!!!这个很重要!!!),如果 是中文变量的话,需要在变量后方加一个空格再进行赋值,其余条件同上。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
B. 变量类型
|
|||
|
|
|||
|
|
|||
|
|
|||
|
①整数变量
|
|||
|
整数变量正如其名,这里的变量使用的就是数学上定义的整数,比如 Variable=1。
|
|||
|
②浮点数变量
|
|||
|
浮点数又称作小数,数学上所涉及到的全部小数包括有理数和无理数都可以作为这个 变量的值,比如 Variable=61.6782。
|
|||
|
③字符串变量
|
|||
|
字符,顾名思义,就是我们平常用到的每个汉字,每个英文字母,甚至是数字,特殊 符号。字符串则是将这些字符连接起来后的一个完整的词语,短语或句子,在这里,字符 串变量的声明需要有一对双引号("")来引起一个字符或一个字符串,并将这个赋给变量, 比如 Variable=“a 啊12%… … !”。
|
|||
|
④布尔变量
|
|||
|
布尔值是由英国的数学家乔治 · 布尔发明的,它只有两种状态,即真(true) 和假(false), 在声明的时候只需要将 true 或 false 赋给变量即可,比如 Variable =false。
|
|||
|
注:上述四种变量里只有整数变量和浮点数变量存在负值。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Algodoo 贴吧专属 3 不可商用,违者必究
|
|||
|
|
|||
|
C.变量的使用
|
|||
|
|
|||
|
|
|||
|
|
|||
|
变量不同于常量,它是指变化的量、可变的量,将声明好的变量利用起来是非常重要的。 这里给出几种利用方式,以便于参考:
|
|||
|
①手动声明(赋值)
|
|||
|
例 :Variable1=true 或 Variable2=6221 或 Variable3="ab2"或 Variable4=251.61 <变量名> = <变量值>
|
|||
|
②变量之间的声明(赋值)
|
|||
|
例 :Variable2=251.1
|
|||
|
Variable1=Variable2
|
|||
|
此时 Variable1的类型会自动变成 Variable2的类型并获取 Variable2 的值。 ③变量的重复使用
|
|||
|
例 :Variable1=1 (此时 Variable1 的值是1)
|
|||
|
Variable1=Variable1+1 (此时 Variable1的值是2)
|
|||
|
例 :Variable1=1 (此时 Variable1的 值 是 1 )
|
|||
|
Variable1=Variable1+Variable2 (此时 Variable1的值取决于 Variable2的 值 ) 例 :Variable1=6 (此时 Variable1的值是6)
|
|||
|
Variable2=Variable1
|
|||
|
Variable3=Variable1
|
|||
|
此时 Variable2 与 Variable3 的值等同于 Variable1的值
|
|||
|
D. 在何处可以声明和使用变量 ①控制台
|
|||
|
②物件的脚本选单中
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(2)运算符
|
|||
|
|
|||
|
|
|||
|
运算符的种类
|
|||
|
在 Thyme 中的运算符有以下几类:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
①计算运算符
|
|||
|
|
|||
|
|
|||
|
|
|||
|
a.+ 加 b.- 减
|
|||
|
c.* 乘
|
|||
|
d./ 除
|
|||
|
e.% 取余 f.^ 幂运算
|
|||
|
|
|||
|
②逻辑运算符
|
|||
|
|
|||
|
|
|||
|
|
|||
|
a.&& 逻辑与 b.|| 逻辑或 c.! 逻辑非
|
|||
|
|
|||
|
|
|||
|
③条件运算符
|
|||
|
|
|||
|
|
|||
|
|
|||
|
a.> 大于
|
|||
|
b. < 小 于
|
|||
|
C.== 等于
|
|||
|
d.>= 大于等于 e.<= 小于等于 f.!= 不等于
|
|||
|
|
|||
|
|
|||
|
④其他运算符
|
|||
|
|
|||
|
|
|||
|
a.= 赋值运算符
|
|||
|
b., 逗号
|
|||
|
c.() 圆括号 d.; 分号
|
|||
|
e.{} 花括号
|
|||
|
f.[] 方括号
|
|||
|
|
|||
|
|
|||
|
|
|||
|
⑤判断运算符
|
|||
|
|
|||
|
|
|||
|
|
|||
|
条 件 ? {结果A} : {结果 B}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(3)If 条件判断
|
|||
|
|
|||
|
|
|||
|
If 条件语句是程序执行的流程中最重要的一部分,在其他的编程语言中是这样,在 Thyme 中也是如此,不过相对的, Thyme 的语法与其他编程语言依旧有所区别。
|
|||
|
|
|||
|
表达式:条件 ? {条件为真后所执行的代码} : {条件为假后所执行的代码}
|
|||
|
|
|||
|
|
|||
|
例子:
|
|||
|
①假设当前有个变量 A 且它的值是1,现在要求另一个变量 B 在 A 小于1时对外输出2, 在 A 大于等于1时对外输出3,则书写方式如下:
|
|||
|
A < 1 ? {
|
|||
|
B=2
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Thyme 脚本基础教程v1.0 Algodoo 贴吧团队制作
|
|||
|
|
|||
|
|
|||
|
}:{
|
|||
|
B=3
|
|||
|
|
|||
|
}
|
|||
|
②假设当前物体不具有杀手特性,现在有要求需要该物体具有杀手特性时本身颜色会变成 红色,则书写方式如下:
|
|||
|
killer?{
|
|||
|
color=[1,0,0,1]
|
|||
|
}:{}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(4)For 循 环
|
|||
|
|
|||
|
|
|||
|
|
|||
|
For循环语句作为 Thyme 中基本的流程语句,也是相当的重要,它一般在数组赋值和 刷物体上具有十分重要的意义。
|
|||
|
|
|||
|
|
|||
|
表达式: for(循环次数,(自变量)=>{每次循环都要执行的代码})
|
|||
|
|
|||
|
|
|||
|
例子:
|
|||
|
①单纯利用for的循环次数来执行代码:
|
|||
|
假设目前的场景中没有任何的圆形,此时要求需要刷出5个默认的圆,不更改其他设 置,则书写方式如下:
|
|||
|
for(5,(x)=>{
|
|||
|
Scene.addCircle({}) })
|
|||
|
以上代码执行完毕后将会在原点刷处5个默认圆。
|
|||
|
②利用 for循环中的自变量来执行代码:
|
|||
|
假设目前的场景中没有任何的圆形,此时要求需要刷出5个默认的圆并让它们的色相 依次增加五度,则书写方式如下:
|
|||
|
for(5,(x)=>{
|
|||
|
y=x*5;
|
|||
|
Scene.addCircle({
|
|||
|
colorHSVA:=[y,1,1,1]
|
|||
|
})
|
|||
|
})
|
|||
|
以上代码在执行之后的观察中可以发现,第一个球开始,每一个球都会逐渐增加5° 的值,直至循环结束。
|
|||
|
在这里如果想要得到 for中自变量的终值,则写法如下:
|
|||
|
for(n,(x)=>{
|
|||
|
X
|
|||
|
})
|
|||
|
或
|
|||
|
for(n,(x)=>{
|
|||
|
y=X
|
|||
|
})
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Algodoo 贴吧专属 6 不可商用,违者必究
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Thyme 脚本基础教程 v1.0 Algodoo 贴吧团队制作
|
|||
|
|
|||
|
|
|||
|
这块代码执行之后将会自动把自变量 x 的值输出到 for的外面。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(5)方法(函数)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
编程语言中经常会提到方法(函数)这个名词,而这个名词也无一例外地出现在了 Thyme 的语法中。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
①无参函数
|
|||
|
|
|||
|
|
|||
|
|
|||
|
一个不存在参数的函数被称为无参函数,在 thyme 中它有一个标准形式,它被写成:
|
|||
|
|
|||
|
|
|||
|
方法名(函数名) = {具有相关功能的代码}
|
|||
|
|
|||
|
|
|||
|
例 子 :
|
|||
|
A. 现 需 要 一 个 能 够 刷 半 径 为 1m, 生 成 位 置 为 鼠 标 位 置 , 颜 色 为 白 色 的 圆 的 套 组 代 码 , 因 控 制台中一遍遍输入太过麻烦,现在需要将其压缩一下,变成:
|
|||
|
AddSpecialCircle={
|
|||
|
Scene.addCircle({
|
|||
|
pos:=App.mousePos;
|
|||
|
radius:=1;
|
|||
|
color:=[1,1,1,1]
|
|||
|
})
|
|||
|
|
|||
|
}
|
|||
|
输完后回车,即可得到这样一个具有特殊功能的代码 AddSpecialCircle, 在控制台中输
|
|||
|
入 AddSpecialCircle 后回车,将会在鼠标指针的位置生成一个半径为1m, 颜色为白色的圆。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
B. 现 在 我 有 一 个 数 字 A=1, 我 需 要 对 它 进 行 一 个 加 1 运 算 , 但 是 因 为 一 遍 遍 手 动 输 入 非 常 不方便,我可以将这个动作进行打包,变成:
|
|||
|
AddOne={
|
|||
|
A=A+1
|
|||
|
|
|||
|
}
|
|||
|
这样, 一个对 A 进行加一的功能就做出来了,在输入 AddOne 回车后,我们不仅可以 发现 A 加了1变成了2,同时也可以发现控制台中也会出现 一 个与 A 相同的数字,这个数 字 可 以 被 称 作 返 回 值 , 它 取 决 于 这 个 函 数 中 最 后 一 行 输 出 的 值 。 这 里 我 再 引 入 两 个 变 量 B 和 C, 并将它们赋值为 B=100 和 C=20, 此时,将 AddOne 改成:
|
|||
|
AddOne={
|
|||
|
A=A+1;
|
|||
|
B=B+2;
|
|||
|
C=C+5;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
Algodoo 贴吧专属 7 不可商用,违者必究
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Thyme 脚本基础教程 v1.0 Algodoo 贴吧团队制作
|
|||
|
|
|||
|
|
|||
|
回车后输入 AddOne, 我们会得到 一 个数25,这个就是 AddOne 中 C=C+5 所得到的值,
|
|||
|
当然,如果想要输出 A 或 B 的值也是可行的,只需要在最后加上 A(或 B)的字母即可。
|
|||
|
AddOne={
|
|||
|
A=A+1;
|
|||
|
B=B+2;
|
|||
|
C=C+5;
|
|||
|
A(或 B);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
这个特性可以用来进行一些其他的运算,这里不再进行过多阐述。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
②有参函数
|
|||
|
|
|||
|
|
|||
|
|
|||
|
有参函数顾名思义就是有参数的函数,他的书写规则与无参函数有些不同,它通常被 写成:
|
|||
|
|
|||
|
方法名(函数名)=(参数1,参数2,…,参数 n)=>{ 具有相关功能的代码}
|
|||
|
|
|||
|
|
|||
|
例子:
|
|||
|
A. 有参数但不使用参数(功能近似等同无参函数)
|
|||
|
B. 有参数且使用参数
|
|||
|
首先我们定义外部变量 A=100 、B=30 0, 现在我们需要有个函数能够让 A 与 B 的值自由 变化,写法如下:
|
|||
|
ChangeNumA=(c)=>{
|
|||
|
A=A+c;
|
|||
|
|
|||
|
B=B+C
|
|||
|
|
|||
|
}
|
|||
|
回车并输入 ChangeNumA(100), 我们可以得到它的值是400,同时 A 的值也变成了
|
|||
|
200,B 的值变成了400,如果继续输入 ChangeNumA(100), 它的值会变成500,同时同时
|
|||
|
A 的值也变成了300, B 的值变成了500。在这里,有参函数的返回值与无参函数是相同的, 最后 一 行的值即为输出的返回值,这个返回值在函数之间的调用中非常有用,在其他地方 也很有用,在这里不做过多解释。
|
|||
|
在这里,有参函数有一个特别的特性,那就是函数型参数。
|
|||
|
函数型参数在 Thyme 并不能直接以函数形式直接出现在参数括弧中,它们通常会把自 己藏在 一个函数的内部,这里给大家举个例子:
|
|||
|
fun=(function,x)=>{
|
|||
|
function(x);
|
|||
|
|
|||
|
};
|
|||
|
注:这里的 function 已经构成了函数型参数
|
|||
|
将上方代码输入到控制台中,我们便可以得到 一个带有函数型参数的有参函数,这 一 类的函数使用有这样 一个规则,即:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Algodoo 贴吧专属 8 不可商用,违者必究
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Thyme 脚本基础教程 v1.0 Algodoo 贴吧团队制作
|
|||
|
|
|||
|
|
|||
|
fun((函数型参数的虚拟自变量)=>{
|
|||
|
函数型参数的函数表达式
|
|||
|
},影响该函数参数的实际自变量);
|
|||
|
|
|||
|
|
|||
|
现在,我们将
|
|||
|
“函数参数的虚拟自变量”改成 z;
|
|||
|
“函数参数的函数表达式”改为 z^2;
|
|||
|
“影响该函数参数的实际自变量”改为任意数字,这里我们输个4; 现在我们可以得到这样一个函数
|
|||
|
fun((z)=>{z^2},4)
|
|||
|
回车之后,我们可以得到一个结果16,这样, 一个函数参数的使用就结束了。
|
|||
|
顺便提醒一下,这里Thyme 所写过的所有代码都是可以被新的代码覆盖的,使用起来 非常方便,如果能做到同一变量的复用,则可以尽最大可能减少资源占用。
|
|||
|
最后,注意使用的参数名不要与局部变量,方法名,类名等重复,否则会报错。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(6)类
|
|||
|
|
|||
|
|
|||
|
类的概念在 Thyme 中比较模糊,它从某种意义上可以划为无参函数中的一部分,但是 却不同于无参函数,同时,它又可以划为有参函数,同样的也不属于有参函数,它的存在 比较特别,我们接下来将对它进行简单的解释:
|
|||
|
|
|||
|
|
|||
|
①类的书写形式
|
|||
|
|
|||
|
|
|||
|
|
|||
|
类名={
|
|||
|
//这是一个类变成实例的前提//
|
|||
|
类的代替名=alloc;
|
|||
|
|
|||
|
|
|||
|
//这一块表示类的变量被初始化//
|
|||
|
类的代替名.变量名1=数据;
|
|||
|
类的代替名.变量名2=数据;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
类的代替名.变量名 N= 数据;
|
|||
|
类的代替名.方法1(函数1)=null;
|
|||
|
类的代替名.方法2(函数2)=null;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
类的代替名.方法 N(函数 N)=null;
|
|||
|
|
|||
|
|
|||
|
//这一块表示类中函数的定义//
|
|||
|
类的代替名->{
|
|||
|
无参数方法(无参函数)=>{内容};
|
|||
|
有参数方法(有参函数)=(参数)=>{内容}
|
|||
|
|
|||
|
Algodoo 贴吧专属 9 不可商用,违者必究
|
|||
|
|
|||
|
};
|
|||
|
//将类所蕴含的所有东西全部输出//
|
|||
|
类的代替名;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
②类中的相关知识点
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A. 一个类可以用来表示一个大的功能,也可以将一些函数归纳整理在这一个类中,具体用 来干什么,全看个人。
|
|||
|
B.Alloc 是 thyme 中用来实例化类的一个代码,如果没有它,编译器在进行实例化时将不 会认为这个类是可用的。
|
|||
|
C. 一个类在制作完毕后一定要在使用之前进行实例化,否则这个类将不会有任何作用。
|
|||
|
D. 类中可以不包含变量,也可以不包含方法(函数),如果有方法(函数)的化, 一定要进行 方法(函数)的制作。
|
|||
|
E. 如果父类中有子类,则该子类不能使用父类的相关东西。(问题比较少见)
|
|||
|
F. 如果要使用变量,请尽量避免其变量名与任何已有的类名重复
|
|||
|
|
|||
|
|
|||
|
③例子
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A. 类实际写法
|
|||
|
假设现在需要一个能够计算加法的类,可以这样写:
|
|||
|
AddNeed={
|
|||
|
An=alloc;
|
|||
|
An.Add=null;
|
|||
|
An->{
|
|||
|
Add=(a,b)=>{
|
|||
|
A+B;
|
|||
|
}
|
|||
|
};
|
|||
|
An;
|
|||
|
|
|||
|
}
|
|||
|
写完后回车,这个类就完工了,
|
|||
|
B. 类的实例化
|
|||
|
类的实例化是指将制作好的类导入到外部变量中的过程,这里举个例子,就拿上面那个
|
|||
|
AddNeed 类来说吧,这里起一个随便点的名字 test, 让 test=AddNeed, 然后回车,即可发 现有 unnamed 出现,证明这个类没有问题,现在,这个类就被实例化了。
|
|||
|
C. 类的使用
|
|||
|
制作好的类在被实例化后,可以发现之前被赋值的变量后面多了个”.”,这说明这个类可以 使用了,以上面那个为例子,我们输入 test. 后按下 tab 键可以发现立即补全了一个 Add,
|
|||
|
此时立刻回车可以发现出现了(a,b)=>{A+B}, 这是我们之前类中所写的算法,现在可以通 过这种方式来直接查看。如果是有参函数的话,可以在函数名后面加”(参数)”后回车以得到 返回的结果,如果是无参函数,则直接回车即可得到返回的结果。
|
|||
|
|
|||
|
(7)标识符
|
|||
|
|
|||
|
|
|||
|
标识符在 Thyme 中处于一个很不起眼的位置上,看似没有什么用,实际用处非常大, 接下来我们开始进行讲解。
|
|||
|
|
|||
|
|
|||
|
①标识符是什么及标识符的作用
|
|||
|
|
|||
|
|
|||
|
|
|||
|
标识符是一种能够帮助区分“现在”跟“将来”的符号,它在 Thyme 中以“:=”出现, 其形式像“=”,但却不同于“=”,带有“:=”的变量、函数、类将以一种“将来”的形 式出现,而“=”是以“现在”的形式出现。
|
|||
|
这里的“将来”是指该变量(函数、类)在以后会出现,而目前并不存在。
|
|||
|
这里的“现在”是指该变量(函数、类)在当前已经存在,且以后也存在。
|
|||
|
|
|||
|
|
|||
|
②例子
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A. 假设我们目前没有 A 这个变量,现在我们需要对 A 进行声明,令 A:=100, 回车,此时 我们可以得到 A=100, 并且发现原来没有的 A, 现在已经有了。
|
|||
|
B. 假设我们现在已经有了A 这个变量并且 A=100, 现在我们再对 A 进行声明,令
|
|||
|
A:=200, 回车,此时我们可以发现,系统给出了一个"Variable "A"already declared in this scope” 的提示,它的意思是说“变量‘A'已在此范围中声明”,这意味着同样一个变量 不能在同一个地方声明两次。同时我们可以发现在这句话后紧跟着一个数字200,现在我
|
|||
|
们在来输入 A, 回车,可以得到 A=200。
|
|||
|
综上,标识符能够创建新的变量(函数、类),并且可以将新建对象的值覆盖到已有 的对象上。
|
|||
|
|
|||
|
|
|||
|
(8)结构
|
|||
|
|
|||
|
|
|||
|
在 Thyme 中,结构是用来存储不同数据类型(数值,字符串,布尔值,函数,数组)的 一个项,它可以存在于任何地方,通常情况下,自定义结构在关闭 Algodoo 后会被自动清 除。
|
|||
|
①自定义结构的书写形式
|
|||
|
A. 临时型(可以随时添加新的条目) > 结 构 名 =alloc
|
|||
|
>结构名.变量1= true
|
|||
|
>结构名.变量2=14.1
|
|||
|
>结构名.变量3=“BBAE”
|
|||
|
B.类-型(可以在使用之前添加条目,在使用过程中依然可以添加新的条目(不建议)) 结构名={
|
|||
|
结构名=alloc;
|
|||
|
结构名.变量1=true;
|
|||
|
结构名.变量2=13;
|
|||
|
|
|||
|
结构名.变量3="agc";
|
|||
|
结构名;
|
|||
|
|
|||
|
}
|
|||
|
②现有结构
|
|||
|
A.Scene.my.变量名
|
|||
|
B. 所有已存在类.变量名
|
|||
|
由此我们可以看出,结构其实就是一个简单的类,通常情况下,结构的稳定性相较类 而言,稳定性较差,在写代码时应尽量减少结构的出现。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(9)数组
|
|||
|
|
|||
|
|
|||
|
数组的表现形式通常以方括号的形式出现在我们面前,它的形式如同集合,里面由一 个一个的元素组成,然而里面的元素不同,带来的这个集合的性质也就不同,接下来将介 绍几种 Thyme 中的数组形式。
|
|||
|
|
|||
|
|
|||
|
①数组的几种形式
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A.普通数组
|
|||
|
普通数组,是一种由普通的数据(字符串,数值,布尔值)构成的数组。
|
|||
|
数组=[数据1,数据2,数据3, ……,数据 n] 例:
|
|||
|
A=[1,2,3,4];
|
|||
|
B=[True,False,True,False];
|
|||
|
C=[“abc”,"bcd”,"efg"]
|
|||
|
D=[1,true,"abcDefg"]
|
|||
|
B.变量数组
|
|||
|
变量数组,是一种由变量构成的数组,该数组元素的值取决于变量值,这种数组往往 需要依靠一个持续执行的函数(update 或 postStep 类的函数)来进行实时更新。
|
|||
|
数组=[变量1,变量2,变量3, ……,变量 n] 例:
|
|||
|
A=[Sim.frequency,Sim.windAngle]
|
|||
|
C.方法数组
|
|||
|
方法数组,指由方法(函数)构成的数组,该数组的元素既不是任何形式的数值,也不 是变量,而是一个又一个的算法,在使用方法数组前需要将数组的元素提取出来然后才能 使用该元素所包含的方法。
|
|||
|
数组=[{方法1},{方法2},{方法3}……,{方法 n}] 例:
|
|||
|
A=[{C=A+B},{C=A-B},{C=A*B},{C=A/B}]
|
|||
|
D.交错数组
|
|||
|
交错数组,指的是由数组构成的数组,因该数组的元素是由数组构成的,故在原始数 组的基础上增加了数组的容量。
|
|||
|
数组=[[数组1],[数组2],[数组3], ……,[数组4]]
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Thyme 脚本基础教程v1.0 Algodoo 贴吧团队制作
|
|||
|
|
|||
|
|
|||
|
例:
|
|||
|
A=[
|
|||
|
[1,2,3,4],
|
|||
|
[“abc","def","ghi”,"jkl"], [true,false],
|
|||
|
[{c=a+b},{c=a-b}] ]
|
|||
|
|
|||
|
|
|||
|
②数组元素的访问方式
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A. 非交错数组
|
|||
|
非交错数组的元素访问形式通常以“数组名”+“(序号)”的形式进行访问,在访问数 组时,序号只能在0~N-1 上进行取值,其中N 代表元素个数。
|
|||
|
例:
|
|||
|
>A=[51,11,74,23,8457,1];
|
|||
|
>B=A(O)
|
|||
|
B=51
|
|||
|
|
|||
|
|
|||
|
>A=["abc","def","ghi","jkl"];
|
|||
|
>B=A(3)
|
|||
|
B=jkl
|
|||
|
B. 交错数组
|
|||
|
交错数组的元素访问形式是以非交错数组为基础,在此情况上以多个序号相连来访问 数组中数组的元素,一般情况下,交错数组中元素的访问容易产生混乱,使用时请务必注 意。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
例:
|
|||
|
>A=[[[1,2,3],2,3,4],["abc","def","ghi","jkl"],[true,false],[{a+b},{a-b}]] >B=A(O)(0)(2)
|
|||
|
B=3
|
|||
|
|
|||
|
|
|||
|
|
|||
|
③方法数组的使用方式
|
|||
|
|
|||
|
|
|||
|
|
|||
|
方法数组在使用时不同于其他数组,方法数组在使用时需要先将元素提取出来,然后 才能使用方法数组中的元素。
|
|||
|
例子:
|
|||
|
>D=10;B=20
|
|||
|
>A=[{D+B},{D-B},{D*B},{D/B}] >C=A(O)
|
|||
|
C=30
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Algodoo 贴吧专属 13 不可商用,违者必究
|
|||
|
|
|||
|
(10) 指针
|
|||
|
|
|||
|
|
|||
|
在 Thyme 中,与一个变量相连的另外一个变量被称作该变量的指针,指针变量通常可 以被用来读取另外一个变量的值,同样的,指针变量也可以将指向的变量进行值的修改。
|
|||
|
指针变量={指向变量} 例:
|
|||
|
>A=1
|
|||
|
>B={A+1} B=2
|
|||
|
>A=2 B=3
|
|||
|
|
|||
|
|
|||
|
(11) .phz 和 .phn 文件
|
|||
|
|
|||
|
|
|||
|
|
|||
|
①.phz 文件(可通过各种压缩软件打开查看)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Algodoo 通常以.phz 形式保存场景和元件,然而我们将它拆开来仔细查看,可以发现
|
|||
|
它是一个特别的压缩文件,我们所保存的所有Algodoo 场景和元件在.phz 中一般以三个文
|
|||
|
件表示,它们是 thumb.png (存档缩率图)、scene.phn(存档本体)、checksums.txt(存档序号码), 这三个文件,除此之外,后来放入的其他文件, Algodoo 将不会自动读取。
|
|||
|
|
|||
|
|
|||
|
②.phn 文件(可通过各种非word 文本编辑软件进行编辑)
|
|||
|
|
|||
|
|
|||
|
在打开的.phz 中,一定存在一个.phn 文件,该文件是这个存档的核心部分。我们用记 事本打开来查看,可以发现这里面是用 Thyme 语言书写的,在这里面添加或删除相关数据, 均会影响存档打开后的情况,具体修改还请遵守Thyme 语言的相关语法规范。
|
|||
|
|
|||
|
|
|||
|
(12) Thyme 额外知识点
|
|||
|
|
|||
|
|
|||
|
|
|||
|
①什么是“->”
|
|||
|
|
|||
|
|
|||
|
|
|||
|
它是一个重定向符号,用于将当前值定向到另一个结构里。
|
|||
|
例:
|
|||
|
在控制台中输入 Scene->{my->{内容}}并回车,此时,重定向括号内内容的值将会覆盖 掉 Scene.my 内已有内容的值。
|
|||
|
现在键入以下例子变量并回车:
|
|||
|
Scene.my.Variable1=1;
|
|||
|
Scene.my.Variable2=0;
|
|||
|
Scene.my.Variable3=3;
|
|||
|
|
|||
|
Scene->{
|
|||
|
my->{
|
|||
|
Variable1=6;
|
|||
|
Variable2=2;
|
|||
|
Variable3=4
|
|||
|
|
|||
|
}
|
|||
|
};
|
|||
|
//得到的结果如下:
|
|||
|
Scene.my.Variable1=6;
|
|||
|
Scene.my.Variable2=2;
|
|||
|
Scene.my.Variable3=4
|
|||
|
重定向在需要进行大量修改时,可以节省大量的输入时间。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
② 注 释
|
|||
|
|
|||
|
|
|||
|
|
|||
|
注释是一种特殊的文字,在 thyme 语言中,被注释的文字将不会被计算机所读取,此 特性可以用来书写与代码有关的解释。
|
|||
|
A. “//”可以注释一行字
|
|||
|
B.“/**/” 将文字放在两个“*”中间便可以注释相关文字。
|
|||
|
|
|||
|
|
|||
|
③字符串扩展
|
|||
|
|
|||
|
|
|||
|
|
|||
|
我们都知道,一成不变的字符串变量是不可能满足我们所有需求的,当我们需要将原 始字符串进行加长时,我们可以用“+”来将两个字符串合并到一起,这样,一个新的字符 串将出现在我们面前(注意:Thyme 没有字符剔除功能)
|
|||
|
例子:
|
|||
|
>A="aaa"
|
|||
|
>A=A+“bbb”
|
|||
|
A=“aaabbb”
|
|||
|
|
|||
|
|
|||
|
|
|||
|
④触发器和更新器
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A. 触发器
|
|||
|
触发器在 Algodoo 中只存在于实体上,它们往往在满足一定条件时才会执行它们所包 含的代码。
|
|||
|
OnKey 在按下按键时触发
|
|||
|
OnCollide 在碰撞时触发
|
|||
|
OnSpawn 在该实体生成于场景中时触发
|
|||
|
OnHitByLaser 实体被镭射笔击中时触发(实体特有)
|
|||
|
OnClick 在点击该实体时触发
|
|||
|
OnDie 在该实体消失时触发
|
|||
|
OnLaserHit 镭射笔击中实体后触发(镭射笔特有)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Thyme 脚本基础教程 v1.0 Algodoo贴吧团队制作
|
|||
|
|
|||
|
|
|||
|
B. 更新器
|
|||
|
更新器在 Algodoo 中只存在于实体上,它们往往在系统运行后就会执行它们所包含的 代码 。
|
|||
|
postStep 按下运行按钮后的每一帧都在执行,与拟真运行按钮的状态有关
|
|||
|
Update 程序启动后的每一帧都在执行,与拟真运行按钮的状态无关
|
|||
|
|
|||
|
|
|||
|
⑤何时使用分号
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Thyme 语言中分号的使用时机比较灵活,如果只有 一 行语句则该语句后可以不加分号,
|
|||
|
但若是有多行语句,则除了最后 一 行可以考虑加分号以外,其余行都必须添加分号。
|
|||
|
|
|||
|
|
|||
|
2. 进阶部分
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(1)对象指针(此功能 BUG 太多故暂不包含例子)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
对象指针是 一 种特殊的指针,它指向的不是 一 个数值,而是 一 个 algodoo 场景中存在 的,能够被选中的物体,我们利用指针变量可以从其他地方对该物体的相关属性值进行修 改 。
|
|||
|
对象指针往往包含以下两部分:
|
|||
|
|
|||
|
|
|||
|
实体绑定部分(将其放于实体的触发器或更新器中并替换“(e)=>{}”):
|
|||
|
(参数)=>{充当该实体的变量={参数}}
|
|||
|
需要注意的是,对象指针需要指向一个实体(像几何体,镭射笔等),如果指向的是一 个非实体则将会出现错误。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
访问部分:
|
|||
|
充当该实体的变量 .this.
|
|||
|
|
|||
|
|
|||
|
(2)扩展型 for
|
|||
|
|
|||
|
|
|||
|
|
|||
|
在基础部分我们提到了for 循环,而在Thyme 语 言 中 ,for 的循环是利用迭代原理实现 的,在日常使用时往往会造成很多不便(如堆栈溢出),所以在这我们可以利用扩展结构无
|
|||
|
限制增大循环的次数,以实现我们想要的任何结果。
|
|||
|
用法举例:
|
|||
|
Test=(a,r,c)=>{
|
|||
|
C<r?{a(c)}:{};
|
|||
|
(c+1)<r?{a(c+1)}:{};
|
|||
|
(c+2)<r?{a(c+2)}:{};
|
|||
|
0
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Algodoo 贴吧专属 16 不可商用,违者必究
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Thyme 脚本基础教程 v1.0 Algodoo 贴吧团队制作
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(c+(N-1))<r?{a(c+(N-1)}:{};
|
|||
|
(c+N)<r?{Test(a,r,(N))}:{}
|
|||
|
|
|||
|
}
|
|||
|
例子中每增加一行代码意味着增加一倍的循环次数上限。
|
|||
|
其中:
|
|||
|
a 代表“(自变量)=>{每次循环都要执行的代码}”;
|
|||
|
r代表循环次数上限;
|
|||
|
c 代表循环次数下限;
|
|||
|
在这个方法中,实际循环次数 n 需要用 r-c 来代替并且 r 要大于c, 否则该方法将不 会执行。
|
|||
|
|
|||
|
|
|||
|
(3)更新链接(自身变量锁定)
|
|||
|
|
|||
|
|
|||
|
有些时候在 Algodoo 中保存的东西可能会因为某些原因而丢失掉数据,此时就需要引 入更新链接对会丢失数据的变量进行锁定,以便于以后的再次使用,这对于弹簧、轴承和 推进器十分有用。
|
|||
|
用法举例:
|
|||
|
物体上暂时不需要修改的属性(像 opaqueBorders 、dampingFactor 等属性)={ 物体上想要保留的属性={
|
|||
|
内容
|
|||
|
};
|
|||
|
暂时不需要修改的属性的值
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(4)数组元素追加
|
|||
|
|
|||
|
|
|||
|
|
|||
|
在前面的基础部分我们提到过数组,而数组中的元素个数为定值。 一般情况下,固定 元素个数的数组对我们来说基本够用,可是一旦出现特殊情况,那么这种数组将不会再满 足我们的使用,这时候就可以使用“++”对数组元素个数进行追加,以改变数组的大小。
|
|||
|
|
|||
|
用法举例:
|
|||
|
数组 A= 数组 A++ 数组 B 例:
|
|||
|
>A=[1,2,3]
|
|||
|
>B=[4,5]
|
|||
|
>A=A++B
|
|||
|
A=[1,2,3,4,5]
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Algodoo 贴吧专属 17 不可商用,违者必究
|
|||
|
|
|||
|
(5)局部变量声明
|
|||
|
|
|||
|
|
|||
|
局部变量在 Thyme 中非常有用,它的出现能够防止函数或实体中的值泄露到根域中, 保证了数据的安全性。
|
|||
|
①函数中的局部变量
|
|||
|
在基础部分中我们讲到过函数,函数一般是由各种算法构成的,它们在执行的时候通 常需要执行计算。 一个函数中如果经常使用全局变量,将会导致这个函数的值泄漏到函数 外面,造成数据的混乱,所以我们在此引入局部变量。
|
|||
|
用法举例:
|
|||
|
测试函数={
|
|||
|
局部变量:=15;
|
|||
|
全局变量 A=全局变量A+局部变量; }
|
|||
|
这个例子就是运用了局部变量对全局变量的控制,使得全局变量 A 在每次执行该函数 时都会自动增加15。
|
|||
|
②实体中的局部变量
|
|||
|
实体中的局部变量如同实体的属性一样,此内容将会在“物体的脚本选单”部分进行 讲解,在此我们不会进行讲解。
|
|||
|
|
|||
|
|
|||
|
(6)对象评估
|
|||
|
|
|||
|
|
|||
|
该系列比较特别,它们均有一个共性,那便是具有一个字符串形式的参数。 ①Reflection.executeCode
|
|||
|
该代码的作用是将已存在的代码进行执行并输出结果。
|
|||
|
例:
|
|||
|
A. 计算一个字符串中的数据
|
|||
|
加:Reflection.executeCode("50+2"), 结果:52 减:Reflection.executeCode("50-2"), 结果:48
|
|||
|
乘:Reflection.executeCode(“50*2”), 结果:100 除 :Reflection.executeCode(“50/2”), 结果:25
|
|||
|
取模:Reflection.executeCode("50%2"), 结果:0
|
|||
|
幂运算: Reflection.executeCode(“50^2”),结果:2500 与:Reflection.executeCode("true&&false"), 结果:false 或:Reflection.executeCode("true||false"), 结果:true 非:Reflection.executeCode("!true"), 结果:false
|
|||
|
B. 计算多个字符串的相关联(只能用加号相关联)数据
|
|||
|
例:Reflection.executeCode(“50+2"+"50+2”),结果:50+250+2=302
|
|||
|
Reflection.executeCode 的作用除了可以计算单一字符串的功能外,还可以计算多个字 符串合并之后的值。当 Reflection.executeCode 的括号中有两个以上的字符串时,则需要将 它们用“+”连接到一起。当两个字符串中均有数字需要运算时, Reflection.executeCode将 首先会将多个字符串合并,然后计算合并之后的值。
|
|||
|
C. 执行一个字符串中所包含的代码
|
|||
|
|
|||
|
>A={b+c} >b=1
|
|||
|
>c=2
|
|||
|
>Reflection.executeCode("a"), 结果为3
|
|||
|
②Reflection.executeFile
|
|||
|
该代码的作用是将已存在的文件进行读取执行并输出结果,特别的一点是它可以从外 部读取外部文件中已存在的数据到 Algodoo 中 。
|
|||
|
例:三种读取文件的方式
|
|||
|
A.从 Algodoo 根目录读取文件
|
|||
|
写法:Reflection.executeFile(“ 文件名.扩展名”)
|
|||
|
B.从 Algodoo 目录下的相对路径读取文件
|
|||
|
写法:Reflection.executeFile(“\\文件夹名\\文件名.扩展名”)
|
|||
|
C.从绝对路径读取文件
|
|||
|
写法:Reflection.executeFile(“盘符:\文件夹名\\文件名.扩展名”)
|
|||
|
读取文件的类型:.txt.cfg .ini 等文本形式文件
|
|||
|
③eval
|
|||
|
该代码的作用是将已存在的代码进行执行并输出结果,同 Reflection.executeCode, 但 是作用范围不同, eval的作用范围可大可小,而 Reflection.executeCode的范围目前仅仅只 能在[ROOT] 域中使用。
|
|||
|
|