Форум 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)
-   -   Не работает setInterval () в классе (http://www.flasher.ru/forum/showthread.php?t=110799)

Волгоградец 09.04.2008 10:43

Не работает setInterval () в классе
 
Здравствуйте! Написал игрушку, но она малость подтормаживает - использовал много onEnterFrame (). Хочу все переделать на setInterval (). И вот тут то застрял. Вобщем вот классы:
Код:

class Enemy {

        private var enemy:MovieClip;
        private static var a:Number = 0;
        private var b:Number = null;
        private var _mc:MovieClip;
        private var n:Number;

        public function Enemy (mc:MovieClip, aim:MovieClip){
                _mc = mc;       
                b = a;
                a ++;
                enemy = _mc.attachMovie ("en", "en" + b, _mc.getNextHighestDepth());
                enemy._x = 100;
                gameOnIntervals ();
        }

        private function gameOnIntervals ():Void{
                n = setInterval (this, "follow", 100);
        }

        private function follow ():Void{
                enemy._y += 5;
        }
}

Код:

class LevelOne{

        private var _mc:MovieClip;
        private var interval:Number;
        private var vaweStart:Number;
        private var enemy:Enemy;

        public function LevelOne (mc:MovieClip){
                _mc = mc;
                vaweStart = _global['setTimeout'] (this,'invasion',3000);
        }
       
        private function createEnemy ():Void{
                enemy = new Enemy(_mc);
        }

        private function invasion ():Void{
                interval = setInterval (this, "createEnemy", 1000);
        }
}

Вобщем экземпляр создается, но при появлении следующего предыдущий останавливается, как будто вызываю метод clearInterval (). Чую что конфликтуют вызовы setInterval () в первом и втором классах. Поможите, люди добрые.

silin 09.04.2008 12:23

интересные грабли :
получается, что в createEnemy ты пересоздаешь свойство enemy = new Enemy(_mc);, что при этом происходит с ранее созданными объектами не вполне понятно.., видимо они уходят в небытие..
если создавать новые без привязки к enemy, то все работает
Код:

private function createEnemy ():Void {
        enemyArr.push( new Enemy(_mc));
}

зы:
или по другому:
если оставить LevelOne как есть, а в конструкторе Enemy сохранять ссылку на созданный объект (в статическом массиве, например), то тоже все работает

iNils 09.04.2008 12:38

Цитата:

Сообщение от silin
что при этом происходит со старыми не вполне понятно..

В follow () поставить трейс и узнать :)

silin 09.04.2008 13:02

ага, не выйдет: follow не вызывается.., точнее вызывается только для последнего созданного объекта..
так думаю:
в setInterval (this, "follow", 100); this - это scope вызываемой функции, а поскольку this всех создаваемых объектов в результате смотрят на один и тот же enemy экземпляра LevelOne, то и имеем этот бардак..

iNils 09.04.2008 13:09

В целом автор ошибся, ему нужно завести массив в котором хранить созданных Enemy, а не создавать свойство для одного.

Волгоградец 09.04.2008 13:13

Гм... А почему же, если использовать onEnterFrame (), то все отлично работает???
P.S.: а вообще я очень польщен - мне помогают два флэш-монстра. Спасибо.

iNils 09.04.2008 13:29

Потому, что onEnterFrame вешается на мувиклип.

Волгоградец 09.04.2008 13:52

Понятно. Еще вопрос, если позволите: можно именам экземпляра давать имена по типу задания имен клипам
Код:

this["mc"+i]
Чтобы было что-то вроде
Код:

var this["inst"+i]:ClassA = new ClassA ();

iNils 09.04.2008 14:50

Для динамических имен нельзя использовать ни var, ни типизацию.
Я выше писал о массиве, в который помещается ссылки на создаваемые экземпляры, поэтому конструкции типа this["inst"+i] в классах не нужны, а нужно лишь обратиться к элементу массива. В таком классе
Код:

class A {
        private var __arrayItem:/*ClassA*/Array = null;
        function A () {
                __arrayItem = new Array ();
        }
       
        private function create ():Void {
                __arrayItem.push (new ClassA ());
        }
        private function test ():Void {
                var len:Number = __arrayItem.length;
                for (var i:Number = 0; i < len; i++) {
                        var item:ClassA = __arrayItem[i];
                        trace (item.id);
                }
        }
       
        private function testForFD ():Void {
                var len:Number = __arrayItem.length;
                for (var i:Number = 0; i < len; i++) {
                        trace (__arrayItem[i].id);
                }
        }

}

... для получения автокомплита в методе test используется строчка выделенная белым. Если вы работаете в FD, то там можно воспользоваться и способом выденным синим, однако если обращения к элементу массива внутри цикла многократны, то лучше использовать вариант из test.

Волгоградец 09.04.2008 15:32

Цитата:

Сообщение от iNils
Если вы работаете в FD...

Я работаю в NotePad :cool: .

Спасибо, iNils, что так подробно объяснил.


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

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