原著:Lingoworkshop
翻译:alphachi
现在,将此影片剧本的scriptType改成#parent/#behavior,并对scriptText作如下更改:
on HandlerName scriptObj
put “I am a script with limited scope”
end
此时在消息窗口中再次键入“HandlerName”,将会看到:
HandlerName
-- #HandlerName <Void>
影片剧本已经不存在了,消息怎么会还能够被响应呢?这是因为任何在消息窗口中创建的变量均被认为是全局变量,所以早些时候用“scriptObject = script(“aScriptName”)”创建的对影片剧本的引用依然能够正常工作。此对象是从影片剧本中创建的,Director用它来响应消息窗口中发出的“HandlerName”消息。
在消息窗口中键入:
scriptObject = VOID
HandlerName
这次将会得到“handler not defindeed error”的提示,因为已经没有影片剧本对象可以响应“HandlerName”消息了。尽管还存在一个剧本演员,它的scriptText中也定义有“HandlerName”处理程序,但此剧本演员不是影片剧本,因此Director不能自动从中创建剧本对象。虽然我们已经从父代剧本/行为中创建了一个剧本对象,但由于没有直接将消息发送给对象本身,导致它依然无法响应“HandlerName”消息。要想获取父代剧本或行为中创建的剧本对象,应该指明具体的目标:
scriptObject = script(“aScriptName”)
scriptObject.HandlerName()
-- #HandlerName (script ”aScriptName”)
综上所述,从影片剧本和父代剧本/行为中创建的剧本对象之间的区别在于:
(1)Director只会从影片剧本中自动创建剧本对象。
(2)Director可以自动将“无目标”消息发送给从影片剧本中创建的剧本对象,而不会发送给从其他scriptType中创建的剧本对象。
那么,剧本对象和剧本实例(子对象)之间又有什么区别呢?
我们经常需要让剧本对象的许多“版本”之间有一些微小的差别,例如剧本对象的一个版本正在和角色1协同工作,用以改变它的属性(比如与此角色相关联的演员),而剧本对象的另外一个版本正在和角色2协同工作。
剧本实例可以使用“new”命令创建,每个新的实例都是一个全新的对象,能够拥有独立的属性设置,并可以从“ancestor”对象中得到不同的继承。
下面的例子说明了剧本对象和剧本实例之间的差别:
scriptObject = script(“aScriptName”)
InstanceObject = script(“aScriptName”).new()
每一个新的实例对象都是从剧本演员中创建的,新的实例对象完全独立于原来的剧本对象和原始的剧本演员。
影片剧本、父代剧本与行为(下)
发布: 2007-1-25 13:59 | 作者: Lingoworkshop | 来源: 译自Lingoworkshop.com | 查看: 93次
