AS3:将键盘控制传递给子动画片段并返回主时间轴

时间:2015-04-04 19:17:20

标签: actionscript-3 flash air keyboard-events

编辑:我不知道这是不是常态,但我更愿意保留原来的问题并添加更新。如果我应该删除原始代码片段,请随时告诉我。

我试图在flash CS6中创建一个类似幻灯片的演示文稿,使用主时间轴,每个帧中有一个符号,并且这些符号中有不同的动画(有些非常复杂)。由于我将使用演示者遥控器,我已经捕获了击键并编码了pg_up和pg_down以分别转到下一帧和前一帧:

stage.addEventListener(KeyboardEvent.KEY_DOWN, pagerFunction);
var symb:movieClip;
function pagerFunction(e:KeyboardEvent):void
{
    var myKey = e.keyCode;
    if (myKey == Keyboard.PAGE_DOWN){
        if (symb != null){
            //some code that allows to control the symbols timeline forward
        } else {
            nextFrame();
        }
    }
    if (myKey == Keyboard.PAGE_UP){
        if (symb != null){
            //some code that allows to control the symbols timeline backward
        } else {
            prevFrame();
        }
}

我遇到的问题如下。我添加了framelabels和stop();符号动画中的代码,我需要控制从一个动画到下一个动画的步骤。但是,在网上尝试了很多解决方案之后,我还没有能够成功地让符号对pg_up和pg_down做出反应,好像它们是主时间轴的一部分。

总而言之,我需要解决的是:

  1. 输入主时间轴框架
  2. 识别符号实例(标记为_mc)
  3. 在符号时间轴内,从第一帧开始播放(标记为' 0')直到下一个标记的帧(' 1'等等)
  4. 停止并等待下一个pg_down开始从下一个标记的帧开始播放到以下内容(即' 1' - ' 2'),或者pg_up从前一个标记的帧开始播放(即' 0' 1')(为此,我会使用变量来跟踪。
  5. 在最后一帧(标记为' final')退出符号焦点并将键盘控制返回到主时间轴,以允许pg_down和pg_up移动到下一帧/上一帧。在symbol.currentFrame == 0上的pg_up上,做同样的事。
  6. 顺便说一句,如果有更好的方法来实现这一目标,我会打开(并且非常绝望)以获得更好的建议/解决方案。

    非常感谢能够提供帮助的任何人!

    编辑:好的,我想我在这个问题上并不是很清楚,所以我会尝试添加一点:

    addEventListener(KeyboardEvent.KEY_DOWN, mc_pagerFunction);
    var lbl:String;
    var counter:Number = 0;
    
    function mc_pagerFunction(e:KeyboardEvent):void {
        var myKey = e.keyCode;
        if (myKey == Keyboard.PAGE_DOWN){
            lbl = this.currentFrameLabel;
            if (this.currentFrameLabel == 'final'){
                stop();
                stage.focus = this.parent; //which would be the main timeline
            } else if (Number(lbl) == counter){
                this.gotoAndStop(lbl);
                counter++;
            } else {
                this.gotoAndPlay(lbl);
            }
        }
    
        if (myKey == Keyboard.PAGE_UP){
            lbl = this.currentFrameLabel;
            if (this.currentFrameLabel == '0'){
                stop();
                stage.focus = this.parent; //which would be the main timeline
            } else if (Number(lbl) == counter){
                this.gotoAndStop(lbl);
                counter--;
            } else {
                this.gotoAndPlay(lbl);
            }
        }
    }
    

    现在,当主时间轴进入下一帧时,这个位是我希望看到里面符号的行为,因此可以使用主时间轴作为幻灯片的种类并且符号内部发生了真实的事情。

    顺便说一下,我想尝试将所有代码保留在主操作层中,而不是符号中。我尝试过,将焦点转移到符号上,它也没有用,并且在整个地方都有代码可以克服我的神经;)。

    我希望这会对我所坚持的内容有所启发。

    再次,任何帮助表示赞赏。提前全部谢谢

    更新: 请有人帮帮我! 这就是我正在尝试的。从逻辑上讲,它在世界上都是有意义的,除了它不起作用。

    var symb:MovieClip;
    
    symb = MovieClip(root); //assign symbol I want to be controlled by pg_up/pg_down
    
    symb.focusRect = false;
    stage.focus = symb; //focus on current symbol
    
    symb.addEventListener(KeyboardEvent.KEY_DOWN, mc_pager);  //add keyboard event listener
    
    function mc_pager(e:KeyboardEvent):void{
        var myKey = e.keyCode;
        if (myKey == Keyboard.PAGE_DOWN){
            do{
                symb.play(); // it plays, then checks if the lbl is null or final, then quits
            } while (symb.currentFrameLabel == null && symb.currentFrameLabel != 'final');
            symb.stop();
            symb.removeEventListener(KeyboardEvent.KEY_DOWN, mc_pager); 
            stage.focus=MovieClip(root); //return focus to main timeline (in the next keyframes, the focus is on the nested _mc
        }
        if (myKey == Keyboard.PAGE_UP){
            do{
                symb.prevFrame();
            } while (symb.currentFrameLabel == null && symb.currentFrameLabel != '0');
            symb.stop();
            symb.removeEventListener(KeyboardEvent.KEY_DOWN, mc_pager); 
            stage.focus=MovieClip(root);
        }
    }
    

    我在哪里蠢蠢欲动才能做到正确?拜托,伙计们,你是专家,我需要你的建议。谢谢!

    更新: 对symb进行跟踪,似乎只要它进入函数,它就会忘记初始赋值(symb = MovieClip(root))并显示null。为什么呢?

1 个答案:

答案 0 :(得分:0)

在这个示例中,我创建了一个基本的概念证明,其中我在主时间轴上有一个实例名称为“c”的圆MC。在这个mc中,我创建了两个关键帧,两者都有停止动作。我在第2帧上将圆圈涂上了不同的颜色,并将其标记为“两个”。

在主时间轴中,我有以下代码:

import flash.events.KeyboardEvent;

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyEvt);

function keyEvt(e:KeyboardEvent):void{
        if(e.keyCode == Keyboard.PAGE_DOWN){
                trace("down");
                c.gotoAndPlay("two");
            }
    }

只要您坚持通过直接引用定位符号并确保键盘事件附加到舞台上,这应该有助于为您的代码奠定基础。

此外,始终坚持首先获得基本工作版本。 I.E.检查您的键盘侦听器是否适用于您的目标对象,然后构建其他功能。