I have a flash site I'm building, the only problem I'm having is the carousel I have for it does not stay on the frame its supposed to be on.

I.E.

I click on the link to the carousel, and it pops up and works normally, however, if I click on another link to a different page in the site, the carousel remains on the stage, and if I click BACK on the link to the carousel, it continues to duplicate the carousel everytime the link is clicked on.

I'm thinking that an <if> statement used in the code to limit it to that frame<i.e.<if on frame X>>

Here is the code, if it helps

import mx.utils.Delegate;
import mx.transitions.Tween;
import mx.transitions.easing.*;

var numOfItems:Number;
//rad X/Y adjust for carousel size
var radiusX:Number = 300;
var radiusY:Number = 90;
var centerX:Number = Stage.width/2;
var centerY:Number = Stage.height/2;
var speed:Number = 0.01;
var perspective:Number = 130;
var home:MovieClip = this;
theText._alpha = 0;
var nodes;

var tooltip:MovieClip = this.attachMovie("tooltip","tooltip",10000);
tooltip._alpha = 0;

var xml:XML = new XML();
xml.ignoreWhite = true;

xml.onLoad = function()
{
    nodes = this.firstChild.childNodes;
	numOfItems = nodes.length;
	for(var i=0;i<numOfItems;i++)
	{
		var t = home.attachMovie("item","item"+i,i+1);
		t.angle = i * ((Math.PI*2)/numOfItems);
		t.onEnterFrame = mover;
		t.toolText = nodes[i].attributes.tooltip;
		t.content = nodes[i].attributes.content;
		t.icon.inner.loadMovie(nodes[i].attributes.image);
		t.ref.inner.loadMovie(nodes[i].attributes.image);
		t.icon.onRollOver = over;
		t.icon.onRollOut = out;
		t.icon.onRelease = released;
	}
}


function over()
{
	home.tooltip.tipText.text = this._parent.toolText;
	home.tooltip._x = this._parent._x;
	home.tooltip._y = this._parent._y - this._parent._height/8;
	home.tooltip.onEnterFrame = Delegate.create(this,movetip);
	home.tooltip._alpha = 100;
}

function out()
{
	delete home.tooltip.onEnterFrame;
	home.tooltip._alpha = 0;
}

function released()
{
	home.tooltip._alpha = 0;
	for(var i=0;i<numOfItems;i++)
	{
		var t:MovieClip = home["item"+i];
		t.xPos = t._x;
		t.yPos = t._y;
		t.theScale = t._xscale;
		delete t.icon.onRollOver;
		delete t.icon.onRollOut;
		delete t.icon.onRelease;
		delete t.onEnterFrame;
		if(t != this._parent)
		{
			var tw:Tween = new Tween(t,"_xscale",Strong.easeOut,t._xscale,0,1,true);
			var tw2:Tween = new Tween(t,"_yscale",Strong.easeOut,t._yscale,0,1,true);
			var tw3:Tween = new Tween(t,"_alpha",Strong.easeOut,100,0,1,true);
		}
		else
		{
			var tw:Tween = new Tween(t,"_xscale",Strong.easeOut,t._xscale,100,1,true);
			var tw2:Tween = new Tween(t,"_yscale",Strong.easeOut,t._yscale,100,1,true);
			//XY modify thumb position next to full size image
			var tw3:Tween = new Tween(t,"_x",Strong.easeOut,t._x,160,1,true);
			var tw4:Tween = new Tween(t,"_y",Strong.easeOut,t._y,450,1,true);
			var tw5:Tween = new Tween(theText,"_alpha",Strong.easeOut,0,100,1,true);
			trace(nodes[i].attributes.content);
			_root.theText.loadMovie(nodes[i].attributes.content);
			var s:Object = this;
			tw.onMotionStopped = function()
			{
				s.onRelease = unReleased
			}
		}
	}
}

function unReleased()
{
	delete this.onRelease;
	var tw:Tween = new Tween(theText,"_alpha",Strong.easeOut,100,0,.5,true);
	for(var i=0;i<numOfItems;i++)
	{
		var t:MovieClip = home["item"+i];
		if(t != this._parent)
		{
			var tw:Tween = new Tween(t,"_xscale",Strong.easeOut,0,t.theScale,1,true);
			var tw2:Tween = new Tween(t,"_yscale",Strong.easeOut,0,t.theScale,1,true);
			var tw3:Tween = new Tween(t,"_alpha",Strong.easeOut,0,100,1,true);
		}
		else
		{
			var tw:Tween = new Tween(t,"_xscale",Strong.easeOut,100,t.theScale,1,true);
			var tw2:Tween = new Tween(t,"_yscale",Strong.easeOut,100,t.theScale,1,true);
			var tw3:Tween = new Tween(t,"_x",Strong.easeOut,t._x,t.xPos,1,true);
			var tw4:Tween = new Tween(t,"_y",Strong.easeOut,t._y,t.yPos,1,true); 
			var s:Object = this;
			tw.onMotionStopped = function()
			{
				{
					for(var i=0;i<numOfItems;i++)
					{
						var t:MovieClip = home["item"+i];
						t.icon.onRollOver = Delegate.create(t.icon,over);
						t.icon.onRollOut = Delegate.create(t.icon,out);
						t.icon.onRelease = Delegate.create(t.icon,released);
						t.onEnterFrame = mover;
					}
				}
			}
		}
	}
}

