Flash AS2 - 对敌人进行分组

时间:2014-01-23 17:56:08

标签: algorithm flash actionscript-2

所以我有一个Flash ActionScript 2代码,可以创建预设数量的敌人,提供敌人统计数据,并让它们随机移动。代码:

//Settings

var mapWidth:Number = 550;
var mapHeight:Number = 400;
var enemiesArray:Array = new Array();
var totalEnemies:Number;
var eClip:MovieClip;

//Math functions
function getdistance(x, y, x1, y1)
{
    run = x1-x;
    rise = y1-y;
    return (hyp(run, rise));
}
function hyp(a, b)
{
    return (Math.sqrt(a*a+b*b));
}
function resetDirection(mc:MovieClip)
{

    mc.roamTime = random(50);
    mc.t = mc.roamTime;
    mc.roamDistance = random(60)+25;
    mc.randomRoamDistanceX = (Math.random()*mc.roamDistance)+mc.xx-(mc.roamDistance/2);
    mc.randomRoamDistanceY = (Math.random()*mc.roamDistance)+mc.yy-(mc.roamDistance/2);
    mc.newRoamDistance = getdistance(mc._x, mc._y, mc.randomRoamDistanceX, mc.randomRoamDistanceY);

    mc.norm = mc.roamSpeed/mc.newRoamDistance;
    mc.finalRoamDistanceX = (mc.randomRoamDistanceX-mc.xx)*mc.norm;
    mc.finalRoamDistanceY = (mc.randomRoamDistanceY-mc.yy)*mc.norm;
}

//function to move enemies
function moveIt(mc:MovieClip)
{
    //reduce roamTime;
    mc.t--;
    //move enemy to new position
    if (getdistance(mc._x, mc._y, mc.randomRoamDistanceX, mc.randomRoamDistanceY)>mc.roamSpeed) {
        mc._x += mc.finalRoamDistanceX;
        mc._y += mc.finalRoamDistanceY;
    }
    //rotate enemy                
    XXXdiff = mc.xx-mc.randomRoamDistanceX;
    YYYdiff = -(mc.yy-mc.randomRoamDistanceY);
    rrradAngle = Math.atan(YYYdiff/XXXdiff);
    if (XXXdiff<0) {
        cccorrFactor = 270;
    } else {
        cccorrFactor = 90;
    }
    //
    mc.ship_mc._rotation = -(rrradAngle*360/(2*Math.PI)+cccorrFactor);

    //check if time to reset, based on roamTime   
    if (mc.t<=0) {
        resetDirection(mc);
    }
}

//
// Generate Enemies
//
// set and save enemy stats
//
// 
// createEnemies(number of enemies you want, movieclip where you want to create the enemies);
//
function createEnemies(amount:Number, targetLocation:MovieClip) {
    trace("createEnemies: "+amount);
    for (var i = 0; i<amount; i++) {
        randomXpos = Math.round(Math.random()*mapWidth);
        randomYpos = Math.round(Math.random()*mapHeight);
        //add new enemy to map
        var newEnemy:MovieClip = targetLocation.attachMovie("enemy1", "enemy1_"+i, targetLocation.getNextHighestDepth());
        enemiesArray.push(newEnemy);
        //
        //set enemy stats
        newEnemy.id = i;
        newEnemy._x = randomXpos;
        newEnemy._y = randomYpos;

        //save x and y position
        newEnemy.xx = newEnemy._x;
        newEnemy.yy = newEnemy._y;
        //
        newEnemy.roamSpeed = 2
        newEnemy.roamTime = random(50);
        newEnemy.roamDistance = random(60)+25;
        newEnemy.t = 0;
        //
        newEnemy.myHealth = 10;
        newEnemy.myName = "Small Scout";
        //
        resetDirection(newEnemy);
        //target enemy
        newEnemy.onPress = function() {
            trace("Enemy: "+this.tName+" "+this.id);
            target_txt.text = this.myName+": "+this.id+" Health: "+this.myHealth;
        };
        newEnemy.onEnterFrame = function() {
            moveIt(this);
        };
    }
}


start_btn.onRelease = function() {
    if (start_txt.text == "Start") {
        //run the create enemies function to start the engine
        createEnemies(box_mc.numberOfEnemies.text, map_mc);

        //hide start button
        start_txt._visible =false;
        this._visible = false;
        box_mc._visible = false;
    }
};

我希望将程序敌人分组(基于萤火虫算法)。我的想法是写循环以定义吸引力,但我不知道如何让我的对象移动到最具吸引力。也许有人会帮我解决这个问题?

1 个答案:

答案 0 :(得分:0)

我更改了这一行:

newEnemy.myHealth = 10;

在此

newEnemy.myHealth = Math.round(random(9)+1);

myHealth将负责吸引力。我尝试使用来自this站点和修改代码的代码来让具有低吸引力的对象跟随具有大吸引力的对象。此外,我想停止算法,当他们在组中时。