Skip to main content
Known Participant
November 8, 2022
Answered

I wish to create objects that moves away from mouse cursor

  • November 8, 2022
  • 2 replies
  • 775 views

I have 10 - 15 bats and I would like them to avoid (move away) from the mouse cursor.

Do I need to create separate symbols from each bat?
Also which AS3 code I need to use to achive my goal?
Example: https://codepen.io/richimgd/pen/XWJmmGK

Thanks a lot in advance guys 

    This topic has been closed for replies.
    Correct answer JoãoCésar17023019

    Hi.

     

    Here is a sample.

     

    AS3 code:

    import flash.display.DisplayObjectContainer;
    import flash.display.MovieClip;
    import flash.events.Event;
    
    const MAX_PARTICLES:uint = 15;
    
    var magnet:Number = 500;
    var target:MovieClip;
    var forceX:Number = 0;
    var forceY:Number = 0;
    var forceDivider:Number = 4;
    
    function main():void
    {
    	spawnMultiple(MAX_PARTICLES, Bat);
    	setParticles();
    	stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    }
    
    function spawnMultiple(total:uint, ParticleClass:*):void
    {
    	var i:int;
    	
    	for (i = total - 1; i > -1; i--)
    		spawnParticle(particlesContainer, ParticleClass);
    }
    
    function spawnParticle(container:DisplayObjectContainer, ParticleClass:*):void
    {
    	var particle = new ParticleClass();
    	
    	particle.x = randomRange(particle.width * 0.5, stage.stageWidth - particle.width * 0.5);
    	particle.y = randomRange(particle.height * 0.5, stage.stageHeight - particle.height * 0.5);
    	container.addChild(particle);
    }
    
    function setParticles():void
    {
    	var i:int;
    	
    	for (i = particlesContainer.numChildren - 1; i > -1; i--)
    	{
    		var child:MovieClip = particlesContainer.getChildAt(i) as MovieClip;
    		
    		child.initialX = child.x;
    		child.initialY = child.y;
    		child.gotoAndPlay(uint(randomRange(1, child.totalFrames - 1)));
    	}
    }
    
    function enterFrameHandler(e:Event):void
    {	
    	var i:int;
    	
    	for (i = particlesContainer.numChildren - 1; i > -1; i--)
    	{
    		var target:MovieClip = particlesContainer.getChildAt(i) as MovieClip;
    		var distanceX:Number = particlesContainer.mouseX - target.x;
    		var distanceY:Number = particlesContainer.mouseY - target.y;
    		var distance:Number = Math.sqrt((distanceX * distanceX) + (distanceY * distanceY));
    		var powerX:Number = target.x - (distanceX / distance) * magnet / distance;
    		var powerY:Number = target.y - (distanceY / distance) * magnet / distance;
    		
    		forceX = (forceX + (target.initialX - target.x) * 0.5) / forceDivider;
    		forceY = (forceY + (target.initialY - target.y) * 0.5) / forceDivider;
    		target.x = powerX + forceX;
    		target.y = powerY + forceY;
    	}
    }
    
    function randomRange(min:Number, max:Number):Number
    {
    	return min + Math.random() * (max - min);
    }
    
    main();

     

    Download / FLA / SWF:
    https://bit.ly/3EfPy1z

     

    I hope it helps.

     

    Regards,

    JC

    2 replies

    kglad
    Community Expert
    Community Expert
    November 9, 2022

    you can use the same library object for each bat, but each bat should have a different instance name, though there are other ways to do it so you don't need to use the different instance names.

     

    and the link you posted isn't as3 code.  that's javascript.

    JoãoCésar17023019
    Community Expert
    JoãoCésar17023019Community ExpertCorrect answer
    Community Expert
    November 9, 2022

    Hi.

     

    Here is a sample.

     

    AS3 code:

    import flash.display.DisplayObjectContainer;
    import flash.display.MovieClip;
    import flash.events.Event;
    
    const MAX_PARTICLES:uint = 15;
    
    var magnet:Number = 500;
    var target:MovieClip;
    var forceX:Number = 0;
    var forceY:Number = 0;
    var forceDivider:Number = 4;
    
    function main():void
    {
    	spawnMultiple(MAX_PARTICLES, Bat);
    	setParticles();
    	stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    }
    
    function spawnMultiple(total:uint, ParticleClass:*):void
    {
    	var i:int;
    	
    	for (i = total - 1; i > -1; i--)
    		spawnParticle(particlesContainer, ParticleClass);
    }
    
    function spawnParticle(container:DisplayObjectContainer, ParticleClass:*):void
    {
    	var particle = new ParticleClass();
    	
    	particle.x = randomRange(particle.width * 0.5, stage.stageWidth - particle.width * 0.5);
    	particle.y = randomRange(particle.height * 0.5, stage.stageHeight - particle.height * 0.5);
    	container.addChild(particle);
    }
    
    function setParticles():void
    {
    	var i:int;
    	
    	for (i = particlesContainer.numChildren - 1; i > -1; i--)
    	{
    		var child:MovieClip = particlesContainer.getChildAt(i) as MovieClip;
    		
    		child.initialX = child.x;
    		child.initialY = child.y;
    		child.gotoAndPlay(uint(randomRange(1, child.totalFrames - 1)));
    	}
    }
    
    function enterFrameHandler(e:Event):void
    {	
    	var i:int;
    	
    	for (i = particlesContainer.numChildren - 1; i > -1; i--)
    	{
    		var target:MovieClip = particlesContainer.getChildAt(i) as MovieClip;
    		var distanceX:Number = particlesContainer.mouseX - target.x;
    		var distanceY:Number = particlesContainer.mouseY - target.y;
    		var distance:Number = Math.sqrt((distanceX * distanceX) + (distanceY * distanceY));
    		var powerX:Number = target.x - (distanceX / distance) * magnet / distance;
    		var powerY:Number = target.y - (distanceY / distance) * magnet / distance;
    		
    		forceX = (forceX + (target.initialX - target.x) * 0.5) / forceDivider;
    		forceY = (forceY + (target.initialY - target.y) * 0.5) / forceDivider;
    		target.x = powerX + forceX;
    		target.y = powerY + forceY;
    	}
    }
    
    function randomRange(min:Number, max:Number):Number
    {
    	return min + Math.random() * (max - min);
    }
    
    main();

     

    Download / FLA / SWF:
    https://bit.ly/3EfPy1z

     

    I hope it helps.

     

    Regards,

    JC

    Known Participant
    November 9, 2022

    Thank you very much ❤️