![](/img/trans.png)
[英]Is it possible to debug flash cs4 project inside flash builder?
[英]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之类的东西)可以很好地清理对象,声音等
哇哇,我们沉入了终点线。
好吧,这样的事情呢
可能?。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.