Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ENTER_FRAME лучше один или много? (http://www.flasher.ru/forum/showthread.php?t=168997)

flax4Noob 26.09.2011 16:26

ENTER_FRAME лучше один или много?
 
Вот маюсь вопросом. Есть поле крестики-нолики. Каждая клетка extends Sprite. В каждой клетке может быть Спрайт крестика или нолика или нифигалика. Спрайты анимируются програмно (для этого есть метод Draw каждому спрайтику, и в нем я считаю сколько прошло секунд с момента последней отрисовки и рисую его в нужном мне виде)

Вопрос в том - как этот метод лучше (оптимальнее) вызывать. Есть решения.
1 addEventListener(Event.ENTER_FRAME, одна_большая_функция_с_циклом_по_всем_клеткам)
2 каждая_клетка.addEventListener(Event.ENTER_FRAME, функция_отрисовки_своего_содержимого)
3 ???

Нужно сразу реализовать метод, который не отвалится, если придется увеличивать количество клеток, и количество спрайтов в каждой клетке. (анимированый фон, или что-то еще)

Таймерами, как я понимаю, в АС3 не принято пользоваться. Раскуриваю програмную анимацию вторые сутки. Не пиннать сильно!

Vansimar 26.09.2011 16:30

я бы делал один EnterFrame для всего поля

Inet_PC 26.09.2011 16:33

Я тоже за один EnterFrame для всего поля, иначе для каждой клетки будет создаваться свой Event, что отрицательно скажется на производительности.

goodguy 26.09.2011 17:11

Достаточно было вбить в гугл. Этот вопрос относится вообще к разряду тривиальных.
Конечно нужно использовать один слушатель.

flax4Noob 26.09.2011 17:33

А как-то можно сделать чтобы событие не генерилось пока я его не обработаю? Флешка успешно "дохнет" где-то через минуту. Хотя там всего-то 200 клеточек и в одной из них стоит нолик с анимацией =/ Однака тормоза такие, что жуть. На всякий случай кусочки кода.

Код AS3:

function animateAll(e:Event):void{
                        var i:uint;
                        var j:uint;
                        for ( i=0; i < Width; i++) {
                                for ( j=0; j < Height; j++) {
                                        cells[i][j].doAnimation();
                                }
                        }
 
                }

В каждой клетке может быть несколько Анимационных объектов, поэтому там тоже цикл.

Код AS3:

public function doAnimation():void{
 
                        //-- цикл по всем объектам.
                        for (var index:* in zObjects) {
                                //-- это чо-та не работает, поэтому я тупо убрал не-анимационный мусор пока что для теста.
                                //if (zObjects[index] is AnimatedObject){
                                        zObjects[index].draw();
                                //}       
                        }
 
                }

И код для единственного объекта на этом поле:

Код AS3:

public function draw():void{
 
                        var lt:uint = getTimer();
                        var delta:uint = lt-lastUpdate;
                        if(delta>timePerFrame){
                                var rest:uint=delta % timePerFrame; //--остаток от деления, мы его сохраняем.
                                var framesPass:uint=(delta-rest)/timePerFrame; //-- сколько кадров надо было отрисовать за это время.
                                lastUpdate = lt-rest;//--остаток, который не посчитали учитываем при подсчете в следующий раз.
 
                                if (framesPass>0){
 
                                        frame = frame+framesPass;
                                        while  (frame>framesCount){
                                                frame = frame-framesCount
                                        }
 
 
                                        var n:Graphics = this.graphics;
                                        // рисуем круг.
                                        n.beginFill(0x0000EE,1);
                                        n.lineStyle(1, 0x111111);
                                        n.drawCircle(0, 0, 5);
                                        //-- рисуем линию, которая "бегает" вниз. Вполне смотрибельно для теста.
                                        n.lineStyle(1, 0x00EEEE);
                                        n.moveTo(-5,frame-5)
                                        n.lineTo(5,frame-5);
 
                                }
                        }
 
                }

Вроде как все нормуль, кружок, линия бегает вниз. Анимация... но секунд через 40 все плавно переходит в "слоу-мошн" и в дельнейшем на клики флешка реагирует очень вяло.

Добавлено через 5 минут
Цитата:

Сообщение от flax4Noob (Сообщение 1034937)
Код AS3:

 
                                        frame = frame+framesPass;
                                        while  (frame>framesCount){
                                                frame = frame-framesCount
                                        }


Не ржать :) Забыл я про "%" в суете этой с анимацией...

Добавлено через 20 минут
Все пучком, забыл graphics очистить в анимации перед перерисовкой круга и линии. Прошу пардона. Спешим-с.... =/

Всем спасибо.


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

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