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

deepNoise 18.12.2018 05:20

Эффект печати текста
 
Вложений: 1
Нашёл урок по эффекту печати текста на Ютьюбе: https://youtu.be/rjCo0w3u2cg
Помогите усовершенствовать мой исходник.
Мне нужно, чтобы при нажатии клавиши переходило на другой кадр и в поле печатался другой текст.
Я в AS 3.0 плохо разбираюсь, поэтому просто пересоздал функцию и переменные с другими именами(добавил двойку в названия). Может это как то проще можно сделать?
Нужно что то вроде выбора вариантов ответа как в RPG, чтобы при нажатии клавиши A, B, C выбирался определённый вариант ответа и печатался определённый текст.
Так же подскажите, как можно изменить скорость печати текста.

Жень Шень 18.12.2018 17:18

Лучше сделать в одном кадре:
(ждёт нажатия клавиши А,В или С)

Код AS3:

stop();
 
var myStringArray:Array=[];
myStringArray[0]="1 Вариант 1\nПроверка текста\nЕщё проверка текста";
myStringArray[1]="2 Вариант 2\nПроверка текста\nЕщё проверка текста";
myStringArray[2]="3 Вариант 3\nПроверка текста\nЕщё проверка текста";
var myString:String;
var myArray=[];
 
addEventListener(Event.ENTER_FRAME, frameLooper);
 
function frameLooper(event:Event):void {
    if (myArray.length>0) {
        tf.appendText(myArray.shift());
    } else {
        removeEventListener(Event.ENTER_FRAME, frameLooper);
    }
}
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, on_keyDown);
 
function on_keyDown(e:KeyboardEvent):void {
    removeEventListener(Event.ENTER_FRAME, frameLooper);
    if (e.keyCode==65) {//A
        tf.text="";
        myString=myStringArray[0];
    } else if (e.keyCode == 66) {//B
        tf.text="";
        myString=myStringArray[1];
    } else if (e.keyCode == 67) {//C
        tf.text="";
        myString=myStringArray[2];
    }
    if (e.keyCode==65||e.keyCode==66||e.keyCode==67) {
        myArray=myString.split("");
        addEventListener(Event.ENTER_FRAME, frameLooper);
    }
}


deepNoise 18.12.2018 20:48

Спасибо, всё работает)
А что означает строчка tf.text=""; ? Это для того, чтобы сделать поле пустым?

Я заменил A, B, C на 1, 2, 3, чтобы было проще выбирать.
А возможно как то поместить текстовое поле в отдельный клип, разбить там всё по кадрам, и чтобы в каждом кадре был отдельный текст, который должен печататься при переходе на этот кадр? Т.е. чтобы текст для печати брался не из скрипта, а из самого текстового поля.

И возможно ли изменить скорость печати текста?

Жень Шень 18.12.2018 22:03

1.
tf.text=""; - очищает поле перед выводом нового текста, если нажать другую клавишу (А,В,С или как вы переделали 1…3 или вооще другую).
2.
Код AS3:

function on_keyDown(e:KeyboardEvent):void {
      removeEventListener(Event.ENTER_FRAME, frameLooper);

Здесь removeEventListener нужен по той же причине – остановить обработчик события.
3.
Чтобы текст брался из текстового поля «ИмяТекстовогоПоля», достаточно написать:
Код AS3:

myString = ИмяТекстовогоПоля.text;

4.
Чтобы замедлить скорость печать просто уменьшите fps ролика.

deepNoise 19.12.2018 05:07

Цитата:

Чтобы замедлить скорость печать просто уменьшите fps ролика.
А по другому нельзя как нибудь сделать? Например, можно ли как то событие Event.ENTER_FRAME преобразовать в переменную и вычесть из этой переменной какое нибудь значение?
Т.е. можно ли задать переменную, которая будет равна скорости печати? Например её значение может быть скорость fps минус какое нибудь число?

Bletraut 19.12.2018 13:18

Цитата:

А по другому нельзя как нибудь сделать?
Можно, для этого нужно поставить таймер. Переменная delay это скорость печати в миллисекундах

Код AS3:

stop();
 
var myStringArray:Array=[];
myStringArray[0]="1 Вариант 1\nПроверка текста\nЕщё проверка текста";
myStringArray[1]="2 Вариант 2\nПроверка текста\nЕщё проверка текста";
myStringArray[2]="3 Вариант 3\nПроверка текста\nЕщё проверка текста";
var myString:String;
var myArray=[];
 
var delay:int = 500;
var timer1:Timer = new Timer(delay);
timer1.addEventListener("timer", frameLooper);
timer1.start();
 
function frameLooper(event:TimerEvent):void {
    if (myArray.length>0) {
        tf.appendText(myArray.shift());
    } else {
        timer.stop();
    }
}
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, on_keyDown);
 
