Есть ли способ программно превратить текст в кружок в ActionScript? - PullRequest
1 голос
/ 28 августа 2009

Кто-нибудь здесь придумал элегантный способ взять кусок текста и заставить его обойти край искривленной линии? (в частности, круговой, но я уверен, что как только он следует за линией, форма не имеет значения). Я не могу найти хороший ресурс, как это сделать. Я предполагаю, что мне нужно будет создать отдельные фрагменты роликов для каждого персонажа, а затем повернуть и расположить их, но мне трудно найти способ, как это сделать.

edit: Извините, забыл упомянуть, что текст динамический, очевидно. Меня не интересует, как заставить статический текст ходить по кругу:)

Ответы [ 3 ]

4 голосов
/ 31 августа 2009

Я привел пример с 2 классами, которые пишут по кругу. Чтобы это работало, вам нужно поместить Sprite в вашу библиотеку с именем класса Letter . Это для более простой обработки текста. Буква должна иметь текстовое поле шириной не менее 2 букв с именем экземпляра значение . Текст должен быть центрирован так же, как и само текстовое поле, центрировано по 0,0 координатам спрайта.

Так. DocumentClass.as

package {

    import flash.display.Sprite;

    public class DocumentClass extends Sprite {

        public function DocumentClass () {
            // draw on circle tester

            var c1:CircleText = new CircleText(200, 200, 90, "Hello World - Circle Text", 0.5, -90);
            var c2:CircleText = new CircleText(300, 300, 50, "Hope you like this", 0.6, -90, true);
            var c3:CircleText = new CircleText(420, 200, 50, "By Virusescu", 0.35, -60);

            this.addChild(c1);
            this.addChild(c2);
            this.addChild(c3);


        }

    }


}

Letter.as пакет {

import flash.text.TextField;
import flash.display.Sprite;

public class Letter extends Sprite {

    // public var value:TextField; // defined by IDE

    public function Letter(val:String) {
        this.value.text = val;
    }

}

}

CircleText.as

package {

    import flash.display.Sprite;

    public class CircleText extends Sprite {

        public function CircleText(centerX:Number, centerY:Number, radius:Number, string:String, coverage:Number, startAngle:Number, showCircle:Boolean = false) {

            if (showCircle) {
                this.graphics.lineStyle(1, 0xFF0000, 0.5);
                this.graphics.drawCircle(0, 0, radius);
            }


            var step = 360*coverage / (string.length-1);
            // convert to radians
            step = step * Math.PI / 180;

            for (var s = 0; s < string.length; s++) {
                var letter:Letter = new Letter(string.charAt(s)); // from library, check description below
                letter.x = radius*Math.cos(step*s);
                letter.y = radius*Math.sin(step*s);
                letter.rotation = (step*s)*180/Math.PI + 90;
                this.addChild(letter);
            }
            this.x = centerX;
            this.y = centerY;
            this.rotation = startAngle - 90;
        }
    }
}

Это очень мило.

1 голос
/ 28 августа 2009

Проще всего было бы создать мувиклип с текстовым полем в нем и выровнять так, чтобы левый нижний край текстового поля находился в начале мувиклипа. Вы захотите установить для свойства autosize текстового поля значение «left», чтобы оно увеличивалось по мере необходимости для каждой буквы (это поможет вам получить правильный кернинг).

Затем вы просто перебираете предложение и создаете видеоклип для каждой буквы. Единственная сложная часть - получить позицию следующей буквы.

Один способ, которым я решил эту проблему в прошлом, которая работает с любой линией или кривой, которую вы можете захотеть, - это создать очень длинную анимацию (по крайней мере, несколько сотен кадров) моего текстового поля, анимированного по всей длине кривой Я хочу. Тогда это тот видеоклип, который я дублирую. Затем мне просто нужно выбрать для каждой буквы, на каком кадре анимации остановиться - это будет диктовать, где текстовое поле для каждой буквы фактически отображается. Это взлом, но в прошлом он хорошо работал.

0 голосов
/ 01 июля 2011

у меня ничего не получалось Я просто хочу представлять и перемещать текст по кругу

пакет {

import flash.text.TextField;
import flash.display.Sprite;
import flash.text.TextFormat;
import flash.text.Font;

public class Letter extends Sprite
{

    public var vale:TextField; // defined by IDE

    public function letter(val:String):TextField
    {
        vale=new TextField();
        this.vale.text=val;
        var frmt:TextFormat= new TextFormat();
        frmt.color="0X00FF00";
        frmt.size=14;
        this.vale.setTextFormat(frmt);
        this.vale.textColor=0X00FF00;
        return vale;

    }

}

}

пакет {

import flash.display.Sprite;

import flash.text.TextField; Открытый класс CircleText расширяет Sprite {

    public function CircleText(centerX:Number, centerY:Number, radius:Number, string:String, coverage:Number, startAngle:Number, showCircle:Boolean = false) {

            if (showCircle) {
                    this.graphics.lineStyle(1, 0xFF0000, 0.5);
                    this.graphics.drawCircle(0, 0, radius);
            }


            var step = 360*coverage / (string.length-1);
            // convert to radians
            step = step * Math.PI / 180;

            for (var s = 0; s < string.length; s++) {
                    var letter:TextField = new Letter().letter(string.charAt(s)); // from library, check description below
                    letter.x = radius*Math.cos(step*s);
                    letter.y = radius*Math.sin(step*s);
                    letter.rotation = (step*s)*180/Math.PI + 90;
                    trace(letter.x, letter.y);
                    this.addChild(letter);
            }
            this.x = centerX;
            this.y = centerY;
            this.rotation = startAngle - 90;
    }
}

}

пакет {

import flash.display.Sprite;

public class DocumentClass extends Sprite {

    public function DocumentClass () {
            // draw on circle tester

            var c1:CircleText = new CircleText(200, 200, 90, "Hello World - Circle Text", 0.5, -90);
            var c2:CircleText = new CircleText(300, 300, 50, "Hope you like this", 0.6, -90, true);
            var c3:CircleText = new CircleText(420, 200, 50, "By Virusescu", 0.35, -60);

            this.addChild(c1);
            this.addChild(c2);
            this.addChild(c3);


    }

}

} * * тысяча двадцать-один

...