2009 年 4 月 のアーカイブ

TextFieldを透過させつつ回転させる方法(その2)

2009 年 4 月 26 日 日曜日

先日、「ダイナミックテキストを回転させると消えてしまう、、」という書き出しでエントリーしたんだけど、
やはり、というかどうして見つけられなかったのか、当時やりたかったことを普通に実現できる方法がありました。
前回の投稿も何かの役に立ってくれると期待を込め、今回、新たにエントリーです。

ACTIONSCRIPT:
  1. package src
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.     import flash.text.TextField;
  6.     import flash.text.TextFormat;
  7.  
  8.     public class Indexextends Sprite
  9.     {
  10.         var sp:Sprite;
  11.         var tf:TextField;
  12.  
  13.         [Embed(source="fontfile", fontFamily="foo")]
  14.         public var foo:String;
  15.  
  16.         function Index():void {
  17.            
  18.             sp = new Sprite();
  19.             sp.x = stage.stageWidth / 2;
  20.             sp.y = stage.stageHeight / 2;
  21.             addChild(sp);
  22.            
  23.             var format:TextFormat = new TextFormat();
  24.             format.font = "foo";
  25.            
  26.             tf = new TextField();
  27.             tf.embedFonts = true;
  28.             tf.defaultTextFormat = format;
  29.             sp.addChild(tf);
  30.            
  31.             addEventListener(Event.ENTER_FRAME, onEnterframe, false, 0, true);
  32.         }
  33.         private function onEnterframe(e:Event):void {
  34.             tf.text = "degree:" + ++sp.rotation;
  35.             tf.alpha = ( Math.abs(sp.rotation) % 100 ) / 100;
  36.         }
  37.     }
  38.  
  39. }

ポイントはフォントをEmbedで埋め込む部分。というかここしか目立つとこないすね。
おまけで透明度も変えられるか検証しています。

これでとりあえずやりたかったことが実現できた。
前回の方法とどっちが早いんだろう?

CLICKとMOUSE_DOWN & MOUSE_UPイベントを区別したい

2009 年 4 月 23 日 木曜日

1個のmcにCLICKイベントとMOUSE_DOWNとMOUSE_UPイベントリスナーを設定した場合、1回のクリックでそれぞれ1回ずつイベントが発生しますが、MOUSE_DOWNとMOUSE_UPイベントをドラッグ&ドロップ等で使いつつクリックも検出したい場合は思惑通りに動いてくれなかったので、動かすための手順をメモ。

ACTIONSCRIPT:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.MouseEvent;
  5.     import flash.geom.Point;
  6.     public class Index extends Sprite
  7.     {
  8.         var sp:Sprite;
  9.         var pointMousedown:Point;
  10.         public function Index()
  11.         {
  12.             sp = new Sprite();
  13.             sp.graphics.beginFill(0x0);
  14.             sp.graphics.drawRect(0, 0, 100, 40);
  15.             sp.x = stage.stageWidth / 2 - sp.width / 2;
  16.             sp.y = stage.stageHeight / 2 - sp.height / 2;
  17.             addChild(sp);
  18. //    sp.addEventListener(MouseEvent.CLICK, onClick, false, 0, true);
  19.             sp.addEventListener(MouseEvent.MOUSE_DOWN, onMousedown, false, 0, true);
  20.             sp.addEventListener(MouseEvent.MOUSE_UP, onMouseup, false, 0, true);
  21.         }
  22.         private function onClick(e:MouseEvent):void {
  23.             trace("onClick");
  24.         }
  25.         private function onMousedown(e:MouseEvent):void {
  26.             trace("onMousedown");
  27.             e.target.startDrag();
  28.             pointMousedown = new Point(e.target.x, e.target.y);
  29.         }
  30.         private function onMouseup(e:MouseEvent):void {
  31.             trace("onMouseup");
  32.             e.target.stopDrag();
  33.             var pointMouseup:Point = new Point(e.target.x, e.target.y);
  34.             //5ピクセル以内ならクリックとみなし処理を行う
  35.             if (Point.distance(pointMousedown, pointMouseup) <5) {
  36.                 trace("onClickByScript");
  37.             }
  38.             trace("distance:" + Point.distance(pointMousedown, pointMouseup));
  39.         }
  40.     }
  41. }

CLICKイベントは使わずにMOUSE_DOWNとMOUSE_UPの間に移動したピクセル数を算出し、ある値を超えればクリックとみなす。とういもの。

この応用で、MOUSE_DOWNとMOUSE_UPの間にかかった時間も判断の1つとして加えても良いかも。

TextFieldを透過させつつ回転させる方法

2009 年 4 月 11 日 土曜日

ダイナミックテキストを回すとrotationが0のとき以外消えてしまう。

ならば、とビットマップ化するところまでは簡単だったけど、まんま白い背景がついてしまったので、それを消すところまでやりました。けっこうハマってしまった上、忘れてしまって二度手間になりそうな臭いプンプンなので、未来の自分の為にメモ。AS3です。

追記:他の方法(というかこっちが理想的)もエントリーしてます

ACTIONSCRIPT:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.text.TextField;
  5.     import flash.display.BitmapData;
  6.     import flash.display.Bitmap;
  7.     public class Index extends Sprite {
  8.         [SWF(backgroundColor = "0xaaaaaa")]
  9.         function Index() {
  10.             var tf:TextField;
  11.             var bm:Bitmap;
  12.             var bmd:BitmapData;
  13.             var sp:Sprite;
  14.            
  15.             tf = new TextField();
  16.             tf.text = "この文字列を回転";
  17.             addChild(tf);
  18.            
  19.             bmd = new BitmapData(tf.width, tf.height, true, 0x00ffffff);
  20.             //    bmd = new BitmapData(tf.width, tf.height);
  21.             bmd.draw(tf);
  22.            
  23.             bm = new Bitmap(bmd, "auto", true);
  24.            
  25.             sp = new Sprite();
  26.             sp.addChild(bm);
  27.             addChild(sp);
  28.            
  29.             sp.rotation = 45;
  30.         }
  31.     }
  32. }

BitmapData(txtWidth, txtHeight, true, 0x00ffffff);

3番目の引数で「透過します」として、
4番目の引数で「透過するカラーコード」をしているみたい。←間違ってました。
4番目の引数は作成するBitmapの最初のカラーで、0xAARRGGBBの形式になります。
(上の0x00ffffffの場合、ffffffは白だけど先頭2桁のAA(透明度)が00だったので透明になりましたってことだね、きっと)

テキストを入れたmcにフィルタをかけて、テキストをビットマップ化させるような方法で実践している例もいくつかあったけど、なぜかうまくいかなかったので、これでやってみることにします。