发新话题
打印

[推荐]Lingo教程

本帖已经被作者加入个人空间

[推荐]Lingo教程

l        [b]Lingo简介[/b]
Lingo是Director中的描述式语言,使用Lingo可以增加movie的互动性,如跳到不同的movie、使用鼠标与键盘的回馈、输入信息、移动对象、按按钮、播放音效、控制影片播放等等。
Lingo的语法就像Basic一样简单,也有一般程序语言的变量、函数、判断、循环等基本概念。而在Director的Help中也附了一本最方便的Lingo字典:Using Lingo(Help>Lingo Dictionary)。

l        [b]术语简介[/b]
¨           Command(指令)
Ø         使Director去做某些动作的命令,如go可跳到指定的frame或movie。
¨           Function(函数)
Ø         根据呼叫函数时所传入参数(或不传入),会传回一个值,如date()传回今天日期、max(a, b)会传回a与b中的最大值。
¨           Handler(处理函数)
Ø         movie在播放时会产生一些事件(Event),Handler是用来接收并处理这些事件的,如以下程序代码(其中on mouseUp ... end即是一个Handler),当鼠标click后,便让系统「哔」一声。
on mouseUp
  beep
end
Ø         使用者可以自订处理函数,将有用的程序代码集合起来重复利用。
¨           Event(事件)
Ø         movie在播放时会产生的事件,如movie开始或停止时、鼠标按下时、键盘按下时,都会有事件产生。
¨           Variable(变量)
Ø         变量是用来储存数值、字符串、symbol、list、对象的,可以用等号(=)去指定一个变量,如以下的程序代码就是将myVar的值设为15
myVar = 15
¨           Constant(常数)
Ø         Director内定的一些固定值,使用者无法改变其值,如TAB、EMPTY、RETURN等。
¨           Keyword(关键词)
Ø         具有特殊意义的保留字,自订变量不可用Keyword的字作为变量名称。如end表Handler的结尾。
¨           Operator(运算符号)
Ø         将一个或以上的值计算出新的值出来。如加减乘除分别为+、-、*、/。
¨           Property(属性)
Ø         对象都会有些属性,如sprite有blend、visible等属性。

l        [b]Script的种类[/b]
¨           behavior(行为)
Ø         可细分为sprite behavior及frame behavior,附加(attach)在sprite上的称sprite behavior,而放在score中script channel的称frame behavior。
Ø         一个behavior可附加在多个sprite上,达到重复利用的特性,只要编辑此behavior,则同时会影响所有附加此behavior的sprite。
¨           movie script
Ø         movie script对目前的整个movie都有作用,不论在哪个frame或在哪个sprite,都可以呼叫movie script中的处理函数。
Ø         movie script能处理movie开始、结束播放时的事件,常用于程序的初始化以及结束时释放资源。
Ø         如果是共享的自订处理函数,可以放在movie script中供所有程序使用。
Ø         movie script可处理整个movie的键盘、鼠标事件,不过通常还是由behavior来处理比较适合、比较好管理。
¨           parent script
Ø         用于OOP(对象导向程序设计)的script,过于进阶,在此不详述。
¨           cast member script
Ø         直接附加在cast member上的script。因为管理不易、重复利用度不高,一般较少用。

l        [b]变量可见范围[/b]
¨           全域变量
Ø         用global将变量宣告成全域变量,可让其它地方使用此一变量,如下程序代码。若一次宣告二个以上的变量,则用逗点(,)隔开即可。
global gUserName
global gGameLevel, gSize
Ø         二个不同的script中若都要用到某全域变量,则二个script中都要以global来宣告。
Ø         在全域变量的命名上,习惯会将变量名称最前面加上一个g,以便区别,如userName→gUserName、size→gSize(非必须,但建议)。
¨           属性变量
Ø         [b]仅能用在[/b][b]behavior[/b][b]或[/b][b]parent script[/b]
Ø         用property将变量宣告成属性变量,可让该script中任何handler使用此一变量,如下程序代码。若一次宣告二个以上的变量,则用逗点(,)隔开即可。
property pIdNum
property pName, pIsLock
Ø         在属性变量的命名上,习惯会将变量名称最前面加上一个p,以便区别,如idNum→pIdNum、name→pName(非必须,但建议)。
¨           区域变量
Ø         不特别指定成全域变量或属性变量者,即为区域变量,其值只在定义此变量的区块中有效;出了此区块,变量便会消失,不会记录。

