Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Присваивание одного метода многим объектам. (http://www.flasher.ru/forum/showthread.php?t=112545)

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, лучше один раз определить переменную, что нескольраз ее вычислять и код так легче читается.


Часовой пояс GMT +4, время: 23:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.