function on_keyDown(e:KeyboardEvent):void {
    timer1.stop();
    if (e.keyCode==65) {//A
        tf.text="";
        myString=myStringArray[0];
    } else if (e.keyCode == 66) {//B
        tf.text="";
        myString=myStringArray[1];
    } else if (e.keyCode == 67) {//C
        tf.text="";
        myString=myStringArray[2];
    }
    if (e.keyCode==65||e.keyCode==66||e.keyCode==67) {
        myArray=myString.split("");
        timer1.start();
    }
}


deepNoise 19.12.2018 15:27

Вложений: 1
Bletraut У меня почему то не работает. Выдаёт ошибку "Обращение несуществующего свойства timer."
Вы это тестили?

Жень Шень
Цитата:

Чтобы текст брался из текстового поля «ИмяТекстовогоПоля», достаточно написать:

Код AS3:

myString = ИмяТекстовогоПоля.text;


Попробовал сделать вот так:
Код AS3:

stop();
 
var myStringArray:Array=[];
//myStringArray[0]="1 Вариант 1\nПроверка текста\nЕщё проверка текста";
//myStringArray[1]="2 Вариант 2\nПроверка текста\nЕщё проверка текста";
//myStringArray[2]="3 Вариант 3\nПроверка текста\nЕщё проверка текста";
var myString:String;
var myArray=[];
 
addEventListener(Event.ENTER_FRAME, frameLooper);
 
function frameLooper(event:Event):void {
    if (myArray.length>0) {
        dialogs.tf.appendText(myArray.shift());
    } else {
        removeEventListener(Event.ENTER_FRAME, frameLooper);
    }
}
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, on_keyDown);
 
function on_keyDown(e:KeyboardEvent):void {
    removeEventListener(Event.ENTER_FRAME, frameLooper);
    if (e.keyCode==49) {//1
            dialogs.gotoAndStop(1);
        dialogs.tf.text="";
        myString=dialogs.tf.text;
    } else if (e.keyCode == 50) {//2
            dialogs.gotoAndStop(2);
        dialogs.tf.text="";
        myString=myStringArray[1];
    } else if (e.keyCode == 51) {//3
            dialogs.gotoAndStop(3);
        dialogs.tf.text="";
        myString=dialogs.tf.text;
    }
    if (e.keyCode==49||e.keyCode==50||e.keyCode==51) {
        myArray=myString.split("");
        addEventListener(Event.ENTER_FRAME, frameLooper);
    }
        trace("Код нажатой клавиши: " + e.keyCode);
}

Почему то не работает. Что нужно исправить?

Жень Шень 19.12.2018 23:56

Вложений: 1
textTypingEffect - пример с ENTER_FRAME.
textTypingEffect2 - пример с таймером.
Не понял, для чего брать текст с кадров клипа и печатать в режиме машинки в другое текстовое поле.
В примерах просто показал как брать с текстового поля и "посылать на печать" в другое текстовое поле.
Советую чётко продумать структуры своего шедевра: цель, последовательность действий программы и пользователя, итог работы кода и т.д.
Успеха.

deepNoise 20.12.2018 01:57

Цитата:

Не понял, для чего брать текст с кадров клипа и печатать в режиме машинки в другое текстовое поле.
Я хотел не с одного поля в другое, а просто одно поле, в которое напечатать текст вручную в исходнике, и он появится с эффектом печати при запуске мувика) В поле печатать, чтобы было нагляднее, сразу был виден результат.
Хотя и так тоже сойдёт, просто можно поле из которого берётся текст за экран поставить.
А для чего можно использовать: можно сделать просто тест с эффектом печати, или интерактивную новеллу, или RPG с диалогами, да много чего)

Последний вопрос: переменная delay ведь отвечает за скорость? Я пытался изменить её для установления скорости печати для каждого варианта, но скорость почему то не меняется.

Код AS3:

stop();
var myString:String;
var myArray=[];
var delay:int = 100; //typing speed
var timer1:Timer = new Timer(delay);
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, on_keyDown);
timer1.addEventListener("timer", frameLooper);
 
timer1.start();
 
function frameLooper(event:TimerEvent):void {
    if (myArray.length>0) {
        answer_tf.appendText(myArray.shift());
    } else {
        timer1.stop();
    }
}
 
function on_keyDown(e:KeyboardEvent):void {
        timer1.stop();
    if (e.keyCode==49) {//1
            delay = 10;
            dialogs.gotoAndStop(1);
        answer_tf.text="";
        myString=dialogs.tf.text;
    } else if (e.keyCode == 50) {//2
            delay = 50;
            dialogs.gotoAndStop(2);
        answer_tf.text="";
        myString=dialogs.tf.text;
    } else if (e.keyCode == 51) {//3
            delay = 100;
            dialogs.gotoAndStop(3);
        answer_tf.text="";
        myString=dialogs.tf.text;
    }
    if (e.keyCode==49||e.keyCode==50||e.keyCode==51) {
        myArray=myString.split("");
        timer1.start();
 
    }
}


Swer 20.12.2018 11:36

Код AS3:

if (e.keyCode==49||e.keyCode==50||e.keyCode==51) {
        myArray=myString.split("");
        timer1.delay = delay;
        timer1.start();
 
 }



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

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