Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Эффект набора текста (http://www.flasher.ru/forum/showthread.php?t=113488)

BBOY Ильич 30.06.2008 19:44

Эффект набора текста
 
Здравствуйте уважаемые флешеры! Не знаю точно, как назвать эту тему, поэтому боюсь в ответ услышать
"Название темы не отражает сути вопроса."

Суть такая. Я сделал небольшой эффект набирающегося текста. Разместил его в классе (моя первая работа с классами :) ). Все работает как надо. Но! Если не дожидаясь окончания эффекта, снова запустить его, получается что-то не очень хорошее.
Прошу помощи.

Вот пример класса:
Код:

class RandLetters {
        static function randLetter(string:String,tf:TextField,speed:Number,numberOfChars:Number) {
                var alp:String="a b c d e f g h u j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0";
                var delay:Number=0;
                var alph:Array=alp.split(" ");
                var arr:Array=[];
                var currChar:Number=0;
                var randInt,randLett,i,rand;
                createArr();
                randInt=setInterval(randLetters,speed);
                function createArr() {
                        for (i=0; i < string.length; i++) {
                                if (string.substr(i,1) != String.fromCharCode(13)) {
                                        arr.push(string.substr(i,1));
                                }
                        }
                }
                function randLetters() {
                        rand=random(alph.length);
                        randLett=alph[rand];
                        tf.text=tf.text.substr(0,tf.text.length - 1) + randLett;
                        delay == numberOfChars?stopRand():delay++;
                }
                function stopRand() {
                        tf.text=tf.text.substr(0,tf.text.length - 1) + arr[currChar] + " ";
                        currChar < arr.length - 1?currChar++:clearInterval(randInt);
                        delay=0;
                }
        }
}


Alex_beginner 30.06.2008 21:22

Здравствуйте ВВОY Ильич!

Начнем с общих вопросов:

1. Что должен делать класс?
2. На сколько я понимаю, экземпляры класса создавать ненужно, т.е. он у Вас будет как Math.
3. Зачем парсить строку на предмет создания массива, когда можно сразу создать массив:
Цитата:

Код:

var alp:String="a b c d e f g h u j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0";
                var delay:Number=0;
                var alph:Array=alp.split(" ");


4. Не везде произведена типизация переменных. Желательно типизировать - хороший стиль программирования.
5. Не делайте многочисленных вызовов одного и того же:

Цитата:

Код:

string.substr(i,1)

Лучше создайте переменную и один раз вызовите метод substr. Поскольку переменные хранятся в регистрах процессора это может привести к значительной оптимизации производительности.
6. И последнее, самое важное - сделайте класс с конструктором, чтобы можно было создавать несколько экземпляров класса.

Причина такого поведения возможно скрыта в том, что Вы передаете в класс сслыку на объект TextField во время первого выполнения. Код в классе еще не выполнился и значения в tf.text меняются динамически. Потом, недожидаясь окончания работы кода Вы запускаете еще один поток кода. И опять передаете ссылку на объект TextField в класс. Но объект TextField все еще меняется. Т.е. оба кода активно участвуют в изменении tf при этом анализируя значения в нем меняемые друг другом. Возможно, это и есть причина "абракадабры".

BBOY Ильич 02.07.2008 16:22

Здравствуйте, Alex_beginner!
Большое спасибо за ответ. Я с классами раньше дела не имел, поэтому слобо представляю себе, как сделать класс с конструктором.
Понял причину получаемой "абракадабры", но так и не смог понять, как исправить =(

crazyone 02.07.2008 16:33

Это у вас не класс. Это функция засунутая в static-функцию класса.
И это ужасно, я считаю.
Попробуйте посоздавать классы попроще. Разберитесь с методами, аттрибутами, с конструктором и прочими прелестями классов. Вообще, курс ООП желательно начинать с ноля, да.

Ну и по теме - у вас не очищается ранее созданный интервал при вызове функции. Оттого и эффект такой.
Чинить этот класс не стоит, лучше создайте новый, нормальный.

BBOY Ильич 02.07.2008 16:43

Спасибо. Я бы с радостью создал нормальный класс, но не знаю, как он должен выглядеть =) Можно простой примерчик или статейку, где можно было бы поближе познакомится с классами?

crazyone 02.07.2008 17:04

Простой примерчик есть в хелпе. Наберите слово class, выделите его и нажмите F1.

BBOY Ильич 02.07.2008 17:14

сколько ж всего вылезло в хелпе по запросу "class" =) Ладно, ничего, с классами разберемся... Большое Вам спасибо за ответы.

И все-таки мне хочется узнать, как именно мне исправить свой код, чтобы не было этой путаницы. Может ну его, этот внешний .as? Размещу код в самой флешке, да и буду убивать интервал...
Если у кого-нибудь найдется немного времени и желание помочь, напишите пожалуйста "правильную" версию моего недокласса. Хочется посмотреть на то, как должно быть правильно и впредь писать только так =). Буду премного благодарен.

crazyone 02.07.2008 17:29

Я имел ввиду это:
ActionScript 2.0 Language Reference
ActionScript language elements > Statements > class statement

BBOY Ильич 02.07.2008 17:35

Спасибо


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

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