| 网站镜像:电信 网通 | 加入收藏 | 设为首页

Director 编写自己的行为(续)

  • Director 编写自己的行为(续)
       在《编写自己的行为》一文中,我们已经从理论上对行为的结构有所了解,现在我们通过一个"多态按钮行为"的编写来从实践角度加深对行为的认识。

    一、何谓"多态按钮"

       在各种多媒体产品的图形用户界面中,多态按钮都拥有非常广泛的应用。所谓的"多态",即对于鼠标的不同操作可以有不同的响应方式,这些方式表现为按钮或鼠标形态的改变,同时发出提示声音或给出提示画面,并且执行相应的操作。总之,一个完整的多态按钮能够响应用户的不同操作并完成各种指定的任务。

    Windows的"开始"按钮便是一个简单的多态按钮

    二、多态按钮的功能

       一个多态按钮的主要功能包括:
       * 鼠标进入后按钮本身呈掠过状态。
       * 鼠标点击时按钮本身呈按下状态。
       * 按钮被成功点击后执行相应的命令。
       * 当鼠标位于按钮内部时改变光标形态,离开按钮时恢复光标形态。
       * 在整个过程中会有操作提示音(或提示画面)。

    一个典型的多态按钮

    三、多态按钮行为的编写

       新建一个剧本演员,命名为"Multistate Button Behavior",不要忘记将其属性更改为"Behavior"。

       首先,我们需要声明即将使用的属性变量。

    property pNormalMember -- 用来存储按钮的正常状态。
    property pUseRolloverSound, pRolloverSound -- 掠过按钮时是否发出声音,使用的声音演员。
    property pUseRolloverMember, pRolloverMember -- 掠过按钮时是否改变演员,改变后的演员。
    property pUseDownSound, pDownSound -- 按下按钮时是否发出声音,使用的声音演员。
    property pUseDownMember, pDownMember -- 按下按钮时是否改变演员,改变后的演员。
    property pCustomGuide -- 成功点击按钮后所执行的自定义导航命令。
    property pUseChangeCursor -- 是否根据鼠标与按钮的不同位置改变鼠标的形态。
    property pChangeCursor -- 改变后的鼠标形态。

       下面的getPropertyDescriptionList函数看起来好像非常复杂,其实无非是给需要使用的属性变量构建参数对话框,每一项参数都拥有#comment、#format和#default这三个必需的部分。

    on getPropertyDescriptionList me
       myList = [:]
    addProp myList, # pUseRolloverSound, [ # comment: "Use Rollover Sound" , # format: # boolean, # default: TRUE ]
    addProp myList, # pRolloverSound, [ # comment: "Rollover Sound" , # format: #sound , # default: "" ]
    addProp myList, # pUseRolloverMember, [ # comment: "Use Rollover Member" , # format: # boolean, # default: TRUE ]
    addProp myList, # pRolloverMember, [ # comment: "Rollover Member" , # format: # bitmap, # default: "" ]
    addProp myList, # pUseDownSound, [ # comment: "Use Down Sound" , # format: # boolean, # default: TRUE ]
    addProp myList, # pDownSound, [ # comment: "Down Sound" , # format: #sound , # default: "" ]
    addProp myList, # pUseDownMember, [ # comment: "Use Down Member" , # format: # boolean, # default: TRUE ]
    addProp myList, # pDownMember, [ # comment: "Down Member" , # format: # bitmap, # default: "" ]
    addProp myList, # pCustomGuide, [ # comment: "Custom Lingo" , # format: #string , # default: "" ]
    addProp myList, # pUseChangeCursor, [ # comment: "Use Change Cursor" , # format: # boolean, # default: TRUE ]
    addProp myList, # pChangeCursor, [ # comment: "Change Cursor" , # format: #cursor , # default: "" ]
    return myList
    end

       这里需要注意一下#format和#default的取值。

    # format的取值多种多样,但主要可以分为两类:
    1 . 数据类:包括#integer、#float、#string、#symbol和#boolean等。
    2 . 非数据类:包括#member(也可以具体写出#member的类型,例如#bitmap即表示位图演员)、#frame、#marker和#ink等。

       而#default的取值则可以是数字、布尔值(TRUE或FALSE,仅当#format为#boolean时)或字符串。一般情况下,#default的取值是依赖于#format的,但要求也不是很严格,毕竟#default只是为属性列表的每个属性提供一个缺省值,最终的使用值还是需要我们自己在参数对话框中指定。

       其实#default还可以指定为VOID,以表示没有合适的缺省值,但并不推荐使用,原因在于:
    1 . 数字、布尔值和字符串已经几乎可以囊括#default所有的取值情况,并不需要再增添一个VOID。
    2 . 如果getPropertyDescriptionList函数返回的属性列表中有任何一个属性的缺省值被指定为VOID,则在使用runPropertyDialog函数时系统会报错。

       下面我们添加runPropertyDialog函数。其实在这里并没有什么使用runPropertyDialog函数的必要,仅仅是为了熟悉它。

    on runPropertyDialog me , myList
    setProp myList, # pCustomGuide, "go to frame 5"
    pass
    return myList
    end

       接着是isOKToAttach命令、getBehaviorDescription函数和getBehaviorTooltip函数。

    on isOKToAttach me , spriteType
    if spriteType = #script then
    return FALSE
    else
    return TRUE
    end if
    end
    -- isOKToAttach函数使行为可以在帧剧本通道外的任何地方使用。

    on getBehaviorDescription me
    return "MULTISTATE BUTTON" & RETURN & "This is a custom behavior." -- 利用RETURN(相当于回车换行)将两个字符串联系起来,增加了可读性,而且通过RETRUN的协助,使得添加更为复杂的描述信息成为可能。
    end

    on getBehaviorTooltip me
    return "Multistate Button" -- 注意这里的字符最好不要太多,以免影响"Tooltip"的可读性。
    end

    完成后的参数对话框

       现在我们开始编写行为的主体代码。这里涉及到了几乎所有的鼠标事件,注意区别它们发生的条件和作用。

    on beginSprite me
       pNormalMember = sprite ( me . spriteNum ). member -- 在按钮角色首次出现在舞台上时将其对应的正常状态下的演员存储到属性变量pNormalMember中。
    end

    on mouseEnter me
    if pUseRolloverSound then
    sound ( 1 ). play ( member (pRolloverSound)) -- 如果在参数对话框里选择了"使用掠过声音",则播放选定的声音。
    end if
    if pUseRolloverMember then
    sprite ( me . spriteNum ). member = pRolloverMember -- 如果在参数对话框里选择了"使用掠过演员",则将当前按钮角色使用的演员更换为选定的演员。
    end if
    if pUseChangeCursor then
    cursor (pChangeCursor) -- 如果在参数对话框里选择了"改变鼠标",则将当前鼠标形态改变为选定的鼠标形态。
    end if
    end

    on mouseLeave me
    sprite ( me . spriteNum ). member = pNormalMember -- 恢复按钮角色对应的演员为正常状态下的演员。
    cursor ( 0 ) -- 鼠标复位。
    end

    on mouseDown me
    if pUseDownSound then
    sound ( 1 ). play ( member (pDownSound)) -- 如果在参数对话框里选择了"使用按下声音",则播放选定的声音。
    end if
    if pUseDownMember then
    sprite ( me . spriteNum ). member = pDownMember -- 如果在参数对话框里选择了"使用按下演员",则将当前按钮角色使用的演员更换为选定的演员。
    end if
    end

    on mouseUp me
    sprite ( me . spriteNum ). member = pRolloverMember -- 鼠标仍位于按钮之上,所以应该将按钮角色对应的演员更换为"掠过演员"而不是"正常演员"。
    cursor ( 0 )
    do pCustomGuide -- 执行自定义的导航命令,例如我们在runPropertyDialog函数中指定的"go to frame 5"。
    end

       到此为止,一个完整的多态按钮行为就写好了。只要将其指定给需要的演员并调整好相应的参数就可以正常工作了。如果在编写过程中遇到了什么困难,可以参考附件里的样本影片。

    相关附件