Просмотр полной версии : Не работает 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 () в первом и втором классах. Поможите, люди добрые.
интересные грабли :
получается, что в createEnemy ты пересоздаешь свойство enemy = new Enemy(_mc);, что при этом происходит с ранее созданными объектами не вполне понятно.., видимо они уходят в небытие..
если создавать новые без привязки к enemy, то все работает
private function createEnemy ():Void {
enemyArr.push( new Enemy(_mc));
}
зы:
или по другому:
если оставить LevelOne как есть, а в конструкторе Enemy сохранять ссылку на созданный объект (в статическом массиве, например), то тоже все работает
что при этом происходит со старыми не вполне понятно..В follow () поставить трейс и узнать :)
ага, не выйдет: follow не вызывается.., точнее вызывается только для последнего созданного объекта..
так думаю:
в setInterval (this, "follow", 100); this - это scope вызываемой функции, а поскольку this всех создаваемых объектов в результате смотрят на один и тот же enemy экземпляра LevelOne, то и имеем этот бардак..
В целом автор ошибся, ему нужно завести массив в котором хранить созданных Enemy, а не создавать свойство для одного.
Волгоградец
09.04.2008, 13:13
Гм... А почему же, если использовать onEnterFrame (), то все отлично работает???
P.S.: а вообще я очень польщен - мне помогают два флэш-монстра. Спасибо.
Потому, что onEnterFrame вешается на мувиклип.
Волгоградец
09.04.2008, 13:52
Понятно. Еще вопрос, если позволите: можно именам экземпляра давать имена по типу задания имен клипам this["mc"+i]
Чтобы было что-то вроде var this["inst"+i]:ClassA = new ClassA ();
Для динамических имен нельзя использовать ни 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, что так подробно объяснил.
Я работаю в NotePad :cool: .За что вы себя так не любите?
Fernando Costa
09.04.2008, 15:43
... суровые московские флешеры
Волгоградец
09.04.2008, 16:06
За что вы себя так не любите?
Давай на "ты" - не такие уж мы и старые. Я к сожалению не флэшер. На работе Flash, FD и др. установить невозможно, в свободную минуту пишу код, дома тестирую.
... суровые московские флешеры
... а я из Волгограда
Устанавливать FD не надо, его можно установить дома, а потом скопировать на флешку и на работу:D, главное чтобы был .net 2.0
Волгоградец
09.04.2008, 17:47
Ого, круто! А что такое .net 2.0 и как узнать, есть ли он?
Волгоградец, а ты скачай 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 (), хотя многие утверждают что оно есть. Так что не для всех проектов видать подходит эта схема.
и стало намного хуже - тормозит сильнее, причем как-то странно тормозит - волнообразно - то слабо, то сильно. Я не увидел преимущества setInterval () перед onEnterFrame (), хотя многие утверждают что оно есть.Да, есть такие, кто заявляют такое, без объяснения ньюансов.
onEnterFrame начинает проигрывать setInterval, когда у вас несколько тысяч мувиклипов на него подписаны.
А так, setInterval действует асинхронно фпс, поэтому визуальное обновление будет происходить не сразу, а только после того как сменится ближайщий после setInterval кадр, поэтому плавность анимации страдает.
Чтобы это обойти, используют updateAfterEvent, что в свою очередь начинает накладывать дополнительную нагрузку, что опять же приводит к тормозам.
setInterval хорош для несвязанных с фпс действий или небольших одиночных анимаций с более высоким обновлением экрана, чем фпс ролика.
Волгоградец
10.04.2008, 13:28
О! Интересно. Спасибо за ценную информацию.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.