Все работает, однако выводит ошибку. Режим отладки:
ArgumentError: Error #1063: Argument count mismatch on com::Voin(). Expected 2, got 0.
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at com::Battle()[...\com\Battle.as:17]
Невозможно показать исходный код в этом месте.
Battle.as

Код AS1/AS2:
package com
{
import flash.display.MovieClip;
import com.Voin;
public class Battle extends MovieClip
{
private var allyNumber:int = 3;
private var enemyNumber:int = 2;
private var ally:Voin;
private var enemy:Voin;
public var voins:Array = [];//массив воинов
private var _battle:Battle;
var i:int;
public function Battle()
{
stop();
output.text = 'В бой!';
_battle = this;
for (i = 0; i < allyNumber; i++)//создание армии слева
{
ally = new Voin(_battle, 1);//создание воина, передаю ссылку на родителя и номер команды
ally.x = 50 + 100*Math.random();
ally.y = 150 + 150*Math.random();
addChild(ally);
voins.push(ally);
}
for (i = 0; i < enemyNumber; i++)//создание армии справа
{
enemy = new Voin(_battle, 2);//создание воина, передаю ссылку на родителя и номер команды
enemy.rotationY = 180;//зеркально отображаю
enemy.x = 400 + 100*Math.random();
enemy.y = 150 + 150*Math.random();
addChild(enemy);
voins.push(enemy);
}
}
}
}
Voin.as

Код AS1/AS2:
package com
{
import flash.display.MovieClip;
import flash.events.Event;
public class Voin extends MovieClip
{
public var health:int = 50;
private var damage:int = 10;
public var own:int;
private var _battle:Battle;
private var enemy:Voin;
private var finded:Boolean = false;
private var status:String = '';
var i:int;
private var dodamage:Boolean = false;
public function Voin(_b:Battle, _own:int)
{
_battle = _b;
own = _own;//принимаю данные
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
if (health <= 0) health = 0;
this.healthbar.scaleX = health / 50;
if (health <= 0)// нет жизней -> смерть
{
for (i = 0; i < _battle.voins.length; i++)
{
if (this == _battle.voins[i])
{
_battle.output.appendText('\n' + String(own) + ':убит');
status = '';
stop();
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
_battle.voins.splice(i, 1);
_battle.removeChild(this);
break;
}
}
}else if (!finded)// если цели нет
{
search(); // найти ее
} else if (lxy(enemy) > 100)//если есть, но далеко
{
if (status != 'going')
{
status = 'going';
gotoAndPlay(1);
}
gotoEnemy();//идти к ней
} else //если близко
{
if (status != 'fighting')
{
status = 'fighting';
gotoAndPlay(11);
}
fight();//бей ее
}
}
private function search():void
{
var lmin:Number = 1000;
enemy = null;
for (i = 0; i < _battle.voins.length; i++)
{
var candidate:Voin = _battle.voins[i];
if (candidate.own != own)
{
if (lxy(candidate) < lmin)//выбираем ближайшего врага
{
lmin = lxy(candidate);
enemy = candidate;
}
}
}
if (enemy != null)
{
finded = true;//враг найден
} else
{
gotoAndStop(1);//враг не найден - бой окончен
_battle.output.appendText('\n' + String(own) + ':Победа!');
}
}
private function gotoEnemy():void
{
this.x += 2 * (enemy.x - this.x) / lxy(enemy);//2*cos
this.y += 2 * (enemy.y - this.y) / lxy(enemy);//2*sin
}
private function fight():void
{
if(dodamage)//dodamage изменяется в 23 кадре нарисованного воина
{
enemy.health -= damage;
if (enemy.health <= 0)//если враг убит
{
finded = false;
search();//найти следующего
}
dodamage = false;
}
}
private function lxy(enemy:Voin):Number//найти расстояние до врага
{
return Math.sqrt((enemy.x - this.x) * (enemy.x - this.x) + (enemy.y - this.y) * (enemy.y - this.y));
}
}
}