我正在用ActionScript3和嵌套开关案例编写一个简单的菜单。它所做的是用选中的菜单检查当前帧,如果选中的菜单引用了另一个菜单,则执行一个过渡,然后转到选中的帧,如果选中的菜单是当前帧,则跟踪一条简单的消息。但是当所选菜单和当前框架相等时,我得到这个烦人的消息,我不知道该怎么做来解决这个问题。
我的代码是://Import TweenMax
import com.greensock.*;;
import com.greensock.plugins.*;
import flash.events.MouseEvent;
var frameNumber:int = currentFrame;
TweenPlugin.activate([BlurFilterPlugin]);
//Add the buttons into an array
var buttonsArray:Array = new Array(s1t1,s1t2,s1t3,s1t4,s1t5);
//Loop through the buttons array
for (var i:uint = 0; i < buttonsArray.length; i++) {
//Add event listeners for the button
buttonsArray[i].addEventListener(MouseEvent.MOUSE_OVER, mouseOverButton);
buttonsArray[i].addEventListener(MouseEvent.CLICK, buttonClicked);
}
//Move the buttonBackground under the home button (= starting position)
buttonBackground.x = s1t1.x;
buttonBackground.y = s1t1.y;
//Make the buttonBackground a bit bigger than the home button
buttonBackground.width = s1t1.width + 10;
buttonBackground.height = s1t1.height + 10;
//Tween the buttonBackground to a random color using TweenMax
TweenMax.to(buttonBackground, 0.1, {tint: Math.random() * 0xffffff});
//This function is called when the mouse is over a button
function mouseOverButton(e:MouseEvent):void {
//trace(e.target.name + " was touched!");
//Assign the button to a local variable
var button:MovieClip = (MovieClip)(e.target);
//Calculate the new target width and height for the buttonBackground
var targetWidth:Number = button.width + 10;
var targetHeight:Number = button.height + 10;
//Tween the buttonBackground's position, size and color (color is random)
TweenMax.to(buttonBackground, 0.5, {x: button.x, y: button.y,
width:targetWidth, height:targetHeight, tint: Math.random() * 0xffffff});
}
//This function is called when a button is clicked
function buttonClicked(e:MouseEvent):void {
switch(e.target.name){
case "s1t1":
switch (currentFrame){
case 5:
trace("Nowhere to go!");
break;
case 6:
var myTM:TransitionManager = new TransitionManager(s1text2);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 7:
var myTM:TransitionManager = new TransitionManager(s1text3);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 8:
var myTM:TransitionManager = new TransitionManager(s1text4);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
var myTM:TransitionManager = new TransitionManager(s1text5);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
default:
trace("Nowhere to go!");
}
frameNumber = 5;
myTM.addEventListener("allTransitionsOutDone", doneTrans)
break;
case "s1t2":
switch (currentFrame){
case 5:
var myTM:TransitionManager = new TransitionManager(s1text1);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 6:
trace("Nowhere to go!");
break;
case 7:
var myTM:TransitionManager = new TransitionManager(s1text3);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 8:
var myTM:TransitionManager = new TransitionManager(s1text4);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
var myTM:TransitionManager = new TransitionManager(s1text5);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
default:
trace("Nowhere to go!");
}
frameNumber = 6;
myTM.addEventListener("allTransitionsOutDone", doneTrans);
break;
case "s1t3":
switch (currentFrame){
case 5:
var myTM:TransitionManager = new TransitionManager(s1text1);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 6:
var myTM:TransitionManager = new TransitionManager(s1text2);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 7:
trace("Nowhere to go!");
break;
case 8:
var myTM:TransitionManager = new TransitionManager(s1text4);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
var myTM:TransitionManager = new TransitionManager(s1text5);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
default:
trace("Nowhere to go!");
}
frameNumber = 7;
myTM.addEventListener("allTransitionsOutDone", doneTrans);
break;
case "s1t4":
switch (currentFrame){
case 5:
var myTM:TransitionManager = new TransitionManager(s1text1);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 6:
var myTM:TransitionManager = new TransitionManager(s1text2);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 8:
trace("Nowhere to go!");
break;
case 7:
var myTM:TransitionManager = new TransitionManager(s1text3);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
var myTM:TransitionManager = new TransitionManager(s1text5);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
default:
trace("Nowhere to go!");
}
frameNumber = 8;
myTM.addEventListener("allTransitionsOutDone", doneTrans);
break;
case "s1t5":
switch (currentFrame){
case 5:
var myTM:TransitionManager = new TransitionManager(s1text1);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 6:
var myTM:TransitionManager = new TransitionManager(s1text2);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 7:
var myTM:TransitionManager = new TransitionManager(s1text3);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 8:
var myTM:TransitionManager = new TransitionManager(s1text4);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
trace("Nowhere to go!");
break;
}
frameNumber = 9;
myTM.addEventListener("allTransitionsOutDone", doneTrans);
break;
}
}
function doneTrans(e:Event):void{
trace("Going frame: "+frameNumber);
gotoAndStop(frameNumber);
}
我正在使用Flash CS5和"greensock"插件,我的错误是:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at _009_fla::MainTimeline/buttonClicked()
问题是当您添加事件侦听器到myTM时,它不存在(当单击当前页面的菜单按钮时),所以我通过检查myTM是否实例化(非空)进行了快速修复,如果是这样,添加事件侦听器,希望它能解决您的问题。
用下面的函数替换你的buttonClicked函数:
function buttonClicked(e:MouseEvent):void {
//declaring new variables inside conditional cases is a bad practice
var myTM:TransitionManager;
switch(e.target.name){
case "s1t1":
switch (currentFrame){
case 5:
trace("Nowhere to go!");
break;
case 6:
myTM = new TransitionManager(s1text2);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 7:
myTM = new TransitionManager(s1text3);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 8:
myTM = new TransitionManager(s1text4);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
myTM = new TransitionManager(s1text5);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
default:
trace("Nowhere to go!");
}
frameNumber = 5;
//myTM.addEventListener("allTransitionsOutDone", doneTrans)
break;
case "s1t2":
switch (currentFrame){
case 5:
myTM = new TransitionManager(s1text1);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 6:
trace("Nowhere to go!");
break;
case 7:
myTM = new TransitionManager(s1text3);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 8:
myTM = new TransitionManager(s1text4);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
myTM = new TransitionManager(s1text5);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
default:
trace("Nowhere to go!");
}
frameNumber = 6;
//myTM.addEventListener("allTransitionsOutDone", doneTrans);
break;
case "s1t3":
switch (currentFrame){
case 5:
myTM = new TransitionManager(s1text1);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 6:
myTM = new TransitionManager(s1text2);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 7:
trace("Nowhere to go!");
break;
case 8:
myTM = new TransitionManager(s1text4);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
myTM = new TransitionManager(s1text5);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
default:
trace("Nowhere to go!");
}
frameNumber = 7;
//myTM.addEventListener("allTransitionsOutDone", doneTrans);
break;
case "s1t4":
switch (currentFrame){
case 5:
myTM = new TransitionManager(s1text1);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 6:
myTM = new TransitionManager(s1text2);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 8:
trace("Nowhere to go!");
break;
case 7:
myTM = new TransitionManager(s1text3);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
myTM = new TransitionManager(s1text5);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
default:
trace("Nowhere to go!");
}
frameNumber = 8;
//myTM.addEventListener("allTransitionsOutDone", doneTrans);
break;
case "s1t5":
switch (currentFrame){
case 5:
myTM = new TransitionManager(s1text1);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 6:
myTM = new TransitionManager(s1text2);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 7:
myTM = new TransitionManager(s1text3);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 8:
myTM = new TransitionManager(s1text4);
myTM.startTransition({type:Fade, direction:Transition.OUT, duration:0.25, easing:Back.easeOut});
break;
case 9:
trace("Nowhere to go!");
break;
}
frameNumber = 9;
//myTM.addEventListener("allTransitionsOutDone", doneTrans);
break;
}
//if myTM is not null (not empty) add the event listener
if (myTM)
{
myTM.addEventListener("allTransitionsOutDone", doneTrans);
}
}
你的代码有很多改进的空间,例如,它可以用一个开关或许多更好的方法来重做,但我不想大量改变你的代码。