Вход

Просмотр полной версии : Эффект набора текста


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
Спасибо