Принудительно перерисовывать экран, кроме использования removeChild (), а затем addChild (), чтобы обновить изображение?

Вот код, который я создал в качестве ответа на другой вопрос. Он извлекает элемент библиотеки из библиотеки и программно помещает его на сцену. Ничего страшного, за исключением того, что для того, чтобы изображение, отображаемое на экране, действительно обновлялось, мне пришлось удалитьChild (), а затем добавить его обратно. Есть еще способ заставить экран перерисовываться?

var currentImage:int = 1;
var MAX_IMAGES:int = 3;

MC_prevButton.addEventListener(MouseEvent.CLICK, goBack);
MC_nextButton.addEventListener(MouseEvent.CLICK, goForward);

var imageClip:MovieClip = new Image_1();
var thumbClip:MovieClip = new Thumb_1();

imageClip.x = thumbClip.x = stage.stageWidth/2;
imageClip.y = thumbClip.y = stage.stageHeight/2;



addChildAt(thumbClip, 0);
addChildAt(imageClip, 1);

setImages(currentImage);

function goBack(event:MouseEvent):void {
    if (currentImage) currentImage--;
    setImages(currentImage);
}

function goForward(event:MouseEvent):void {
    if (currentImage < MAX_IMAGES) currentImage++;
    setImages(currentImage);
}

function setImages(imageNumber){
    trace("Setting image number: " + imageNumber);

    var LibraryImage:Class = getDefinitionByName("Image_" + imageNumber) as Class;
    if (LibraryImage){
        removeChild(imageClip);
        imageClip = new LibraryImage();
        addChildAt(imageClip, 1);
    }
    var LibraryThumb:Class = getDefinitionByName("Thumb_" + imageNumber) as Class;
    if (LibraryThumb){
        removeChild(thumbClip);
        thumbClip = new LibraryThumb();
        addChildAt(thumbClip, 0);
    }

    imageClip.x = thumbClip.x = stage.stageWidth/2;
    imageClip.y = thumbClip.y = stage.stageHeight/2;
}

Обратите внимание, что в этом примере этот код находится в кадре 1 временной шкалы и что это 1-кадровый FLA-файл.


person Tom Auger    schedule 01.09.2011    source источник


Ответы (1)


Попробуйте вызвать updateAfterEvent () в конце ваших методов вперед и назад:

function goForward(event:MouseEvent):void {
    if (currentImage < MAX_IMAGES) currentImage++;
    setImages(currentImage);
    event.updateAfterEvent();
}
person kreek    schedule 01.09.2011
comment
Спасибо, что ответили, но нет, дело не в этом. updateAferEvent () используется для принудительной перерисовки экрана в цикле событий для вещей, которые должны быть обновлены до естественного обновления экрана при входе в кадр. В этом случае мы не находимся в цикле ввода кадра, и у нас достаточно времени, чтобы обновить экран после запуска setImage (). - person Tom Auger; 01.09.2011
comment
На самом деле, глядя на это снова, мы с вами неправильно понимаем проблему :) Когда вы вызываете addChildAt(imageClip, 1); в AS3, он добавляет изображение на уровне 1, но не удаляет изображение, как в AS2. Вместо этого новое изображение добавляется на уровне 2. Если ваши изображения одинакового размера, это будет выглядеть так, как будто ничего не происходит, поскольку верхнее (первое) изображение скрывает все остальное. Установите альфа-канал всех изображений на 0,5, чтобы увидеть, что они добавляются друг за другом. Если вы измените addChildAt на addChild, изображение будет добавлено поверх остальных. - person kreek; 01.09.2011
comment
Привет, спасибо, что придерживаешься этого! Ну, на самом деле, поскольку я сначала вызываю removeChild () в приведенном выше примере кода (который работает, это просто некрасиво), дочерний элемент удаляется перед добавлением обратно на сцену. В версии (которая не работает) нет addChild (), кроме того, что происходит при инициализации. Я добавляю дочерний элемент в начале, а затем просто сохраняю ссылку на него в переменной imageClip, которую я позже установил для нового элемента библиотеки с помощью функции setImages (). - person Tom Auger; 01.09.2011
comment
Не совсем. Вы удаляете экземпляр MovieClip. Затем вы создаете совершенно новый экземпляр MovieClip, который определен в библиотеке. Это не значит, что вы помещаете именно этот MovieClip из библиотеки на сцену. Класс - это план объекта, а не ссылка на объект. - person kreek; 01.09.2011