AS3: новичок, проблема с addChild - PullRequest
0 голосов
/ 15 февраля 2011

Приветствую всех.

Я очень плохо знаком с 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);
    }
    

Отлично копирует подпись.

Проблема в цели 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 голосов
/ 15 февраля 2011
  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 - все спрайты, мувиклипы и загрузчики являются подклассами 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) объектов:

    • параметр "target" функции "capture"
    • параметр "_target" функции "capture"
    • переменная-член "_targetMC"

    Или это может быть связано с добавлением нового загрузчика с именем «signature» в тот же _targetMC каждый раз, когда вы вызываете capture(), но никогда не удаляете старый: после второго щелчка будет более одного клипа с имя «подпись», и это может привести к проблемам.

...