нужна некоторая коррекция эффекта пишущей машинки во вспышке. - PullRequest
0 голосов
/ 20 марта 2012

Я использую эффект машинописи в том смысле, что мне нужно уменьшить скорость печати слов.Я не знаю, как снизить скорость печати содержимого.

Это код

    var format : TextFormat = new TextFormat();
    format.size = 14;
    format.font = "Arial";
    format.bold = true;
    format.color = 0x00000;

    var _textField : TextField = new TextField();
    _textField.width = 400;
    _textField.height = 200;
    _textField.selectable = false;
    _textField.wordWrap = true;
    _textField.defaultTextFormat = format;
    _textField.x = _textField.y =10;
    addChild(_textField);


    var _textLoader:URLLoader = new URLLoader(new URLRequest("text.txt"));
    _textLoader.addEventListener(Event.COMPLETE, Init, false, 0, true);


    function Init(e:Event):void
    {
      var _text = e.target.data; 
      _letters = _text.split('');

      addEventListener(Event.ENTER_FRAME, Write, false, 0, true); 
    }

    function Write(e:Event):void
    {
      if (_counter < _letters.length)
      {
             _textField.appendText(_letters[_counter]); 
             _counter++; 
      }

}

Ответы [ 4 ]

0 голосов
/ 13 ноября 2012

Вы также можете использовать таймеры, как в следующем примере:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TextEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            var textField:TypewriterTextField = new TypewriterTextField();
            textField.autoSize = TextFieldAutoSize.LEFT;
            textField.border = true;
            addChild(textField);

        }// end function

    }// end class

}// end package

import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.utils.Timer;

class TypewriterTextField extends TextField {

    public function TypewriterTextField() {

        this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

    }// end function

    private function onAddedToStage(e:Event):void {

        stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

    }// end function

    private function onKeyUp(e:KeyboardEvent):void {

        e.preventDefault();

        if (stage.focus == this) {

            var char:String = String.fromCharCode(e.charCode);

            if (char.match(/[a-zA-Z0-9\s\n]/) ||  e.charCode == 8) {

                var timer:CustomTimer = new CustomTimer(e.charCode, 500, 1);
                timer.addEventListener(TimerEvent.TIMER, onTimer);
                timer.start();

            }// end if

        }// end if

    }// end function

    private function onTimer(e:TimerEvent):void {

        var customTimer:CustomTimer = e.target as CustomTimer;
        customTimer.removeEventListener(TimerEvent.TIMER, onTimer);

        var charCode:uint = customTimer.object as uint;
        var char:String = String.fromCharCode(charCode);

        if (char.match(/[a-zA-Z0-9\s\n]/)) {

            this.text += char;

        }
        else {

            this.text = this.text.slice(0, -1);

        }// end else if

    }// end function

}// ende class

class CustomTimer extends Timer {

    private var _cbject:Object;

    public function get object():Object {

        return this._cbject;

    }// end function

    public function CustomTimer(object:Object, delay:Number, repeatCount:int = 0) {

        super(delay, repeatCount);

        _cbject = object;

    }// end function

}// end class
0 голосов
/ 20 марта 2012

Прежде всего, я не вижу переменную _counter, объявленную где-либо в коде.Тем не менее, есть несколько способов сделать это медленнее, это одна из возможностей.

Если переменная "_counter" меньше длины строки => добавить букву.

Итак, чтобы сделать это медленнее, вы можете сказать:

Если переменная "_counter" меньше длины строки => подождать 2 секунды, а затем добавить букву.

Выэто можно сделать, например, с помощью функции setInterval:

www.ilike2flash.com / 2009/07 / time-delay-in-actionscript-3.html

так что ваш код будет выглядеть примерно так:

    var _prevCounter = "";
        function Write(e:Event):void
    {
        if (_counter < _letters.length && _counter != _prevCounter)
        {
            setInterval(addLetter, 3000);
            _counter++;
        }
    }

    function addLetter()
    {
        _textField.appendText(_letters[_counter]);
    }

Это не было проверено и может вызвать некоторые ошибки, никогда не копируйте / вставляйте, если вы не понимаете, что вы копируете / вставляете!

Удачи и надеюсь, что это поможет вам на вашем пути!

0 голосов
/ 20 марта 2012

Просто используйте событие Таймер вместо события ENTER_FRAME. Вы можете определить «скорость печати слова» как задержку таймера.

const DELAY_BETWEEN_LETTERS:int = 100; // here you are setting 100 ms between each letter output
var timer:Timer = new Timer(DELAY_BETWEEN_LETTERS);
function Init(e:Event):void
{
  var _text = e.target.data; 
  _letters = _text.split('');

  timer.addEventListener(TimerEvent.TIMER, Write);
  timer.start();
}

function Write(e:TimerEvent):void
{
  if (_counter < _letters.length)
  {
         _textField.appendText(_letters[_counter]); 
         _counter++; 
  }
}
0 голосов
/ 20 марта 2012

Ну, так как вы используете событие EnterFrame, вы можете просто уменьшить FPS SWF, но это, вероятно, не то, что вам нужно, поскольку это уменьшит скорость всего в SWF, а не только печати текстового поля.

В качестве альтернативы вы можете просто поддерживать некоторую переменную счетчика, чтобы отслеживать кадры, и только appendText каждые 10 кадров или около того. Например:

var currFrame:int = 0;
//...
function Write(e:Event):void
{
    currFrame++;//increase the counter
    if(currFrame > 10)
    {//only write a letter every 10 frames
        currFrame = 0;//reset the counter
        if (_counter < _letters.length)
        {
            _textField.appendText(_letters[_counter]); 
            _counter++; 
        }
    }
}

Установите значение «10», чтобы изменить скорость (большее число = медленнее)

...