2008年3月13日木曜日

ActionScript 3.0で鏡文字

このブログ記事をはてなブックマークに追加

ずいぶん前からActionScript 3.0(以下、AS3)を覚えようと思っているのだが、未だに手付かずの状態だ。それでも少しぐらいは触っておこうと思ったので、前回のShootNumbersに引き続き、入力したテキストをそのまま鏡文字で出力するFlashアプリを作ってみた。こんなのは初歩の初歩だと思うが、AS3については素人であるので致し方ない。

ところで、Flashはこのブログの投稿記事に埋め込められないので、サイドバーの一番下に入れてみた。大したプログラムでもないのでそのうち外すかも。

で、問題の中身だが、AS3の流儀なんてほとんど知らないので、妙なコーディングしているかもしれない。その辺は勘弁して欲しい。キャレットの表示などを入れたりしたら思ったよりもコード量が増えてしまった。うーむ。肝心なのは、フォントをEmbedで埋め込む必要があることだろう。埋め込まないと文字の反転や回転ができない。

以下に示すソースコードを mxmlc MirrorImagedText.as として、コンパイルすればswfファイルを作成できる。使い方は普通にキーボードから文字を打ち込めばよい。バックスペース、改行が可能。マウス左クリックで全消去。

MirrorImagedChar.as

// MirrorImagedChar class by nox package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.utils.Timer; import flash.events.TimerEvent; public class MirrorImagedChar extends Sprite { [Embed(systemFont='Courier New', fontName='myFont', mimeType='application/x-font' )] private static const myFont:Class; private var text_format:TextFormat = new TextFormat(); private var text_field_list:Array = new Array(); private var text_width_list:Array = new Array(); private var text_width:Number = 0; private var text_height:Number = 0; private var caret:TextField = new TextField(); private var blink_timer:Timer = new Timer(250); private function InitTextFormat():void { text_format.color = 0x00ff00; text_format.size = 14; text_format.font = "myFont"; } private function InitTextField(tf:TextField):void { tf.antiAliasType = flash.text.AntiAliasType.ADVANCED; tf.autoSize = TextFieldAutoSize.LEFT; tf.selectable = false; tf.embedFonts = true; tf.width = 300; tf.defaultTextFormat = text_format; } private function InitCaret():void { blink_timer.start(); blink_timer.addEventListener(TimerEvent.TIMER, CaretBlinker); addChild(caret); InitTextField(caret); caret.text = "_"; ShowCaret(); } private function CaretBlinker(event:TimerEvent):void { caret.visible = !caret.visible; } private function ShowCaret():void { caret.x = text_width; caret.y = text_height; } public function Print(str:String):void { var tf:TextField = new TextField(); InitTextField(tf); tf.text = str; tf.scaleX = -1.0; // for Mirror-Image if (str.charCodeAt(0) == 13) { text_width_list.push(text_width); text_width = 0; text_height += tf.textHeight; } else if (tf.textWidth < 0.001) return; text_field_list.push(tf); addChild(tf); tf.x = text_width + tf.width; // with (scaleX = -1.0) tf.y = text_height; text_width += tf.textWidth; ShowCaret(); } public function Backspace():void { var tf:TextField; if (text_field_list.length > 0) { tf = text_field_list.pop(); removeChild(tf); } else return; if (text_width > 0.001) text_width -= tf.textWidth; else if (text_width_list.length > 0) { text_width = text_width_list.pop(); text_height -= tf.textHeight; } ShowCaret(); } public function Clear():void { for each (var tf:TextField in text_field_list) removeChild(tf); text_field_list = []; text_width = 0; text_height = 0; ShowCaret(); } public function MirrorImagedChar() { InitTextFormat(); InitCaret(); } } }

MirrorImagedText.as

// MirrorImagedText class package { import flash.display.Sprite; import flash.events.*; [SWF(backgroundColor="0x000000", width="200", height="150", framerate="30")] public class MirrorImagedText extends Sprite { private var mic:MirrorImagedChar = new MirrorImagedChar(); private function InputChar(event:KeyboardEvent):void { if (event.keyCode == 8 || event.keyCode == 46) mic.Backspace() else mic.Print(String.fromCharCode(event.charCode)); } private function ClickHandler(event:MouseEvent):void { mic.Clear(); } public function MirrorImagedText() { stage.addEventListener(KeyboardEvent.KEY_DOWN, InputChar); stage.addEventListener(MouseEvent.CLICK, ClickHandler); addChild(mic); } } }

0 コメント: