Flash AS3: ArgumentError: Ошибка № 2025: предоставленный объект DisplayObject должен быть дочерним по отношению к вызывающей стороне - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь создать презентацию в стиле слайд-шоу, где каждый слайд / страница представляет собой видеоклип, и они переходят с помощью скользящей анимации. У меня проблема в том, что я не хочу, чтобы все видеоклипы на сцене сразу предотвращали проблемы с запаздыванием, пример того, чего я пытаюсь достичь:

  • Текущая страница - страница A, нажата следующая кнопка
  • Страница B помещается на сцену с помощью addChild (но находится вне поля зрения)
  • Страница А соскальзывает с видимой сцены
  • Страница B скользит в видимую сцену
  • Страница A удалена со сцены с помощью removeChild - вот где у меня проблемы.
//greensock stuff
import com.greensock.*;
import com.greensock.easing.*;

//buttons that navigate to next and previous slides
prevBtn.addEventListener(MouseEvent.CLICK,prevClicked,false,0,true);
nextBtn.addEventListener(MouseEvent.CLICK,nextClicked,false,0,true);

//setting up array of all the pages
var pageArray:Array = [page1, page2, page3, page4, page5];
var currentArray:Number = 0;

//defining the first page and placing it on the stage
var currentPage:MovieClip = new pageArray[currentArray];
addChild(currentPage);



function nextClicked(event:MouseEvent):void{
    //check to ensure it is not the last page
    if (currentArray < pageArray.length - 1){
            //define the current slide as oldPage
            var oldPage:MovieClip = new pageArray[currentArray];
            currentArray++;
            //define the next slide as currentPage and place on stage
            var currentPage:MovieClip = new pageArray[currentArray];
            addChild(currentPage);
            currentPage.x = 1024;
            TweenMax.to(currentPage, 1, {x:0});
            TweenMax.to(oldPage, 1, {x:-1024,onComplete:removeChild,onCompleteParams:[oldPage]});
    }
}



function prevClicked(event:MouseEvent):void{
    //check to ensure it is not the first page
    if (currentArray > 0){
            //define the current slide as oldPage
            var oldPage:MovieClip = new pageArray[currentArray];
            currentArray--;
            //define the next slide as currentPage and place on stage
            var currentPage:MovieClip = new pageArray[currentArray];
            addChild(currentPage);
            currentPage.x = -1024;
            TweenMax.to(currentPage, 1, {x:0});
            TweenMax.to(oldPage, 1, {x:1024,onComplete:removeChild,onCompleteParams:[oldPage]});    }
}

Ответы [ 2 ]

1 голос
/ 27 января 2012

Вероятно, ваш "oldPage" еще не добавлен в stage / movieClip в какой-то момент, как в самом начале.

Так что вместо:

TweenMax.to(oldPage, 1, {x:-1024,onComplete:removeChild,onCompleteParams:[oldPage]});

Подумайте, прежде чем проверять, существует ли ребенок, прежде чем убрать его. Это потребует вызова новой функции, например:

(непроверенный код)

TweenMax.to(oldPage, 1, {x:-1024,onComplete:tryRemoveChild,onCompleteParams:[oldPage]});

function tryRemoveChild(page:MovieClip):void {
   if(contains(page)){ //Check if child is still there
       removeChild(page); //It is, so remove
   } //Otherwise there is no child to currently remove
}
0 голосов
/ 27 января 2012

Когда вы создаете экземпляр oldPage, вы создаете новый экземпляр этого класса (или, по крайней мере, так он выглядит для меня). Эта страница не та, что на сцене.

В вашем конструкторе установите переменную currentPage равной переменной экземпляра страницы, которая находится на сцене (как бы вы ее ни называли в свойствах объекта). Затем в следующем клике сохраните currentPage в oldPage, прежде чем сбросить его на новую добавленную страницу.

FWIW, соглашение состоит в том, что имена классов всегда пишутся с большой буквы. Если бы вы сделали это, было бы легче узнать наверняка, что page1, page2 и т. Д. Являются классами, которые вы создаете.

Также обратите внимание, что вы, вероятно, не много экономите, не имея экземпляров на сцене при запуске, потому что они скомпилированы в фильм до Кадра 1. Даже если вы сняли отметку с кнопки «Вставить в Кадр 1», ссылаясь на них в вашем файле Class, который скомпилирован в Кадр 1, вы заставляете их компилировать в Кадр 1.

======================================= отредактировано, чтобы ответить на вопрос об установке переменной в экземпляр

Если щелкнуть объект на сцене в файле fla, посмотрите на имя экземпляра на панели свойств. Это название вашего экземпляра на сцене. Если у него нет имени, дайте его. Если у вас включено «объявление экземпляров сцены», все готово. Если нет, вам нужно добавить объявление переменной вверху файла, чтобы сделать это имя экземпляра доступным в качестве переменной.

Теперь, в классе документа для вашего FLA-файла (который, как я полагаю, является тем кодом, который вы вставили выше):

public function YourDocumentClassName() {
    super();
    currentPage = theNameofThatInstance;
}

nextClicked изменится и будет выглядеть так:

function nextClicked(event:MouseEvent):void{
     //check to ensure it is not the last page
     if (currentArray < pageArray.length - 1){
             //define the current slide as oldPage
             var oldPage:MovieClip = currentPage;
             currentArray++;//may also want to consider checking for past the end of the array and starting at the beginning
             //define the next slide as currentPage and place on stage
             var currentPage:MovieClip = new pageArray[currentArray];
             addChild(currentPage);
             currentPage.x = 1024;
             TweenMax.to(currentPage, 1, {x:0});
             TweenMax.to(oldPage, 1, {x:-1024,onComplete:removeChild,onCompleteParams:[oldPage]});
     }
 }

Полагаю, если ваша графика большая или она движется, вы можете столкнуться с проблемами производительности, когда на сцене их больше, но я предположил, что вы пытались обойти проблемы с загрузкой.

...