Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   частота выполнения по EnterFrame... кратность (http://www.flasher.ru/forum/showthread.php?t=215126)

nelco 24.02.2018 02:28

частота выполнения по EnterFrame... кратность
 
например, есть код, который выполняется 1 раз в 2 кадра
Код AS1/AS2:

 
_delay = 0;
}
 
private function onStartBlinkingOnEnterFrame(e:Event):void
                {
                        _delay ++;
 
                        if (_delay == 2){ // тут код моргания...

т.е. этот код будет каждые 2 кадра вызываться... если поставить _delay == 1, то будет каждый кадр... проблема в том, что каждый кадр - это слишком быстро, а каждые 2 кадра - это слишком медленно. Как сделать, чтобы как будто раз в 1.5 кадра вызывалось? может можно как-нибудь поменять fps самого Sprita, не меняя fps всего Stage?

caseyryan 24.02.2018 10:48

Как раз про твою проблему https://www.youtube.com/watch?v=zr3YuhgpuYg

Если надо что-то выполнять через определенные промежутки времени, используй таймер

nelco 24.02.2018 18:24

таймер до этого стоял... на 45мс, но он глючит (иногда быстрее-медленнее на момент становится), не совсем с одинаковыми промежутками срабатывает... видимо из-за того, что сильно часто. Поменял на EnterFrame - стало равномерно, но теперь не могу подогнать скорость до нужной по EnterFrame... получается, что отдельно у каждого DisplayObjecta нельзя менять скорость кадров?

undefined 24.02.2018 19:11

таймер то тикает равномерно просто флэш скорее всего не успевает обновить экран из-за низкого fps.
Если таймер тикает раз в 45 ms, то fps должен быть не меньше 23(1000/45).А лучше брать с запасом 30+
Цитата:

олучается, что отдельно у каждого DisplayObjecta нельзя менять скорость кадров?
нет конечно, fps задается глобально для всей флэшки.
Вообще завязываться на enterframe дурная практика т.к. в зависимости от нагрузки он может тикать сильно медленнее заявленного fps.

caseyryan 24.02.2018 19:52

Цитата:

Сообщение от nelco (Сообщение 1204344)
таймер до этого стоял... на 45мс, но он глючит (иногда быстрее-медленнее на момент становится), не совсем с одинаковыми промежутками срабатывает... видимо из-за того, что сильно часто. Поменял на EnterFrame - стало равномерно, но теперь не могу подогнать скорость до нужной по EnterFrame... получается, что отдельно у каждого DisplayObjecta нельзя менять скорость кадров?

45 это не слишком часто. У TimerEvent можно вызывать метод updateAfterEvent() в обработчике. Это вынудит флеш плеер перерисовать всю картинку по событию. Тогда все будет работать плавно
Код AS3:

private function onTimer(e:TimerEvent):void {
  e.updateAfterEvent();
}

Цитата:

Вообще завязываться на enterframe дурная практика т.к. в зависимости от нагрузки он может тикать сильно медленнее заявленного fps.
А ты бы какое решение предложил? Во флеше даже таймер зависит от FPS. Поток то один, никуда от этого не денешься.
Завязываться на EnterFrame это не дурная практика, а самая обычная, используемая везде. Единственное, что нужно усорвешенствовать обновление по EnterFrame и добавить замер длительности предыдущего кадра (delta time), и все расчеты производить с учетом этой величины

undefined 24.02.2018 20:16

Цитата:

Сообщение от caseyryan (Сообщение 1204346)
А ты бы какое решение предложил?

Код AS3:

tween=new Tween(null,"",None.easeNone,0,1,0.3,true);
tween.addEventListener(TweenEvent.MOTION_CHANGE,update);
tween.start();
 
private function update(e:TweenEvent):void {
    // обновляем анимацию в зависимости от tween.position
    if (tween.position==1) {
        tween.stop();
        tween.removeEventListener(TweenEvent.MOTION_CHANGE,update);
        tween=null;
    }
}

работает как часы

caseyryan 24.02.2018 20:57

Цитата:

Сообщение от undefined (Сообщение 1204347)
Код AS3:

tween=new Tween(null,"",None.easeNone,0,1,0.3,true);
tween.addEventListener(TweenEvent.MOTION_CHANGE,update);
tween.start();
 
private function update(e:TweenEvent):void {
    // обновляем анимацию в зависимости от tween.position
    if (tween.position==1) {
        tween.stop();
        tween.removeEventListener(TweenEvent.MOTION_CHANGE,update);
        tween=null;
    }
}

работает как часы

Ты полагаешь, что твин не на энтер фрейме работает?

undefined 24.02.2018 21:16

Цитата:

Сообщение от caseyryan (Сообщение 1204348)
Ты полагаешь, что твин не на энтер фрейме работает?

хочешь сказать он втихаря подсовывает что-то на стейдж в надежде что никто его выкидыши не зачистит?

dimarik 25.02.2018 18:36

Привязывайся к прошедшему времени с последнего кадра. Так все делают.

caseyryan 26.02.2018 15:39

Цитата:

Сообщение от undefined (Сообщение 1204349)
хочешь сказать он втихаря подсовывает что-то на стейдж в надежде что никто его выкидыши не зачистит?

Не понял что ты хотел сказать. Зачем ему что-то подсовывать на стейдж? Во флеше всё обновление завязано на кадры. И события проходят тоже в кадрах. Тут и твины и таймеры зависят от FPS. Поэтому delta time это самое верное решение, и не придется городить никаких огородов


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

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