【问题标题】:AS3: newbie, problem with addChildAS3:新手,addChild 有问题
【发布时间】:2011-02-15 18:21:57
【问题描述】:

大家好。

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

我正在使用它来将签名捕获到另一个帧:

  1. 触发捕获事件的Button:

    //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);
    }
    

它完美地复制了签名。

问题出在目标 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) 也会改变颜色...我做错了什么?

提前致谢。

【问题讨论】:

    标签: flash actionscript-3 reference colortransform


    【解决方案1】:
    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 函数应该可以正常工作。一定有其他问题。我不能完全确定,但我猜你的问题要么与你所有的 target(_mc) 对象的混合有关:

      • 函数“捕获”的参数“目标”
      • 函数“capture”的参数“_target”
      • 成员变量“_targetMC”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2011-06-07
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多