Форум 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=204928)

General303 14.11.2013 12:40

Проблема с классом бегущей строки
 
Вложений: 1
Приветствую.
В AS не особо силен но кое что умею. Есть задача, в баннер встроить бегущую строку которая берет текст из XML файла. Нашел идеально подходящий для моих целей класс бегущей строки Marquesina.as. Подключил, настроил. Но есть проблема. Задержка после окончания порядка 9-10 секунд. В классе есть таймеры но чтобы я не менял в них время от этого не уменьшается.
Как уменьшить этот интервал до 1 секунды или даже 0. То есть текст ушел и все по новой?
Пример в архиве. Заранее благодарю за ответ.

samana 14.11.2013 14:41

Строка 69
Код AS3:

_timer1 = new Timer(5000);

// 5000 это 5 секунд

General303 14.11.2013 14:53

Цитата:

Сообщение от samana (Сообщение 1152352)
Строка 69
Код AS3:

_timer1 = new Timer(5000);

// 5000 это 5 секунд

Я знаю. Но проблема не в этом. После того, как текст прошел с права на лева, идет определенный промежуток времени, от 5 до 10 секунд и только после начинается повтор. Временной промежуток зависит от количества текста во второй строке fla файла
Код AS3:

var m:Marquesina = new Marquesina("Text",13,420,30,0x000000);

То есть, чем больше текста, тем больше временной промежуток.
P.S Возможно этот метод реализации бегущей строки очень извращенный и есть более простое программное решение. Если есть, подскажите пожалуйста :)

Akopalipsis 14.11.2013 15:01

Цитата:

P.S Возможно этот метод очень извращенный и есть более простое программное решение.
Создаёте обычное текстовое поле, узнаёте ширину контейнера в котором он будет отображаться.
Присвоив текст созданному текстовому полю, узнаёте его ширину и отрезаете с конца символы равные ширине контейнера. Создаете второе текстовое поле и переносите туда вырезанный текст.
Узнаете ещё раз ширину первого текстового поля. Начинаете на EnterFrame двигать первое текстовое поле и в проверяете не подошёл ли он к концу. Как только подошёл, запускаете второе текстовое поле и тоже проверяете когда он подойдет к концу. как только подошёл, запускаете первое текстовое поле.
И получится, что строка будет повторятся всегда. Это не сложно даже для новичка и к тому же очень интересно.

samana 14.11.2013 15:32

Этот класс не будет запускать анимацию строки заново, если она полностью вмещается в заданные вами пределы (третий параметр в конструкторе).
Чтобы избавиться от этого, нужно избавиться от условия
Код AS3:

if (_cajaTexto.width > _mascara.width)
{
        //timers para animación del texto
        _timer1.addEventListener(TimerEvent.TIMER,onTimer1);
        _timer2.addEventListener(TimerEvent.TIMER,onTimer2);
}

И сделать просто так
Код AS3:

_timer1.addEventListener(TimerEvent.TIMER,onTimer1);
_timer2.addEventListener(TimerEvent.TIMER,onTimer2);


Akopalipsis 14.11.2013 15:34

Примерно вот так -
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        var _ticket:Ticket = new Ticket('P.S Возможно этот метод очень извращенный и есть более простое программное решение. Если есть, подскажите пожалуйста');
                        addChild(_ticket);
                }
 
        }
 
}

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
 
        public class Ticket extends Sprite
        {
                private var _text:String;
 
                private var _textOne:TextField;
                private var _textTwo:TextField;
 
                private var _containerWidth:int;
                private var _nextText:int;
 
                private var _speedOne:int ;
                private var _speedTwo:int;
 
                private var _isEndOne:Boolean;
                private var _isEndTwo:Boolean;
                private var _end:int;
 
                public function Ticket(text:String)
                {
                        _text = text;
                        addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
                }
 
                private function addedToStageHandler(event:Event):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
 
                        _containerWidth = 150;
 
                        _textOne = new TextField();
                        _textOne.autoSize = 'left';
                        _textOne.text = _text;
                        addChild(_textOne)
 
                        _speedOne = 2;
 
                        _textTwo = new TextField();
                        _textTwo.autoSize = 'left';
                        _textTwo.text = _text;
                        _textTwo.x = _containerWidth;
                        addChild(_textTwo)
 
                        _speedTwo = 0;
 
                        _nextText = _containerWidth - _textOne.width;
                        _end = -_textOne.width;
                }
 
                private function enterFrameHandler(event:Event):void
                {
                        if (_textOne.x <= _nextText)
                        {
                                _isEndOne = true;
                                _speedTwo = 2;
                        }
                        if (_textTwo.x <= _nextText)
                        {
                                _isEndTwo = true;
                                _speedOne = 2;
                        }
                        if (_isEndOne)
                        {
                                if (_textOne.x <= _end)
                                {
                                        _speedOne = 0;
                                        _textOne.x = _containerWidth;
                                        _isEndOne = false;
                                }
                        }
                        if (_isEndTwo)
                        {
                                if (_textTwo.x <= _end)
                                {
                                        _speedTwo = 0;
                                        _textTwo.x = _containerWidth;
                                        _isEndTwo = false;
                                }
                        }
                        _textOne.x -= _speedOne;
                        _textTwo.x -= _speedTwo;
                }
 
        }
 
}


samana 14.11.2013 15:41

Akopalipsis, что-то при запуске вашего класса, моя заданная строка отобразилась 2 раза рядом, а потом ещё и третья в конце. Только после этого, цикл начал воспроизводиться нормально.

Akopalipsis 14.11.2013 15:50

Вложений: 1
samana Спасибо Огромное! Если бы не Вы, возможно я бы ТС свёл сума :)
У меня ошибка в
Код AS3:

if (_textOne.x <= _end)

Скопировал, а поменять на второе поле забыл, сейчас исправлю.

Двигается, только у меня начало координат в ноль, а на форуме флеш растянулась.
Но это уже ТС сделает как хочет.
row.swf   (1.8 Кб)

General303 14.11.2013 16:01

Всем большое спасибо за ответы :)


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

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