Reputation: 3207
I'm writing a simple menu with ActionScript3 and nested switch cases. What it does is to check the current frame with the selected menu and if the selected menu is referring to another menu, do a transition and then go to selected frame, and if the selected menu is the current frame, traces a simple message. But when selected menu and current frame are equal, I get this annoying message and I don't know what I have to do to fix the problem.
My code is:
//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);
}
I'm using Flash CS5 and "greensock" plugin and my error is:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at _009_fla::MainTimeline/buttonClicked()
Upvotes: 0
Views: 526
Reputation: 360
the problem is when you add an event listener to myTM when its not there (when clicking the menu button for the current page) so I made a quick fix by checking if myTM is instantiated (not null) and if so add the event listener, hope it fixes your problem.
replace your buttonClicked function with this one:
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);
}
}
there's a lot of room for improvement in your code, for example it can be redone to use just one switch or many better approaches, but I don't want to heavily change your code.
Upvotes: 1