可能有多个时间表? (单独的部分不影响其他层的关键帧)AS3

时间:2014-01-06 15:50:16

标签: actionscript-3 flash actionscript

http://i.snag.gy/eu7iz.jpg

所以我在flash上​​做这个生成器/设计器。它具有不同的功能,因此考虑到许多动作脚本处理nextframes和gotos,关键帧与其他功能冲突。一旦我添加了一些小功能,它就会变得混乱。

就像现在我想为设计部分添加下一个按钮。我可以轻松地使用空白阶段轻松完成,我可以轻松地点击下一步和后退,但是当应用于我的项目时,它会让人感到有些眩晕。

这是第一帧的脚本:

stop();
small.addEventListener(MouseEvent.CLICK,play1);

function play1(event:MouseEvent):void{
    gotoAndStop("3");
}

medium.addEventListener(MouseEvent.CLICK,play2);

function play2(event:MouseEvent):void{
    gotoAndStop("6");
}

large.addEventListener(MouseEvent.CLICK,play3);

function play3(event:MouseEvent):void{
    gotoAndStop("8");
}


item_mc.addEventListener(MouseEvent.MOUSE_DOWN, dragTheObject); 
item_mc.addEventListener (MouseEvent.MOUSE_UP, itemRelease);
item_mc1.addEventListener(MouseEvent.MOUSE_DOWN, dragTheObject); 
item_mc1.addEventListener (MouseEvent.MOUSE_UP, itemRelease);
item_mc2.addEventListener(MouseEvent.MOUSE_DOWN, dragTheObject); 
item_mc2.addEventListener (MouseEvent.MOUSE_UP, itemRelease);


function dragTheObject(event:MouseEvent):void {
var item:MovieClip=MovieClip(event.target);
item.startDrag();
var topPos:uint=this.numChildren-1;
this.setChildIndex(item, topPos);
}

function itemRelease(event:MouseEvent):void {
var thisItem:MovieClip=MovieClip(event.target);
thisItem.stopDrag();
};

这是fla文件:https://www.dropbox.com/s/77euop1luqjreos/FINAL.fla

2 个答案:

答案 0 :(得分:0)

MovieClips 有自己的时间轴。您可能希望模块化您的程序到Movieclip组件并导出 Actionscript 操作,您可以在实例化必要时运行时间。现在,这是避免代码分布在一个时间轴上的一种方法。但是如果你仍然想坚持自己的方式(使用单个时间轴),你仍然可以实现下一个/上一个实现,而不会影响任何速率的帧逻辑一个简单的方法就是这样:

  • 将所有逻辑封装到函数中,并将这些函数单独放在第1帧上,而不是其他任何内容。 这使逻辑保持清洁并与组件分离。此外,逻辑层原则上不应该没有别的。为什么在第1帧?好吧,我们希望首先暴露并保留在内存中的逻辑,以便后续帧上的任何与组件相关的代码都应该知道以前的逻辑,因此在与第1帧进行交互时不会产生运行时错误逻辑。
  • 分别在后续帧中传播您的组件和相关代码。 仅将与组件相关的代码放在具有相关组件的框架上。注册事件侦听器可以将目标作为其依赖项。定义事件监听器并将它们作为逻辑的一部分放在第1帧上,并根据需要简单地放置用于在组件帧上注册监听器的代码。

    示例:

     //On Frame 1
    
     function onAMouseClick(event:Event):void
     {
        //implement logic
     }
    
     function onBMouseClick(event:Event):void
     {
        //implement logic
     }
    
    
     //Implemented function for next/back buttons
     //Also on Frame 1
     function navigate(event:Event):void
     {
          var frame:int;
    
          switch(event.target.name)
          {
             case "nextBtn":
                  frame=currenFrame<numFrames?+1:numFrames; 
                  gotoAndStop(frame);
              break;
             case "backBtn": 
                  frame=currenFrame>2?-1:currentFrame; 
                  gotoAndStop(frame);
             break;
          }
    
     }
    
    
       //On Frame 2 for A component
        A.addEventListener(MouseEvent.CLICK, onAMouseClick)
    
        //On Frame 3 for B component
        B.addEventListener(MouseEvent.CLICK, onAMouseClick)
    
  • 将“下一个/后退”按钮组件放在从第2帧一直延伸到您希望按钮可见的最后一帧结尾的单个图层上。然后实现相关代码,其可见性跨越帧2和最后一帧之间,如下所示:

        //navigate handler is  declared and implemented on  **frame 1**
        nextBtn.addEventListener(MouseEvent.Click, navigate)
        nextBtn.addEventListener(MouseEvent.Click, navigate)
    

嗯,这是你做事的方式(单一时间线脚本)。对于简单的时间轴脚本来说也不错。您可以尝试另一种方式来实例化Movieclips(为动作脚本导出) 在运行时,根据需要将这些添加到显示列表中,点击下一个/后退按钮。这样做不仅会有一个逻辑点,而且会在每个单独的组件中封装MC代码。

希望前面的帮助。感谢。

答案 1 :(得分:0)

不要害怕改变代码!更别说害怕遇到错误了!这是前进的方式,你想要学习修复它的美丽! .....干杯!