Just trying to tackle a problem in the following code. Im trying to make a gauntlet/zombie style game where all the enemies home in on the player.
Ive got the code for the enemies homing in, adopting some old AS2 code from a blog I stumbled upon. However once I start randomising the enemies spawn locations, they all follow the same movement of the first enemy spawned.
If im not mistaken I do believe that I need another loop running so each enemy has its individual path to follow, I just cant quite figure out where though. (Or if im completely wrong on this)
Here is the code (all thats in the library is an enemy movieclip with the class name enemy_mc, and a player movieclip on the stage with the instance name of player)
Thanks in advance
var enemyCount:Number = 0;
var maxEnemies:Number = 50;
var enemyTime:Number = 0;
var enemyReadyTime:Number = 30;
var speed:Number = 1;
var turnRate:Number = .2;
var agroRange:Number = 550;
var moveX:Number = 0;
var moveY:Number = 0;
//speed
var myX:Number = 100;
var myY:Number = 100;
var power = 0.3;
var yspeed = 0;
var xspeed = 0;
var friction = 0.93;
var leftDown:Boolean = false;
var rightDown:Boolean = false;
var upDown:Boolean = false;
var downDown:Boolean = false;
var enemy_container:MovieClip;
stage.addEventListener(Event.ENTER_FRAME, follow);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
enemy_container = new MovieClip;
addChild(enemy_container);
function follow(event:Event) {
addEnemies();
for (var k:uint=0; k < enemy_container.numChildren; k++) {
var en = enemy_container.getChildAt(k);
doFollow(en, player);
}
moveHero();
render();
}
//checking for key presses
function keyPressed(event:KeyboardEvent):void {
var keydown = event.keyCode;
if (keydown == Keyboard.LEFT) {
leftDown = true;
}
if (keydown == Keyboard.RIGHT) {
rightDown = true;
}
if (keydown == Keyboard.UP) {
upDown = true;
}
if (keydown == Keyboard.DOWN) {
downDown = true;
}
}
//checking for key releases
function keyReleased(event:KeyboardEvent):void {
var thisKey:uint = event.keyCode;
if (thisKey == Keyboard.LEFT) {
leftDown = false;
}
if (thisKey == Keyboard.RIGHT) {
rightDown = false;
}
if (thisKey == Keyboard.UP) {
upDown = false;
}
if (thisKey == Keyboard.DOWN) {
downDown = false;
}
}
function moveHero() {
if (leftDown == true) {
xspeed -= power;
}
if (rightDown == true) {
xspeed += power;
}
if (upDown == true) {
yspeed -= power;
}
if (downDown == true) {
yspeed += power;
}
xspeed *= friction;
yspeed *= friction;
myX += xspeed;
myY += yspeed;
}
function doFollow(follower:MovieClip, target:MovieClip) {
//calculate distance between follower and target
var distanceX:Number = target.x-follower.x;
var distanceY:Number = target.y-follower.y;
//get total distance as one number
var distanceTotal = Math.sqrt(distanceX*distanceX+distanceY*distanceY);
//check if target is within agro range
if (distanceTotal <= agroRange) {
//calculate how much to move
var moveDistanceX:Number = turnRate*distanceX/distanceTotal;
var moveDistanceY:Number = turnRate*distanceY/distanceTotal;
//increase current speed
moveX += moveDistanceX;
moveY += moveDistanceY;
//get total move distance
var totalmove = Math.sqrt(moveX*moveX+moveY*moveY);
//apply easing
moveX = speed*moveX/totalmove;
moveY = speed*moveY/totalmove;
//move follower
follower.x += moveX;
follower.y += moveY;
//rotate follower toward target
follower.rotation = 180*Math.atan2(moveY, moveX)/Math.PI;
}
}
function addEnemies() {
if (enemyCount < maxEnemies) {
enemyTime ++;
if (enemyTime >= enemyReadyTime) {
enemyTime = 0;
enemyCount ++;
var enemy:enemy_mc;
enemy = new enemy_mc;
enemy.x = Math.ceil(Math.random()*stage.stageWidth);
enemy.y = Math.ceil(Math.random()*stage.stageHeight);
enemy_container.addChild(enemy);
}
}
}
function render() {
player.y = myY;
player.x = myX;
}