我试图在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做出反应,好像它们是主时间轴的一部分。
总而言之,我需要解决的是:
非常感谢能够提供帮助的任何人!
编辑:好的,我想我在这个问题上并不是很清楚,所以我会尝试添加一点:
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。为什么呢?
答案 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.检查您的键盘侦听器是否适用于您的目标对象,然后构建其他功能。