繁体   English   中英

如何在Flash CS4中管理带有链接类的库符号以在Flash Builder 4中进行编译/调试?

[英]How do I manage library symbols with linked classes in Flash CS4 to compile/debug in Flash Builder 4?

我正在使用Flash CS4(以下称为“ Flash”)构建视频播放器,以创建图形符号并使用Flash Builder 4(“ FB4”)进行编译和调试。 以下是我当前工作流程中采取的步骤:

-在Flash中创建图形符号。 我为播放器创建了一些不同的符号,但这里我仅关注播放/暂停按钮(“ ppbutton”)。

-在“库”面板中,我转到ppbutton符号的“链接”属性,并链接到扩展了MovieClip的名为asset.PlayPauseButtonAsset的类。 我实际上没有资产包,也没有PlayPauseButtonAsset的类文件,因为Flash在发布时会为我创建它们。

-在Flash的“发布”设置中,我将项目设置为导出将在FB4中使用的SWC,称为VideoPlayerAssets.swc。

-创建SWC之后,我创建了一个名为“ VideoPlayer”的FB4项目,并将SWC添加到了我的路径中。 FB4在默认程序包中自动创建VideoPlayer类。

-在VideoPlayer.as中,我导入资产。*,它导入我在Flash中创建的所有符号类,并可以通过VideoPlayerAssets.swc使用。 我现在可以实例化ppbutton并将其添加到舞台,如下所示:

var ppbutton:PlayPauseButtonAsset = new PlayPauseButtonAsset();
addChild(ppbutton);

此时ppbutton没有任何功能,因为我没有为其创建任何代码。 因此,我创建了一个名为video.controls.PlayPauseButtonLogic的新类,该类扩展了asset.PlayPauseButtonAsset。 我添加了一些逻辑,现在我可以使用该新类在舞台上放置一个有效的ppbutton:

var ppbutton:PlayPauseButtonLogic = new PlayPauseButtonLogic();
addChild(ppbutton);

这很好用,但是您可能会问为什么我不首先将Flash中的ppbutton符号链接到video.controls.PlayPauseButtonLogic类。 原因是我有一个设计师在Flash中创建UI,并且我不想每次更改逻辑时都必须从Flash重新发布SWC。 基本上,我希望设计人员能够在Flash中制作一个符号,将该符号链接到Linkage属性中的逻辑命名类,并导出SWC。 除非设计人员对符号或布局进行更改,否则我不必再次触摸该.fla文件。 我也为该项目使用了版本控制系统,这样可以确保只有设计人员才能接触.fla文件,这样比较干净。

所以,最后,这是我遇到的问题:

-随着设计变得越来越复杂,设计人员正在嵌套符号以将视频控件放置在控件栏上。 他创建了一个控制栏符号,并将其链接到asset.ControlBarAsset。 控件栏符号包含ppbutton符号。

-设计人员发布了SWC,ControlBarAsset现在在FB4中可用。 我创建了一个名为video.controls.ControlBarLogic的新类,该类扩展了asset.ControlBarAsset,以便可以向控制栏添加一些逻辑,并将控制栏添加至舞台:

var controlbar:ControlBarLogic = new ControlBarLogic();
addChild(controlbar);

-可以,但是ppbutton没做任何事情。 这是因为ppbutton虽然位于控件栏中,但仍仅链接到PlayPauseButtonAsset,而后者没有任何逻辑。 我不再实例化ppbutton对象,因为它是控件栏的一部分。

那就是我今天被困的地方。 当出现类型错误时,我似乎无法简单地将Controlbar的ppbutton重铸为PlayPauseButtonLogic。 而且我不需要创建必须实例化每个视频播放器控件的类,而是根据设计者的放置方式将它们放置在舞台上的x和y值上,因为这需要我打开.fla并检查符号的各种属性,然后将这些值添加到代码中。 如果设计人员进行了更改,则每次都必须进入代码,以便每次都更新这些属性。 不好。

如何重新铸造嵌套符号以使用我创建的扩展资产类的逻辑类? 请记住,解决方案不是将Flash符号链接到实际的类,因此我不必一直重新编译SWC,除非有一种方法可以不必重新编译SWC。 我希望设计师做他的事情,发布SWC并完成它。 然后,我可以使用他的SWC,将我的逻辑应用于他的资产,并且能够调试和编译最终的SWF。

这是我有时使用的解决方案:

