AS3:新手,addChild的问题

时间:2011-02-15 18:21:57

标签: flash actionscript-3 reference colortransform

向所有人致以问候。

我是AS3(和Flash CS4)的新手,我遇到了问题。我有这个项目,用户在一个区域上用鼠标动态绘制她的签名,然后在另一个框架上绘制签名后,他可以通过单击一些按钮来更改签名的颜色,每个按钮都有不同的颜色。

我正在使用此功能将签名捕获到另一帧:

  1. 触发捕获事件的按钮:

    //targetMC is an MC to where the signature will be copied
    
    function buttonClick(event:MouseEvent):void{
        capture(drawingBoard_mc, _targetMC);
        drawGraphics.clear();
        gotoAndStop(5);
    };
    
  2. 功能

    function capture(target:DisplayObject, _target:MovieClip):void {
        var relative:DisplayObject = target.parent;
        var rect:Rectangle = target.getBounds(relative);
        var bitmapData:BitmapData = new BitmapData(rect.width + PIXEL_BUFFER * 2, rect.height + PIXEL_BUFFER * 2);
        bitmapData.draw(relative, new Matrix(1, 0, 0, 1, -rect.x + PIXEL_BUFFER, -rect.y + PIXEL_BUFFER));
    
        var byteArray:ByteArray;
        var jpgEncoder:JPGEncoder = new JPGEncoder(JPG_QUALITY_DEFAULT);
        byteArray = jpgEncoder.encode(bitmapData);
        var ldr:Loader = new Loader();
        ldr.name = "signature";
        ldr.loadBytes(byteArray);
        //target is target mc where the signature will be copied into
        _target.addChild(ldr as DisplayObject);
    }
    
  3. 完美复制签名。

    问题出现在目标5上,我有2个按钮来改变颜色:

    //Color 1
    line_bt1.buttonMode = true;
    line_bt1.mouseChildren = false;
    line_bt1.addEventListener(MouseEvent.MOUSE_DOWN, line_bt1Over);
    
    //Color 2
    line_bt2.buttonMode = true;
    line_bt2.mouseChildren = false;
    line_bt2.addEventListener(MouseEvent.MOUSE_DOWN, line_bt2Over);
    
    function line_bt1Over(e:Event){
        var myMC:DisplayObject = DisplayObject(_targetMC.getChildByName("signature") as DisplayObject);
        changeColor(myMC, 0xCCCCCC);
        changeColor(myMC, 0xCCCCCC);
    }
    
    function line_bt2Over(e:Event){
        var myMC:DisplayObject = DisplayObject(_targetMC.getChildByName("signature") as DisplayObject);
        changeColor(myMC, 0x000000);
        changeColor(myMC, 0x000000);
    }
    
    function changeColor(object:DisplayObject, color:Number){
         var colorchange:ColorTransform = new ColorTransform();
         colorchange.color = color;
         object.transform.colorTransform = colorchange;
    }
    

    我的问题是_targetMC和签名子都改变颜色,我只想要孩子/签名。 :(

    我正在使用var myMC:DisplayObject = DisplayObject(_targetMC.getChildByName("signature") as DisplayObject);来访问签名子项,但容器mc(_targetMC)也会改变颜色......我做错了什么?

    提前致谢。

1 个答案:

答案 0 :(得分:0)

  1. 每次拨打changeColor就足够了。

  2. 您可以重复使用对象自己的colorTransform

    function changeColor(object:DisplayObject, color:Number){
        var colorchange:ColorTransform = object.transform.colorTransform;
        colorchange.color = color;
        object.transform.colorTransform = colorchange;
    }
    
  3. 您可以省略所有类型转换为DisplayObject - 所有Sprite,MovieClip和Loaders都是DisplayObject的子类,因此无论何处需要DisplayObject,它们都可以正常工作:

    var myMC:DisplayObject = _targetMC.getChildByName("signature"); 
    // getChildByName always returns a DisplayObject
    

    var ldr:Loader = new Loader();
    ldr.name = "signature";
    ldr.loadBytes(byteArray);
    _target.addChild(ldr); // Loader extends DisplayObject
    
  4. 您的colorChange功能应按预期工作。一定有别的错误。我不能完全确定,但我猜你的问题要么与你所有目标(_mc)对象的混合有关:

    • 函数“capture”的参数“target”
    • 函数“capture”的参数“_target”
    • 成员变量“_targetMC”

    或者,它可能与每次调用capture()时向同一_targetMC添加名为“signature”的新Loader有关,但从不删除旧的:在第二次单击后,将有多个剪辑的名称为“签名”,这可能会导致问题。