function movetip()
{
	home.tooltip._x = this._parent._x;
	home.tooltip._y = this._parent._y - this._parent._height/8;
}

xml.load("icons.xml");

function mover()
{
	this._x = Math.cos(this.angle) * radiusX + centerX;
	this._y = Math.sin(this.angle) * radiusY + centerY;
	var s:Number = (this._y-perspective) / (centerY+radiusY-perspective);
	this._xscale = this._yscale = s * 100;
	this.angle += this._parent.speed;
	this.swapDepths(Math.round(this._xscale) + 100);
}

this.onMouseMove = function()
{
	//carousel speed modifier
	speed = (this._xmouse-centerX) / 6500;
}

Any help is greatly appreciated.

Dani AI

Generated

Short diagnosis: the carousel is being created every time frame 140 is entered, and the previously attached clips and their onEnterFrame handlers are never cleaned up. That produces one extra running carousel per visit and eventually causes performance problems. 's paste-in fix worked because it avoided re-creating the runtime clips, but a more robust approach is to either prevent re-initialization or explicitly remove what you created when leaving the frame.

A simple guard to avoid re-creation (place around your initialization code):

if (!_root.carouselInitialized) {
  _root.carouselInitialized = true;
  // run your attach/create logic here (attachMovie, set onEnterFrame, xml.load, etc.)
}

If you prefer cleanup on exit, put the carousel inside a single wrapper MovieClip and use an onUnload handler to remove runtime clips and delete handlers before the frame changes:

this.onUnload = function() {
  for (var i = 0; i < numOfItems; i++) {
    var c = this["item" + i];
    if (c) {
      delete c.onEnterFrame;
      delete c.icon.onRollOver;
      delete c.icon.onRollOut;
      delete c.icon.onRelease;
      c.removeMovieClip();
    }
  }
  delete this.onMouseMove;
  if (xml) xml.onLoad = null;
};

Practical tips and cautions:

  • Use MovieClip.getNextHighestDepth() (or a guard) to avoid depth collisions when attaching.
  • Always delete event handlers (onEnterFrame, mouse callbacks) before removeMovieClip to prevent lingering references.
  • Clear XML callbacks (xml.onLoad = null) if you only want the loader to run once.
  • Encapsulating the carousel in one library clip (with its own init/unload code) makes lifecycle management much simpler.

For reference on attach/create/remove patterns see the ActionScript 2 MovieClip docs: .

This explains why duplicates appeared and gives two safe, low-effort fixes — a one-time init guard or explicit cleanup on unload — plus a few stability tips for production.

Recommended Answers

All 5 Replies

I am thinking that a code string something similar to

on(leaveFrame)
{
     delete functions
}

where <functions> is replaced with the various functions in the code, and repeated to delete all functions.

My biggest problem is that I just don't know actionscript really at all, so having a really hard time trying to figure this out, and the proper structure for the code.

Member Avatar for Member #334542

Hey man, I tried yesterday your file for a long time, and I did not get you what you are coming to say? There is no back button in your fla file. I tried to download your file from your previous post but you uploaded the file that I sent you last. So exactly point out the issue and attach your source as you did before.


Now the file is working as below:
1. when you click the thumbnail it popups the large image
2. The thumbnail is automatically get the left position and large image in the right position
3. when you click the left image again it returns to caurosel and working fine.

Then whats the problem, where you have the back button, and when it creating the duplicates?

http://www.atomicplum.com/Students/Ben/Flash/Ben%20Flash%20Site.zip


Thats the new file, the carousel, is working properly and its there on frame 140. Overall, everything on the site works like its supposed to, its just the problem with the carousel won't stop when leaving that frame, and if you go BACK to it, the carousel duplicates itself. One duplicate for EVERY time you go back to that frame in the .swf<<i.e. if you click on the graphics link 10 times, you'll have 10 copies of the carousel running at the same time; potentially you could do it enough to crash a computer!!>>.

Member Avatar for Member #334542

Follow the instructions carefully:

  1. Take backup of your original Deathbydesign.fla file
  2. Open Deathbydesign.fla (not the attached file, the original file you have in your system)
  3. Go to image layer > select the keyframe at 141 > press delete (confirm that you have a empty keyframe now)
  4. Delete the Carousel layer (Dont worry about the code, just delete the layer)
  5. Open the attached file solution.fla
  6. Click on the blue movieclip to select and copy from the edit menu
  7. Goto your Deathbydesign.fla file and select the empty keyframe on image layer
  8. Goto Edit > Paste in Place

I have executed and its working fine.

Note: When you paste, sometimes overwrite msg will come. overwrite it.

Thats it! Enjoy!

I had no that much of speed to attach the file, thats why I created a simple file and asking you to do this.
If you struggle, come again. I am here to help you. But please convert your file to flash 8 so that I will give you
the solution soon, bcoz only in home I have flash cs4.

Hope this solve!

commented: Very Knowledgeable, and friendly, great responses!! +1

Your a life saver, thank you so much. Now I think I'm going to go learn AS properly before I go off trying to do any of this again.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.