THE BASIC IDEA:
add 5 circles on random locations on stage…
and animate them to random locations on stage without touching each other…
THE PROBLEM:
the code below works perfectly (up to a certain point)…
it succeeds in making the circles animate to random points on stage…
it also succeeds in detecting if once circle comes to close proximity with another circle… only problem is, i dont know what i should do next…
code on main timeline:
var enemyArray:Array = new Array();
var timeToCreateEnemy:Timer;
// set up timer that will fire every 2 seconds, 5 times
timeToCreateEnemy = new Timer(2000, 5)
timeToCreateEnemy.addEventListener(TimerEvent.TIMER, createEnemy);
timeToCreateEnemy.start();
// function that will create an enemy when timer fires
function createEnemy(event:TimerEvent):void
{
var enemyShip:MovieClip = new Enemy();
enemyArray.push(enemyShip); // put this enemy into the array
enemyShip.x = Math.round(Math.random() * stage.stageWidth);
enemyShip.y = Math.round(Math.random() * stage.stageHeight);
addChild(enemyShip);
}
code on Enemy class:
package
{
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
public class Enemy extends MovieClip
{
private var timeToMove:Timer;
private var indexOfThis:int;
private var randomXPosition:Number;
private var randomYPosition:Number;
private var thisSpeed:Number;
private var xDistanceFromOtherEnemy:Number;
private var yDistanceFromOtherEnemy:Number;
private var distanceFromOtherEnemy:Number;
private var moveXTween:Tween;
private var moveYTween:Tween;
private var thisRadius:Number;
public function Enemy()
{
initEnemy();
}
function initEnemy():void
{
// set up some variables
thisSpeed = 200; // speed
thisRadius = this.width; // radius of this enemy
// set up timer that runs the moveEnemy function
timeToMove = new Timer(3000, 1);
timeToMove.addEventListener(TimerEvent.TIMER, moveEnemy);
timeToMove.start();
// add an enterframe event listener
this.addEventListener(Event.ENTER_FRAME, runEnterFrame);
}
function runEnterFrame(event:Event):void
{
// test if enemy is in close proximity with another enemy
if(MovieClip(root).enemyArray.length > 0)
{
for(var i:Number = 0; i < MovieClip(root).enemyArray.length; i++)
{
xDistanceFromOtherEnemy = this.x - MovieClip(root).enemyArray*.x;
yDistanceFromOtherEnemy = this.y - MovieClip(root).enemyArray*.y;
distanceFromOtherEnemy = Math.sqrt( Math.pow(xDistanceFromOtherEnemy, 2) + Math.pow(yDistanceFromOtherEnemy, 2) );
var otherEnemyRadius:Number = MovieClip(root).enemyArray*.width / 2;
if(distanceFromOtherEnemy <= thisRadius + otherEnemyRadius + 10 && MovieClip(root).enemyArray* != this)
{
trace("this enemy is about to collide with another enemy");
// need to put some kind of code here...
/* i already tried:
moveXTween.stop();
moveYTween.stop();
timeToMove.start();
...and i get weird results / errors */
}
}
}
}
// set up a Tween and begin moving
function moveEnemy(event:TimerEvent):void
{
// set a random target position and animate the enemy towards it
randomXPosition = Math.round(Math.random() * stage.stageWidth);
randomYPosition = Math.round(Math.random() * stage.stageHeight);
var dist = Math.sqrt(Math.pow(Math.abs(randomXPosition - this.x),2) + Math.pow(Math.abs(randomYPosition - this.y),2));
var time = dist / thisSpeed;
moveXTween = new Tween(this, "x", None.easeNone, this.x, randomXPosition, time, true);
moveYTween = new Tween(this, "y", None.easeNone, this.y, randomYPosition, time, true);
// set up a listener for when the tween finishes; if so, restart the timer
moveYTween.addEventListener(TweenEvent.MOTION_FINISH, restartTimer);
}
// funtion that restarts timer
function restartTimer(event:TweenEvent):void
{
timeToMove.start();
}
}
}