Question

J'essaie de créer une présentation de style diaporama, où chaque diapositive / page est un movielip et ils passent par une animation coulissante. Le problème que j'ai, c'est que je ne veux pas tous les motionslips sur scène à la fois pour éviter les problèmes de retard, un exemple de ce que j'essaie de réaliser:

  • La page actuelle est la page A, le bouton Suivant est cliqué
  • La page B est placée sur la scène en utilisant Addchild (mais placée hors de vue)
  • PAGE A Les diapositives de l'étape visible
  • La page B glisse dans le stade visible
  • La page A est supprimée de la scène à l'aide de Removechild - c'est là que j'ai des problèmes.
//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]});    }
}
Était-ce utile?

La solution

Il est probable que votre "oldpage" ne soit pas encore ajouté à la scène / movielip à un moment donné, comme juste à la mendicité.

Donc au lieu de:

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

Envisagez d'abord de vérifier si l'enfant existe toujours avant de le retirer. Cela nécessiterait d'appeler une nouvelle fonction, quelque chose comme:

(code non testé)

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
}

Autres conseils

Lorsque vous instanciez OldPage, vous créez une nouvelle instance de cette classe (ou du moins c'est à quoi cela ressemble). Cette page n'est pas la même qui est sur scène.

Dans votre constructeur, définissez la variable CurrentPage sur la variable d'instance de la page qui est sur la scène (peu importe comment vous l'avez appelée dans les propriétés de l'objet). Ensuite, dans votre prochain clické, stockez CurrentPage dans OldPage avant de le réinitialiser avec la nouvelle page qui est ajoutée.

FWIW, la convention est que les noms de classe sont toujours capitalisés. Si vous l'aviez fait, il serait plus facile de savoir avec certitude que Page1, Page2, etc. sont des classes que vous êtes instanciation.

Notez également que vous n'enregistrez probablement pas beaucoup en n'ayant pas les instances sur scène au démarrage, car ils sont compilés dans le film avant le cadre 1. Même si vous ne décochez pas le bouton "Incorporer le cadre 1", en les faisant référence dans votre classe Fichier, qui est compilé sur le cadre 1, vous les obligez à compiler sur le cadre 1.

===================================.

Si vous cliquez sur l'objet sur la scène dans le fichier FLA, regardez le nom d'instance du panneau Propriétés. C'est le nom de votre instance sur scène. S'il n'a pas de nom, donnez-le un. Si vous avez «déclarer les instances de scène automatiquement», vous êtes prêt. Sinon, vous devrez ajouter une déclaration de variable en haut du fichier pour rendre ce nom d'instance disponible en variable.

Maintenant, dans la classe de documents pour votre fichier FLA (ce que je suppose est ce que le code que vous avez collé ci-dessus):

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

Next clické changerait pour ressembler à ceci:

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

Je suppose que si vos graphiques sont grands ou qu'ils bougent, vous pourriez rencontrer des problèmes de performances en ayant plus d'un sur scène, mais j'ai supposé que vous essayiez de vous déplacer des problèmes de chargement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top