0

キーを押すことで制御される一般的なスライドショーフラッシュファイルを作成しようとしています...右と左の矢印で次/前のスライドに移動し、下と上で単一のアニメーション/箇条書き/単一のスライド上のものを呼び出し/呼び出し解除します. これまでのところ、ムービークリップからすべてのページをロードし、左右の矢印でフリックし、非常に速くフリックした場合でも効果的なフェードアウトとフェードインを行うことができるファイルを取得することができました。数時間かけて多くの Google 検索を行った後、まったく得られないのは、単一ページのムービークリップを制御する方法です。これまでにファイルをアップロードしました:

http://www.broesel-brzelius.de/zeug/slide.zip

pageHolder.Pages.page1 ムービークリップを gotoAndStop(2) に制御しようとする私の (まだ大雑把な) 試みは、配列の位置 0 にロードされた pageHolder.Pages ムービークリップになり、フレーム 2 に移動することがわかります。 2 ページ目を表示します。

これまでのコード:

import flash.display.Sprite; 
import flash.events.MouseEvent; 
import com.greensock.*; 
import flash.display.MovieClip; 

// instantiate a variable to find number of pages 
var numberOfPages:Pages = new Pages(); 
// instantiate an array to hold the page movieclips 
var pageArray:Array = new Array(); 
// instantiate a container to hold the pages 
var pageHolder:Sprite = new Sprite(); 
// declare variables that will hold reference to the current page IDs
var targetIDold:int = 0;
var targetIDnew:int = 0;
// declare a variable that will hold the current direction of slide movement
var movement:int = -1;

// call a function that builds the application 
// pass in the number of pages in fl_prevSlide 
buildApp(numberOfPages.totalFrames);

// this function builds the application
function buildApp(n:int):void
{
    // declare variables for the pages
    var p:Pages;
    // instantiate a new Page, send its playhead to the current value of i+1
    // it is necessary to add 1 to the value of i, since i starts at 0, while the timeline starts at 1
    for (var i:int = 0; i < n; i++) 
    { 
        p = new Pages(); 
        p.gotoAndStop(i + 1); 
        pageArray.push(p);
    } 
    // set the position of the pageHolder relative to the buttonHolder 
    pageHolder.x = pageHolder.y = 0; 
    // add the first page (at index 0) from pageArray to pageHolder 
    pageHolder.addChild(pageArray[targetIDnew]); 
    // add pageHolder and buttonHolder to the stage 
    addChild(pageHolder); 
} 

//Adding Listener and corresponding function to change between slides
stage.addEventListener(KeyboardEvent.KEY_DOWN, f_changeSlide);
function f_changeSlide(evt:KeyboardEvent):void
{
    if(evt.keyCode == 37) // left arrow
    {
        f_prevSlide();
    }
    else if (evt.keyCode == 39 || evt.keyCode == 32) // right arrow or space
    {
        f_nextSlide();
    }
}
function f_prevSlide():void
{
    if(targetIDnew > 0)
    {
        movement = -1;
        targetIDnew -= 1;
        f_addPage();
    }
}
function f_nextSlide():void
{
    if(targetIDnew < (numberOfPages.totalFrames - 1))
    {
        movement = 1;
        targetIDnew += 1;
        f_addPage();
    }
}

function f_addPage():void 
{ 
    // use the targetID variable to access the corresponding index in the pageArray and assign it to a temporary variable
    targetIDold = targetIDnew - movement;
    var _mcOld:MovieClip = MovieClip(pageArray[targetIDold]);
    var _mcNew:MovieClip = MovieClip(pageArray[targetIDnew]);
    //avoid flickering
    if (_mcNew.alpha == 1) {
        _mcNew.alpha = 0;
    }
    // add the temp variable to pageHolder
    pageHolder.addChild(_mcNew);
    // tween the temp variable to the specified properties, then call a function to remove the previous page
    // new page gets faded in, old page gets faded out
    TweenMax.to(_mcNew, 1.5, {alpha:1}); 
    TweenMax.to(_mcOld, 1.5, {alpha:0, onComplete:f_removePage}); 
} 

function f_removePage():void 
{ 
    // previous page will always be at index 0; remove it 
    // the new page just added will drop down to index 0 when the previous page is removed 
    pageHolder.removeChildAt(0); 
}

//Trying to advance / decrease the timeline in the movieclips of the single pages by pressing down / up
stage.addEventListener(KeyboardEvent.KEY_DOWN, f_changeFrame);
function f_changeFrame(evt:KeyboardEvent):void
{
    if(evt.keyCode == 40) // down arrow
    {
        f_nextFrame();
    }
    else if (evt.keyCode == 38) // up arrow
    {
        f_prevFrame();
    }
}
function f_nextFrame():void
{
        var w:uint = pageHolder.numChildren - 1 ;
        (pageHolder.getChildAt(w) as MovieClip).gotoAndStop(currentFrame + 1);
//      for (var i:uint = 0; i < pageHolder.numChildren; i++)
//      {
//       trace (+i+'.\t name:' + pageHolder.getChildAt(i).name + '\t type:' + typeof (pageHolder.getChildAt(i)));
//      }
        trace ("down!");
}

function f_prevFrame():void
{
        var w:uint = pageHolder.numChildren - 1 ;
        (pageHolder.getChildAt(w) as MovieClip).gotoAndStop(currentFrame - 1);
//      for (var i:uint = 0; i < pageHolder.numChildren; i++)
//      {
//       trace (+i+'.\t name:' + pageHolder.getChildAt(i).name + '\t type:' + typeof (pageHolder.getChildAt(i)));
//      }
        trace ("up!");
}

編集:コードを少し明確化

Edit2: TL;DR: 問題は、mc ページの子である mc page1 のタイムラインを制御できない 3 つの関数を含むコードの最後のビットであり、フレームごとに配列にプッシュされ、実行時にスプライトページホルダー。単一ページのムービークリップのタイムラインを制御するには?

4

1 に答える 1

0

最後にそれを機能させました。これは完璧なパワーポイントの代替品として機能します:D

単一のスライド ( mc の各フレームに 1 つのムービークリップpages)などpage0に名前を付ける必要がありますpage1。その後、このコードでタイムラインを制御できます (上記の質問にリストされている関数を置き換えるだけです)。

function f_nextFrame():void
{
    var temp:uint = pageHolder.numChildren - 1;
    var frame:uint = ((pageHolder.getChildAt(temp) as MovieClip)["page" + targetIDnew].currentFrame);
    (pageHolder.getChildAt(temp) as MovieClip)["page" + targetIDnew].gotoAndStop(frame + 1);
}

function f_prevFrame():void
{
    var temp:uint = pageHolder.numChildren - 1;
    var frame:uint = ((pageHolder.getChildAt(temp) as MovieClip)["page" + targetIDnew].currentFrame);
    (pageHolder.getChildAt(temp) as MovieClip)["page" + targetIDnew].gotoAndStop(frame - 1);
}
于 2013-04-23T14:42:23.430 に答える