Skip to main content
Participant
August 19, 2022
Question

how to repeatedly duplicate mc with AS3

  • August 19, 2022
  • 3 replies
  • 213 views

Hi, I need advice on how to duplicate MC from the library repeatedly. This code creates a copy of the MC (walking character) on the stage and then another function moves it. This works fine. But as soon as I click again, it doesn't work anymore. The first character stops and the second one goes 2x faster. I know that the problem is in the "akceb" variable, if they were named differently after each click, it would be fine. But I don't know how to do it. Please, give me an advice. Thank you

 

karta1Class=getDefinitionByName(karta1Name) as Class;
karta1Sprite=new karta1Class();
akceb = hraKartyKontejner.addChild(karta1Sprite);
akceb.addEventListener(Event.ENTER_FRAME, vyvolejPostavu);


function vyvolejPostavu(e:Event):void
{

//character shift
akceb.x = akceb.x+rychlost;
}

This topic has been closed for replies.

3 replies

kglad
Community Expert
Community Expert
August 21, 2022

your code is problematic, if it executes more than once:

 

karta1Sprite=new karta1Class();

//you have duplicate objects named karta1Sprite.  


akceb = hraKartyKontejner.addChild(karta1Sprite);

// akcep = karta1Sprite, so this accomplishes nothing more than: hraKartyKontejner.addChild(karta1Sprite);

// the last created karta1Sprite is the only one able to be referenced by karta1Sprite (and/or akcep).

 

akceb.addEventListener(Event.ENTER_FRAME, vyvolejPostavu);

/* compounds the problem by repeatedly adding the same listener to the last created karta1Sprite. ie, if your shown code executes twice, you expect exactly the problem you described.  if it executes 10 times, the last karta1Sprite will move 10 x rychlost and the others will not move */


function vyvolejPostavu(e:Event):void
{

//character shift
akceb.x = akceb.x+rychlost;

// again, akceb is the last created karta1Sprite.
}

 

 

you're not going to get much performance benefit by pooling or using an array or using one enterframe loop unless there are more than 10**5 characters.

 

but using those things will help you keep organized.  but so will using a class file for kart1Class and generally is easier to maintain and debug.

 

 

JoãoCésar17023019
Community Expert
Community Expert
August 21, 2022

Hi.

 

I recommend you to add only one enterFrame listener. Something like this:

import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.MouseEvent;

var spawned:Vector.<YourLibSymbol> = new Vector.<YourLibSymbol>();

function spawn(e:MouseEvent):void
{
	var instance:YourLibSymbol = new YourLibSymbol();
	
	instance.vX = 10;
	addChild(instance);
	spawned.push(instance);
}

function enterFrameHandler(e:Event):void
{
	var i:int;
	
	for (i = spawned.length - 1; i > -1; i--)
		spawned[i].x += spawned[i].vX;
}

yourButton.addEventListener(MouseEvent.CLICK, spawn);
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

 

If you want to improve performance event further, consider using object pooling.

 

Regards,

JC

Colin Holgate
Inspiring
August 19, 2022

 isn't easy to see what is wrong. Is there a way to can upload the files for us to rtry?