2013-04-21 69 views
0

我试图建立一个通用的幻灯片显示Flash文件,按键控制...左右箭头前往下一张/上一张幻灯片,向下调用/在单张幻灯片上打开单个动画/项目符号/无论如何。 到目前为止,我设法获得一个文件,可以加载动画片段中的所有页面,并通过右箭头和左箭头轻弹它们,并且淡入淡出效果很好,即使在快速弹奏时也是如此。 几个小时后,我没有得到什么,大量的谷歌搜索是如何控制单页的影片剪辑。我上传至今文件:Actionscript 3.0:控制添加数组的子影片剪辑

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

你可以看到我的(尚未原油)企图控制pageHolder.Pages.page1影片剪辑到gotoAndStop(2)只是导致pageHolder.Pages影片剪辑被加载到数组中的位置0以转到第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的时间轴中三种功能的最后位page1,它是mc页面的子元素,它被逐帧地推送到数组中,并在运行时加载到精灵pageHolder中。如何控制单页动画片段的时间轴?

+0

你能具体谈谈这个说法 - “我不明白,在所有的几个小时,很多后的谷歌搜索是如何现在控制单页影片剪辑“。目前尚不清楚你所坚持的是什么。尝试缩小你的问题到精确的问题。 – prototypical 2013-04-22 00:45:05

+0

问题是:我有一个称为“页面”的movieclip,导出为Actionscript作为“页面”。它由一个框架组成,每个页面被添加到数组中并且可以被“浏览”。 – Brzelius 2013-04-22 05:02:52

+0

我还没有关注你。问题是什么 ? – prototypical 2013-04-22 05:06:13

回答

0

终于搞定了。这将作为一个完美的PowerPoint替代:d

您需要命名单和幻灯片为page0page1等等(MC pages的每一帧上的一个影片剪辑),然后可以控制自己的时间安排与此代码(只是替换)在这个问题上面列出的功能:

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