l        [b]各种资料型态的表达[/b]
¨           字符串
Ø         用双引号括起来的即为字符串,如 "中英皆可, nice!" 即是一段字符串。
¨           整数
Ø         不含小数的数值为整数,整数范围介于-2,147,483,648~+2,147,483,647间,另外可以用integer()函数将浮点数转成整数。
¨           浮点数
Ø         含小数的数值为浮点数,可以用float()函数将整数转成浮点数。
¨           symbol(符号)
Ø         乃是供使用者自订之常数,须以井字号开头,如:#myName、#color等。
Ø         符号和字符串类似,但比字符串执行更有效率。
¨           常数
Ø         Director内定的一些固定值,使用者无法改变其值,如TRUE、FALSE、VOID、EMPTY、BACKSPACE、ENTER、QUOTE、RETURN、SPACE、TAB等皆为常数。
¨           cast member
Ø         在程序中常会要指定某个cast member,如一个名为"ball"的cast member,在名为"toy"的cast中,指定的方式即为member("ball", "toy")。注意,如果在该cast中有二个以上的cast member皆命名为"ball"时,Director会采用编号较小的那一个,故每个cast member命名最好都不一样。
Ø         如果省略cast的名称亦可,如上例可改成member("ball"),不过Director会由第一个cast搜寻到最后一个cast,采用第一个找到、且命名为"ball"的cast member。
¨           sprite
Ø         sprite(1)指第1个channel的sprite,sprite(2)指第2个channel的sprite,以此类推。

l        [b]运算符号[/b]
运算符号主要是将资料作运算、结合、比较、修饰等,种类如下:
¨           数学算符
Ø         加(+)、减(-)、乘(*)、除(/),和数学计算规则相同,由左至右计算,先乘除后加减。
Ø         另有求余数(mod)算符,如12 mod 5的结果会为2
Ø         用一组小括号( )可以将包围起来的算式优先计算,如下程序代码:
--以下结果为14
result = 2 + 4 * 3
--以下结果为18
result = (2 + 4) * 3
¨           比较算符
Ø         等于(=)、不等于()、小于()、小于等于()、大于(>)、大于等于(>=)
Ø         用于比较数值、字符串的大小或是否相等,结果为TRUE(真)或FALSE(假)
¨           逻辑算符
Ø         and:二者皆为TRUE时,结果才为TRUE,否则结果为FALSE。
Ø         or:二者其中一者为TRUE或二者皆为TRUE时,结果才为TRUE,否则结果为FALSE。
Ø         not:若原本的值是TRUE,结果即为FALSE;若原本的值是FALSE,结果即为TRUE。
¨           字符串算符
Ø         ":标明字符串的起点和终点,如 "中英皆可, nice!" 即是一段字符串。
Ø         &:连结二段字符串
Ø         &&:连结二段字符串,并在二段字符串间多加上一格空格符。

l        [b]语法[/b]
¨           啰嗦语法(verbose syntax)与点语法(dot syntax)
Ø         早期Lingo采用「啰嗦语法」,语法接近英文文法,缺点是太啰嗦,遇到太复杂的程序时会很难维护。从Director 7.0之后Lingo加入了「点语法」,让程序代码变得更简明清楚。目前是二种语法皆支持,建议以「点语法」来撰写程序。以下程序代码分别用二种语法撰写,皆为将sprite 1的cast member名称设为"ball"。
--啰嗦语法
set the name of the member of sprite 1 to "ball"
--点语法
sprite(1).member.name = "ball"
¨           空格符
Ø         Lingo使用空格符分隔程序中的每个字,而多余的空格符会被程序忽略而不会造成任何影响,所以可以利用空格符来对齐程序代码,让它看起来易读些。
¨           大小写
Ø         Lingo不分大小写,若一个变量写成username或UserName都会被视为同一个变量。不过,养成一个良好的习惯:将不同地方的变量大小写固定一种写法,对程序代码阅读与维护都是有帮助的。
¨           批注
Ø         只要程序代码前面加上二个短横线(--),该符号后的文字便为批注,程序不会去执行。如以下程序代码。
--这是一段批注,这段不会被执行
result = a + b *5     --写在这里也算是批注
Ø         批注主要用途是为程序加注说明,即使是自己写的程序,一段时间后也会忘记原始在写程序时的架构,所以为你的程序写批注是一定要的。
Ø         有时写程序时遇到bug或想暂时把某些程序功能关起时,也可以用批注的方式,暂时让程序不会去执行到某段程序代码。
¨           简写
Ø         Lingo有些指令中,部分字可以省略,如go to frame 10可以简写成go frame 10,甚至可写成go 10。

