forked from: textでマスク

by kanatara forked from textでマスク (diff: 1)
♥0 | Line 105 | Modified 2010-08-12 22:27:51 | MIT License
play

ActionScript3 source code

/**
 * Copyright kanatara ( http://wonderfl.net/user/kanatara )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/9S88
 */

// forked from chimanaco's textでマスク
/**
*  
*  ▼BitmapData を使って文字列でマスク
*  http://d.hatena.ne.jp/nitoyon/20070911/mask_letter
*  ▼扇形を作るクラス
*  ActionScript3.0入門ノート2
*/
package
{
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	import flash.text.*;
	import flash.system.*;
	
	[SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "#000000")]
	public class TextMask extends Sprite
	{
		private const STAGE_W:int = 465;
		private const STAGE_H:int = 465;
		private const WIDTH:int = 400;
		private const HEIGHT:int = 80;
		private var txt:TextField;
		private var tf:TextFormat;
		private var patt:BitmapData;
		private var rect1:Rectangle;
		private var rect2:Rectangle;
		private var base:Sprite;
		private var baseColor:Number = 0xFF8FC31F;
		private var circle:Sprite;
		private var pieSp:Sprite;
		private var pieNum:int;
		private var pieDeg:int = 12;
		private var pieR:Number = 500;
		private var pieColor:Number = 0x3139d5;
		private var bmpd:BitmapData;
		private var bmp:Bitmap;
		private var bmpdText:BitmapData;

		public function TextMask() {		
			// text
			tf = new TextFormat();
			tf.color = 0xFFFFFF;
			tf.font = "Arial Black";
			tf.align = "center";
			tf.size = 60;
			txt = new TextField();
			txt.defaultTextFormat = tf;
			txt.text = "Wonderfl!!!";
			txt.width = WIDTH;
			txt.height = HEIGHT;
			txt.background = true;
			txt.backgroundColor = 0;
			
			//pattern
			patt = new BitmapData(1, 10);
			rect1 = new Rectangle(0, 0, 1, 5);
			rect2 = new Rectangle(0, 5, 1, 5);
			patt.fillRect(rect1, 0xFF000000);
			patt.fillRect(rect2, baseColor);
			
			//base
			base = new Sprite();
			base.graphics.beginBitmapFill(patt, null, true, true);
			base.graphics.drawRect(0, 0, WIDTH, HEIGHT);
			base.graphics.endFill();
			
			//circle
			circle = new Sprite();
			base.addChild(circle);
			circle.x = STAGE_W / 2;
			
			//扇形
			pieNum = 360 / pieDeg;	
			for (var i:int = 0; i < pieNum; i++) {
				pieSp = new Pie(pieR / 2, i * pieDeg* 2,  pieDeg + i * pieDeg * 2, pieColor);	
				circle.addChild(pieSp);
			}
			
			// bitmap
			bmpd = new BitmapData(WIDTH, HEIGHT);
			bmp = new Bitmap(bmpd);
			bmp.y = STAGE_H/2 - HEIGHT/2;
			bmp.x = STAGE_W/2 - WIDTH/2;
			addChild(bmp);
			
			bmpdText = new BitmapData(WIDTH, HEIGHT, false);
			
			addEventListener(Event.ENTER_FRAME, enterFrame);
		}
		
		private function enterFrame(e:Event):void {
			//rotaion
			circle.rotation += 5;
				
			// cache textField as BitmapData
			bmpdText.draw(txt);

			// mask
			bmpd.lock();
			bmpd.draw(base);
			bmpd.copyChannel(bmpdText, new Rectangle(0, 0, WIDTH, HEIGHT), new Point(0, 0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
			bmpd.unlock();
		}
	}
}

import flash.display.Sprite;
import flash.geom.Point;

class Pie extends Sprite {
	private var radius:Number;
	private var deg0:Number, deg1:Number;
	private var fillColor:uint;
	
	public function Pie(r:uint, deg0:Number, deg1:Number, fillColor:uint) {
		this.radius = r;
		//start degree
		this.deg0 = deg0;
		//finish degree
		this.deg1 = deg1;
		this.fillColor = fillColor;
		drawFigrure();
	}
	
	private function drawFigrure():void {
		var pt:Point;
		var deg:int;
		
		var offset:Number = -90;
		graphics.beginFill(fillColor);
		
		graphics.moveTo(0, 0);
		for (deg = deg0; deg <= deg1; deg++) {
			var rad:Number = (deg + offset) * Math.PI / 180;
			pt = Point.polar(radius, rad);
			graphics.lineTo(pt.x, pt.y);
		}
		graphics.endFill();
	}
}