有没有办法以编程方式将文本转换为动作中的圆圈?

时间:2009-08-28 17:41:28

标签: flash actionscript actionscript-2

有没有人在这里想出一种优雅的方法来拍摄一段文字并让它绕过一条翘曲的边缘? (具体来说,循环,但我敢肯定,一旦它跟随线,形状是不相关的)。我找不到如何做到这一点的好资源。我假设我需要为每个角色创建单独的影片剪辑然后旋转和定位,但我很难找到如何执行此操作的资源。

编辑:对不起,显然忘了提到文字是动态的。我对如何制作静态文本不感兴趣:)

3 个答案:

答案 0 :(得分:4)

我举了两个写圈的例子。 为了实现这一点,您需要在库中添加一个名为 Letter 的Sprite。这是为了更简单的文本操作。字母需要一个TextField,至少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 :(得分:1)

最简单的方法是创建一个带有文本字段的动画片段并对齐,以便文本字段的左下边缘位于动画片段的原点。您需要将textfield的autosize属性设置为“left”,以便根据需要增加每个字母(这将帮助您正确地进行字距调整)。

然后你只需循环你的句子并为每个字母创建一个movieclip。唯一困难的部分是获得下一个字母的位置。

我过去解决过这个问题的一种方法是使用你想要的任何直线或曲线来创建一个非常长的动画(至少几百帧)我的文本域补间曲线的长度我想要。那就是我复制的动画片段。然后,我必须为每个字母选择要停止的动画上的帧 - 这将决定实际显示每个字母的文本字段的位置。这是一个黑客,但它在过去运作良好。

答案 2 :(得分:0)

对我没用 我只是想在圆形路径上表示和移动文本

包 {

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);


    }

}

}