与其使PlayPauseButtonLogic扩展PlayPauseButtonAsset ,不如将此类用作PalyPauseButtonAsset的扭曲器,而应使用合成而不是继承! ; )。

您将在ControlBarLogic类中获得以下内容:

//constructor exemple
public function ControlBarLogic(){
     //all logic of PPButton is inside PlayPauseButtonLogic
     //you just pass a reference to the PlayPauseButtonAsset button contained inside ControlBarAsset
     var ppButtonLogic: PlayPauseButtonLogic=new PlayPauseButtonLogic(refToButtonAsset)
     //the warper class can extends EventDispatcher so you will be able to listen to custom or redisatched events
     ppButtonLogic.addEventListener("ppPause",onPause)
}

希望对你有帮助

您可以有两个类,一个类拥有功能,另一类提供其图形实现(资产/外观)

让PlayPauseButtonLogic扩展AssetWrapper。

解决事件监听器问题的一种简单方法是,可以执行以下操作:

package {

    import flash.display.DisplayObjectContainer;
    import flash.events.Event;
    import flash.events.IEventDispatcher;

    public class AssetWrapper implements IEventDispatcher {
        private var _skin:DisplayObjectContainer;

        public function AssetWrapper( skin:DisplayObjectContainer = null ) {
            if ( skin ) setSkin(skin);
        }

        public function setSkin(skin:DisplayObjectContainer):void{
            _skin = skin;           
        }


        public function dispatchEvent(event:Event):Boolean{
            _skin.dispatchEvent(event);
        }

        public function hasEventListener(type:String):Boolean{
            return _skin.hasEventListener(type);
        }

        public function willTrigger(type:String):Boolean{
            return _skin.willTrigger(type);
        }

        public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{
            _skin.removeEventListener(type, listener, useCapture);
        }

        public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
            _skin.addEventListener(type, listener, useCapture, priority, useWeakReference);
        }


    }
}

编辑:然后,您当然可以根据需要向AssetWrapper添加尽可能多的属性/方法,以委托给DisplayObject(皮肤)。 它还使您可以更好地控制这些属性/方法。 即:

public function get x( ):Number {
    return _skin.x;
}

public function set x( v:Number ):void {
    if ( _skin.x = v ) return;
    if ( _useWholePixels ) _skin.x = Math.round(v);
    else _skin.x = v;
}

这样,例如,您可以直接补间AssetWrapper实例。 另外,您可以控制是否希望将其放在整数(x = 100)中(x = 100.5)

对于方法,只有相同的想法:

public function addChild( child:DisplayObject ):DisplayObject {
    return _skin.addChild( child );
}

然后使用它,您可以扩展AssetWrapper并实现一个具体的行为:

package {
    import flash.display.DisplayObjectContainer;
    import flash.events.MouseEvent;


    public class SimpleButton extends AssetWrapper {


        public function SimpleButton( skin:DisplayObjectContainer = null ) {
            super(skin)
        }

        override public function setSkin( skin:DisplayObjectContainer):void {
            super.setSkin( skin );      
            addEventListener(MouseEvent.ROLL_OVER, _onRollOver );
            addEventListener(MouseEvent.ROLL_OUT, _onRollOut );         
        }

        protected function _onRollOver(e:MouseEvent):void {
            _skin.alpha = .5;
        }
        ...
}

您将按以下方式使用它:

//you can get your graphical assets in many different ways
var buttonSkin:Sprite = new LibraryButtonSkin
//or
var ButtonSkinClass:Class = this.loaderInfo.applicationDomain.getDefinition("SimpleButtonSkin") as Class;
buttonSkin = new ButtonSkinClass;

var button:SimpleButton = new SimpleButton(buttonSkin);
button.addEventListener(MouseEvent.CLICK, _handleButton);

这只是一个指南,在实际的实现中,您需要确保检查诸如皮肤是否已存在之类的事情,然后删除所有添加的侦听器。 您可能可以侦听ADDED_TO_STAGE事件并触发初始化方法...在实例执行后,通过实现destroy()方法(确保已删除所有添加的侦听器并清除null / stop之类的东西)可以很好地清理对象,声音等

哇哇,我们沉入了终点线。

好吧,这样的事情呢

  1. AbstractButtonBehavior
  2. PlayButtonBehavior扩展...
  3. 技巧是,图形组件都应实现某种接口,以允许它们在实例化时甚至更好地在运行时传递行为。 您只需插入登录名,逻辑将始终保留在外部,不良资产将继续询问或回答同一接口调用,从而使您可以在外部进行操作。

可能?。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM