PDA

Просмотр полной версии : Присваивание одного метода многим объектам.


Dr.XxX
31.05.2008, 13:49
У меня есть класс:
class Car extends MovieClip {
var CarSize:Number = 150-random(100);
var CarSpeed:Number = 10-random(5);
private var _Car:MovieClip;
public function Car(Car:MovieClip) {
_Car = Car;
}
public function moveCar() {
_Car._xscale = CarSize;
_Car._yscale = CarSize;
_Car._x += CarSpeed;
}
}

В .fla файле пишу:
honda = attachMovie("honda", "honda"+_root.getNextHighestDepth(), _root.getNextHighestDepth());
var honda:Car = new Car(honda);
_root.onEnterFrame = function() {
honda.moveCar();
};


Всё работает, как надо, но а если я хочу сделать 20 мувиклипов honda и всем им присвоить honda.moveCar();.
То единственный вариант это двадцать раз атачить honda,honda1,honda2 в ручную и каждому присваивать honda1.moveCar();,honda2.moveCar(); ?

Или можно сделать как-то по короче ? :confused:

Alex_beginner
31.05.2008, 13:55
А с помощью broadcastMessage() пробовали?

двадцать раз атачить honda,honda1,honda2 в ручную

Это как? Поясните. У Вас вроде бы символ аттачится программно.

iNils
31.05.2008, 15:59
Идете в библиотеку, ищите там символ honda, и под полем где писали honda, пишите Car.
Сам класс модифицируете так:
class Car extends MovieClip {
private var onEnterFrame:Function;
private var carSize:Number = null;
private var carSpeed:Number = null;

public function Car() {
carSize = 150 - Math.random () * 100;
carSpeed = 10 - Math.random () * 5;
}

public function runCar ():Void {
onEnterFrame = onMoveCar;
}
public function stopCar ():Void {
delete onEnterFrame;
}

private function onMoveCar ():Void {
_xscale = carSize;
_yscale = carSize;
_x += carSpeed;
}
}
Заметьте:
1. С большой буквый пишут только названия классов интерфейсы, и методы и свойства с маленькой
2. В AS2 задавать дефолтный свойства можно только в конструкторе или методах. Ни в коем случаие не делайте этого при объявлении самих свойств. Иначе все будут иметь одинаковое значение. Это баг AS2.

Вопрос: зачем задавать размер машине, при каждом вызове onEnterFrame?

Теперь сам вызов
for (var i:Number = 0; i < 20; i++) {
var d:Number = +this.getNextHighestDepth ();
var honda:Honda = Honda (this.attachMovie ("honda", "honda" + d, d));
honda.moveCar ();
}

Alex_beginner
31.05.2008, 16:02
iNils! При всем уважении, Вы забыли new:

var honda:Honda = Honda (this.attachMovie ("honda", "honda" + d, d));

iNils
31.05.2008, 16:04
Не забыл. Мувиклипы не создаются через new, это делает attachMovie. А то что я написал Honda, так это приведение типа для автокомплита.

Alex_beginner
31.05.2008, 16:05
Понял. Надо было мне с самого начала читать.

iNils! А с помощью broadcastMessage() можно организовать вызов метода moveCar всех клипов? Или это невозможно?

iNils
31.05.2008, 16:29
Можно конечно, но схема более сложная получится. Если машине не двигается, то рассылка все равно будет идти, надо будет создавать флаг состояния, проверять его.
Не вижу смысла тут это использовать.

Alex_beginner
31.05.2008, 16:34
Понял. Нецелесообразно.

Dr.XxX
31.05.2008, 23:52
Спасибо, работает.

Только вы наверное имели ввиду тут :
for (var i:Number = 0; i < 20; i++) {
var d:Number = +this.getNextHighestDepth ();
var honda:Honda = Honda (this.attachMovie ("honda", "honda" + d, d));
honda.moveCar ();
}

не honda.moveCar(); , а honda.runCar();

И ещё вопрос, не могли бы сказать зачем эта строчка :
var d:Number = +this.getNextHighestDepth ();
Если вроде можно записать так:
var honda:Honda = Honda (this.attachMovie ("honda", "honda" + _root.getNextHighestDepth(), _root.getNextHighestDepth());

iNils
31.05.2008, 23:55
Про runCar верно, писал в блокноте.

Про var d:Number, лучше один раз определить переменную, что нескольраз ее вычислять и код так легче читается.