Форум Flasher.ru

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

australian incognito 18.06.2014 14:28

Бегущая строка (смещением х координаты текстового поля) дергается. Как исправить?
 
Есть код для бегущей строки (все примитивно, просто смещаем х-координату текстового поля под маской:
Код AS3:

private var runTimer:Timer;
runTimer = new Timer(60, 0);
runTimer.addEventListener(TimerEvent.TIMER, runTmrHandler);
private function runTmrHandler(e:TimerEvent)
                {
                        if(item6.t0_txt.text != "")
                        {
                                if(item6.t0_txt.x > 5 - item6.t0_txt.width)
                                {
                                        item6.t0_txt.x -= 6;
                                }
                                else
                                {
                                        item6.t0_txt.x = 600;
                                }
                        }
                        else
                        {
                                item6.t0_txt.x = 600;
                        }
                }

При таком исполнении видно, что при движении текста он слегка подергивается и если его ускорять - дерганья становятся более явными. На текстовом поле поставил сглаживание для анимации.

Есть идеи, как можно решить такую проблему?

ZackMercury 18.06.2014 14:55

Есть идея. Можно двигать не по таймеру, а по ENTER_FRAME и двигать относительно дельты.

australian incognito 18.06.2014 15:12

Цитата:

Сообщение от SuriTheAngel (Сообщение 1167984)
Есть идея. Можно двигать не по таймеру, а по ENTER_FRAME и двигать относительно дельты.

Увы, результат такой же.

FlasherEgor 18.06.2014 15:24

Может быть, так: сам текст не добавлять в Display List, а вместо него добавлять какую-то Bitmap, в bitmapData которой методом draw() рисовать ваш текст?

australian incognito 18.06.2014 15:26

Цитата:

Сообщение от FlasherEgor (Сообщение 1167986)
Может быть, так: сам текст не добавлять в Display List, а вместо него добавлять какую-то Bitmap, в bitmapData которой методом draw() рисовать ваш текст?

Пробовал, но тоже плохо.

LifeIsRhythm 18.06.2014 16:06

Цитата:

Увы, результат такой же.
Значит Вы не правильно сделали! Потому что это единственный рабочий способ.

samana 18.06.2014 16:08

Таймер тут явно не нужен, SuriTheAngel очень прав. Ведь таймер у вас на 60 миллисекунд. И допустим флеш ролик у вас на 30 fps (33,3333.... мс). Рендер кадра происходит по ентерФрейм, каждые ~33 мс, а таймер обновляет позицию текста лишь каждые 60 мсек. Значит текстовое поле двигается примерно через кадр и то не стабильно.
Проверил у себя сделать с ентерФреймом, и текст двигается очень хорошо, плавно, даже без дельты.

ZackMercury 18.06.2014 16:57

Таймер кроме того ещё и ведёт себя неадекватно. Например, тормозится при потере фокуса окна с флешкой или затормаживается на дополнительные миллисекунды вместе с торможениями системы.

nubideus 18.06.2014 17:35

samana, таймер ведь синхронизируется с enterframe.

но все равно, событие enterframe - то, что максимально приблизит к вертикальной синхронизации(vsync).

если проблема именно в vsync, то ничего не поделать. в некоторых версиях плеера все нормально, в некоторых нет. вот например у меня сейчас 14,0,0,125 - есть лаги(дергания эти).
если пытаться решать проблему, то как минимум надо лезть в stage3d

samana 18.06.2014 18:30

Цитата:

Сообщение от nubideus (Сообщение 1167998)
samana, таймер ведь синхронизируется с enterframe.

Но рендер кадра всё равно происходит только с частотой текущего fps. Лучше приведу наглядный пример, что я имею ввиду.
Код AS3:

var timer:Timer = new Timer(60);
timer.addEventListener(TimerEvent.TIMER, timer_timer);
timer.start();
 
addEventListener(Event.ENTER_FRAME, enterFrame);
 
private function timer_timer(e:TimerEvent):void
{
        tf.x -= 6;
}
 
private function enterFrame(e:Event):void
{
        trace("enterFrame, tf переместился на ", tf.x-tfX, " px");
        tfX = tf.x;
}

trace
Код AS3:

enterFrame, tf переместился на  -6  px
enterFrame, tf переместился на  0  px
enterFrame, tf переместился на  -6  px
enterFrame, tf переместился на  0  px
enterFrame, tf переместился на  0  px
enterFrame, tf переместился на  -6  px
enterFrame, tf переместился на  0  px
enterFrame, tf переместился на  -6  px
enterFrame, tf переместился на  -6  px
enterFrame, tf переместился на  0  px
enterFrame, tf переместился на  -6  px
enterFrame, tf переместился на  0  px
enterFrame, tf переместился на  -6  px
enterFrame, tf переместился на  0  px

Из этого видно, что за кадр, текстовое поле перемещается с непостоянной скоростью.


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

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