PDA

Просмотр полной версии : Не работает setInterval () в классе


Волгоградец
09.04.2008, 10:43
Здравствуйте! Написал игрушку, но она малость подтормаживает - использовал много 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
что при этом происходит со старыми не вполне понятно..В 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
Если вы работаете в FD...
Я работаю в NotePad :cool: .

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

iNils
09.04.2008, 15:39
Я работаю в NotePad :cool: .За что вы себя так не любите?

Fernando Costa
09.04.2008, 15:43
... суровые московские флешеры

Волгоградец
09.04.2008, 16:06
За что вы себя так не любите?
Давай на "ты" - не такие уж мы и старые. Я к сожалению не флэшер. На работе Flash, FD и др. установить невозможно, в свободную минуту пишу код, дома тестирую.
... суровые московские флешеры
... а я из Волгограда

iNils
09.04.2008, 17:35
Устанавливать FD не надо, его можно установить дома, а потом скопировать на флешку и на работу:D, главное чтобы был .net 2.0

Волгоградец
09.04.2008, 17:47
Ого, круто! А что такое .net 2.0 и как узнать, есть ли он?

bbexp
09.04.2008, 18:02
Волгоградец, а ты скачай FD
http://www.flashdevelop.org/community/viewtopic.php?t=2574
- начни ставить - если нет Net2.0 - сразу поймешь ))
Сам NEt2.0 также можно скачать совершенно спокойно по первому же запросу в том же гугле.
http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&displaylang=en
А FD настоятельно рекомендую - для работы с классами - самое то - облегчает разработку весьма серьезно.
К тому же он бесплатный в отличие от того же FDT (правда менее мощный,Я полагаю, но уж конечно лучше FLASH IDE и тем более ноутпада)

Волгоградец
09.04.2008, 18:20
Спасибо всем. Сегодня попробую.

Волгоградец
10.04.2008, 10:18
Вобщем переделал все на setInterval () и стало намного хуже - тормозит сильнее, причем как-то странно тормозит - волнообразно - то слабо, то сильно. Я не увидел преимущества setInterval () перед onEnterFrame (), хотя многие утверждают что оно есть. Так что не для всех проектов видать подходит эта схема.

iNils
10.04.2008, 12:58
и стало намного хуже - тормозит сильнее, причем как-то странно тормозит - волнообразно - то слабо, то сильно. Я не увидел преимущества setInterval () перед onEnterFrame (), хотя многие утверждают что оно есть.Да, есть такие, кто заявляют такое, без объяснения ньюансов.

onEnterFrame начинает проигрывать setInterval, когда у вас несколько тысяч мувиклипов на него подписаны.

А так, setInterval действует асинхронно фпс, поэтому визуальное обновление будет происходить не сразу, а только после того как сменится ближайщий после setInterval кадр, поэтому плавность анимации страдает.

Чтобы это обойти, используют updateAfterEvent, что в свою очередь начинает накладывать дополнительную нагрузку, что опять же приводит к тормозам.

setInterval хорош для несвязанных с фпс действий или небольших одиночных анимаций с более высоким обновлением экрана, чем фпс ролика.

Волгоградец
10.04.2008, 13:28
О! Интересно. Спасибо за ценную информацию.