Emotion Fractal in AS3
December 21th, 2008
original by jtarbell: Levitated | Emotion Fractal
It's using these fonts.
- Times
- Helvetica
- Didot
- COM4t Fine Regular by Hideki Katayama
- Maximumline Speeder by Hideki Katayama
- OLDNEW by Hideki Katayama
- Gt informat-AL by Masayuki Sato & OMNIKONO
- Nihonbashi 2.0-AL by Masayuki Sato
source:
package {
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.net.*;
import flash.text.*;
import flash.ui.*;
import caurina.transitions.Tweener;
import caurina.transitions.properties.TextShortcuts;
import com.adobe.serialization.json.JSON;
[SWF(backgroundColor="#000000", frameRate=30)]
public class EmotionFractal extends Sprite {
private var queue:Array;
private var words:Array;
private var fonts:Array = ["Times", "Helvetica", "Didot", "COM4t Fine Regular", "OLDNEW Axis",
"Maximum Line Speeder", "GtinformatAL", "NihonbashiAL"];
[Embed(systemFont="Times", fontName="Times", unicodeRange="U+0041-U+005A", mimeType="application/x-font")]
private var font1:Class;
[Embed(systemFont="Helvetica", fontName="Helvetica", unicodeRange="U+0041-U+005A", mimeType="application/x-font")]
private var font2:Class;
[Embed(systemFont="Didot", fontName="Didot", unicodeRange="U+0041-U+005A", mimeType="application/x-font")]
private var font3:Class;
[Embed(source="COM4F_RG.TTF", fontName="COM4t Fine Regular", unicodeRange="U+0041-U+005A", mimeType="application/x-font")]
private var font4:Class;
[Embed(source="OLDNEW_A.TTF", fontName="OLDNEW Axis", unicodeRange="U+0041-U+005A", mimeType="application/x-font")]
private var font5:Class;
[Embed(source="MAXI_L_S.TTF", fontName="Maximum Line Speeder", unicodeRange="U+0041-U+005A", mimeType="application/x-font")]
private var font6:Class;
[Embed(source="GTINA___.TTF", fontName="GtinformatAL", unicodeRange="U+0041-U+005A", mimeType="application/x-font")]
private var font7:Class;
[Embed(source="NIHOA___.TTF", fontName="NihonbashiAL", unicodeRange="U+0041-U+005A", mimeType="application/x-font")]
private var font8:Class;
public function EmotionFractal() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loadingComplete);
loader.load(new URLRequest("/misc/emotion.json"));
}
public function loadingComplete(e:Event):void {
var json:String = URLLoader(e.currentTarget).data;
words = JSON.decode(json);
TextShortcuts.init();
init();
addEventListener(MouseEvent.MOUSE_DOWN, init);
stage.addEventListener(FullScreenEvent.FULL_SCREEN, init);
var menu:ContextMenu = new ContextMenu();
var item:ContextMenuItem = new ContextMenuItem("Full Screen");
contextMenu = menu;
menu.hideBuiltInItems();
menu.customItems.push(item);
menu.addEventListener(ContextMenuEvent.MENU_SELECT, function(e:ContextMenuEvent):void {
switch (stage.displayState) {
case "normal":
item.enabled = true;
break;
case "fullScreen":
item.enabled = false;
break;
}
});
item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function(e:ContextMenuEvent):void {
stage.displayState = "fullScreen";
});
}
public function init(...args):void {
Tweener.removeAllTweens();
while (numChildren) removeChildAt(0);
queue = [new Rectangle(0, 0, stage.stageWidth, stage.stageHeight)];
addEventListener(Event.ENTER_FRAME, fill);
}
public function fill(e:Event):void {
var i:int = 0;
while (queue.length > 0 && i < 3) {
var rect:Rectangle = queue.pop();
if (rect.width > 2 && rect.height > 2) {
fillRegion(rect);
i++;
}
}
if (!queue.length) removeEventListener(Event.ENTER_FRAME, fill);
}
public function fillRegion(region:Rectangle):void {
var tf:TextField = new TextField();
var fmt:TextFormat = new TextFormat();
fmt.font = choice(fonts);
fmt.size = 24;
fmt.letterSpacing = -0.3;
fmt.rightMargin = 0.3;
tf.defaultTextFormat = fmt;
tf.text = choice(words).toUpperCase();
tf.autoSize = "left";
tf.embedFonts = true;
tf.selectable = false;
var bitmap:BitmapData = new BitmapData(tf.width, tf.height, true);
bitmap.draw(tf);
var bound:Rectangle = bitmap.getColorBoundsRect(0xFFFFFFFF, 0xFFFFFFFF, false);
bitmap.dispose();
var s:Number = region.width / bound.width * (Math.random() * 0.3 + 0.1);
if (bound.height * s > region.height) s = region.height / bound.height;
tf.scaleX = s;
tf.scaleY = s;
bound.x *= s;
bound.y *= s;
bound.width *= s;
bound.height *= s;
switch (choice([1,2,3,4])) {
case 1:
tf.x = region.x - bound.x;
tf.y = region.y - bound.y;
queue.push(
new Rectangle(region.x + bound.width, region.y, region.width - bound.width, bound.height),
new Rectangle(region.x, region.y + bound.height, region.width, region.height - bound.height)
);
break;
case 2:
tf.x = region.x - bound.x;
tf.y = region.bottom - bound.bottom;
queue.push(
new Rectangle(region.x + bound.width, region.bottom - bound.height, region.width - bound.width, bound.height),
new Rectangle(region.x, region.y, region.width, region.height - bound.height)
);
break;
case 3:
tf.x = region.right - bound.right;
tf.y = region.y - bound.y;
queue.push(
new Rectangle(region.x, region.y, region.width - bound.width, bound.height),
new Rectangle(region.x, region.y + bound.height, region.width, region.height - bound.height)
);
break;
case 4:
tf.x = region.right - bound.right;
tf.y = region.bottom - bound.bottom;
queue.push(
new Rectangle(region.x, region.bottom - bound.height, region.width - bound.width, bound.height),
new Rectangle(region.x, region.y, region.width, region.height - bound.height)
);
break;
}
addChild(tf);
Tweener.addTween(tf, {_text_color: 0xFFFFFF, time: 5, transition: "liner"});
}
private function choice(ary:Array):* {
return ary[Math.floor(ary.length * Math.random())];
}
}
}
Filed in ActionScript
No comments
Leave a Reply
コメントを投稿する場合は下記の認証サービスのいずれかを経由してログインして下さい。
但し、認証を行うにはそのサービスのアカウントが必要です。