2

I inherited a project consisting of a flash movie with graphic components and an .as file with the code. i want to alter the appearance of various graphic elements.

example:

if (skin="client1") -> all buttons have to be blue, if (skin="client2") -> all buttons have to be yellow - and so on.

I am stuck with a button:

  1. 我尝试在按钮内嵌套了具有不同颜色(frame1=blue, frame5=yellow)的电影,但我无法goToAndStop从 .as 文件中找到该电影的方法。

  2. 我试图从该电影 ( if skin="client1" goto frame "blue") 中检查一个变量,但我似乎无法访问在 .as 文件中定义的其他变量。

4

3 回答 3

1

您可以创建两个类来管理主题:

第一个管理主题名称

package 
{   
    public class Styles
    {
        public static const DARK:String = "dark";
        public static const LIGHT:String = "light";
        public static var currentStyleName:String = "dark";

        public static function setStyles(styleName:String):void
        {
            currentStyleName = styleName;
        }
    }
}

第二个管理资产

package
{
    import flash.events.EventDispatcher;    
    import flash.display.*;
    import flash.utils.getDefinitionByName;
    import Styles;

    public class Assets extends EventDispatcher
    {

        public static function setStyles(styleName:String):void
        {
            currentStyleName = styleName;
        }

        public static function getClass(name:String):Class
        {
            var TheClass:Class = getDefinitionByName(name) as Class;

            return TheClass;
        }

        public static function sprite(name:String):Sprite
        {
            return new (getClass(name)) as Sprite;
        }

        public static function simpleButton(name:String):SimpleButton
        {
            return new (getClass(name)) as SimpleButton;
        }

        public static function styledName(name:String):String
        {
            return name + Styles.currentStyleName.replace(/^\w/, function(firstChar) {
                return firstChar.toUpperCase();
            });
        }

    }
}

在您的 Flash 库中,您需要为每个符号设置链接名称,如下所示:

myButtonDark
myButtonLight
mySpriteDark
mySpriteLight

现在您必须设置当前样式名称

Styles.setStyles(Styles.LIGHT);

最后,您可以创建所需的实例

// All the instances created here belong to the Light theme
addChild( Assets.simpleButton(Assets.styledName("myButton")) );
addChild( Assets.sprite(Assets.styledName("mySprite")) );

// Changes the theme to dark
Styles.setStyles(Styles.DARK);

// All the instances created here belong to the Dark theme
addChild( Assets.simpleButton(Assets.styledName("myButton")) );
addChild( Assets.sprite(Assets.styledName("mySprite")) );

我希望它对你有用:)

于 2012-09-13T15:06:06.987 回答
1

AS3 完全面向对象。

如果这些变量是私有的或受保护的,您将无法访问它们。

于 2012-09-13T13:54:35.367 回答
0

由于该项目是您的,您可以为按钮提供一种附加方法来接受特定更改,例如,如果您的嵌套影片剪辑有多个带有标签的帧,并且您将它们排列为“蓝色”、“绿色”等颜色, 'black' 等等,你可以创建一组 String 类型的皮肤常量,就像 Alexander Ruiz 建议的那样,它也可以作为你的 MC 切换显示帧的标签。因此,您在按钮类中创建了一个函数,即使它是私有的,它也可以访问您的嵌套影片剪辑,如下所示:

public function AcceptSkin(skin:String):void {
    try {
        nestedMC.gotoAndStop(skin);
    }
    catch(e:Error) {
        trace('Error applying style',skin,e.toString());
    }
}

你可以用这种方法做更多的事情。现在,当您希望所有按钮都变为黄色,并且您的 MC 中有一个带有“黄色”标签的框架(据说该按钮包含黄色外观)时,您可以调用theButton.AcceptSkin('yellow');每个按钮。但是,如果您使用 SimpleButton 类作为按钮的基类,我建议您为按钮创建自己的类,因为 SimpleButton 类没有简单的方法来接收其内容。

于 2012-09-13T15:23:06.120 回答