l        [b]程序流向控制[/b]
一般程序代码会从上往下一行一行执行,如果使用if、case、repeat等条件或循环可让程序的流向作改变。
¨           条件判断
Ø         使用if
--如果...就...
if x > 10 then
  go frame 30
end if
--如果...就...否则...
if y
  put "y小于5"
else
  put "y不小于5"
end if
--多层「如果...就...否则...」
if z = 1 then
  put "z为1"
else if z = 2 then
  put "z为2"
else if z = 3 then
  put "z为3"
else
  put "其它的情况"
end if
Ø         使用case。以下程序代码为判断按下的按键为何:
case (the key) of
  "A":
    put "使用者按了A"
  "B", "C":
    put "使用者按了B或C "
  otherwise:
    put "其它的情况"
end case
¨           循环
Ø         使用repeat
--以下程序代码会在message里窗中显示5 6 7 8 9 10的数字
repeat with i = 5 to 10
  put i
end repeat
--以下程序代码会在message里窗中显示10 9 8 7 6 5的数字
repeat with j = 10 down to 5
  put j
end repeat

l        [b]常用的事件及其handler[/b]
¨           behavior
Ø         beginSprite
l  用法:on beginSprite me
l  说明:当一开始进入该sprite时会产生此事件,每次进入只会执行一次。
Ø         endSprite
l  用法:on endSprite me
l  说明:当离开该sprite时会产生此事件。
Ø         prepareFrame
l  用法:on prepareFrame me
l  说明:当在准备每个frame时会产生此事件。
Ø         enterFrame
l  用法:on enterFrame me
l  说明:当在进入每个frame时会产生此事件。
Ø         exitFrame
l  用法:on exitFrame me
l  说明:当在离开每个frame时会产生此事件。
Ø         mouseDown
l  用法:on mouseDown me
l  说明:当在sprite范围内按下鼠标左键时会产生此事件。
Ø         mouseUp
l  用法:on mouseUp me
l  说明:当在sprite范围内放开鼠标左键时会产生此事件。
Ø         mouseUpOutside
l  用法:on mouseUpOutside me
l  说明:当在sprite范围内按下鼠标左键,然后在sprite范围外放开鼠标左键时会产生此事件。
Ø         mouseEnter
l  用法:on mouseEnter me
l  说明:当鼠标进入sprite范围时会产生此事件。
Ø         mouseLeave
l  用法:on mouseLeave me
l  说明:当鼠标离开sprite范围时会产生此事件。
Ø         keyDown
l  用法:on keyDown me
l  说明:当按下键盘时会产生此事件。(若用在sprite上,则必须为可编辑的文字,才会接收此事件)
Ø         keyUp
l  用法:on keyUp me
l  说明:当放开键盘时会产生此事件。(若用在sprite上,则必须为可编辑的文字,才会接收此事件)
¨           movie script
Ø         prepareMovie
l  用法:on prepareMovie
l  说明:当开始播放而在准备movie时会产生此事件。
Ø         startMovie
l  用法:on startMovie
l  说明:当开始播放movie时会产生此事件。
Ø         stopMovie
l  用法:on stopMovie
l  说明:当结束播放movie时会产生此事件。

l        [b]程序撰写小技巧[/b]
¨           善用Message窗口
Ø         打开Message窗口:Window>Message
Ø         用put指令将变量或算式内容显示在Message窗口中。
Ø         在Message窗口上半部,可输入指令作实时的测试(一次只能执行单行的叙述)。
¨           批注
Ø         即使是自己写的程序,一段时间后也会忘记原始在写程序时的架构,所以为你的程序写批注是一定要的。
¨           变量名称
Ø         命名时要取有意义的,让程序更容易阅读,如userId、gameLevel等,而非abc、xxx等。
¨           一小段一小段去写
Ø         不要一次写了一堆程序代码再作测试。而要一小部分写完→测试,没问题了再继续写下去。

TOP

[推荐]Lingo教程

感谢贾铭志,顶!

TOP

发新话题