feb19.jp

Nobuhiro Takahashi
Designer / Engineer

AS2で読み込んだ外部画像にスムージングを適用する

AS2で外部から読み込んだBitmapにスムージングをかける

ちょっとめんどくさいかつ、忘れがちなので一応メモ。AS3は楽なんだけどねぇ。

というか、クラスにしました。image_mcに読み込んだBitmapDataをdrawして、ターゲットのムービークリップにスムージングをかけてアタッチする、という感じ。

LoadBitmap.as
	
import flash.display.BitmapData;
	
class LoadBitmap extends AsBroadcaster
{
	/*
	 * 外部のビットマップデータをロードします。
	 * 
	 * @param	target:MovieClip	ロードされたビットマップを表示するMovieClip
	 * @param	url:String	URL
	 * @param	smoothing:Boolean	スムージングするか否か
	 * 
	 * このインスタンスにaddListener(オブジェクト)すると、引数に指定したオブジェクトはonCompleteイベントを受け取ります。
	 */
	public function LoadBitmap(target:MovieClip, url:String, smoothing:Boolean)
	{
		var image_mc:MovieClip = target.createEmptyMovieClip("image_mc", target.getNextHighestDepth());
		var image_listener:Object = new Object();
		
		var _this:LoadBitmap = this;
		
		initialize(this);
		
		image_listener.onLoadInit = function(targetmc:MovieClip)
		{
			targetmc._visible = false;
			var bmd:BitmapData = new BitmapData(targetmc._width, targetmc._height, true, 0x000000);
			target.attachBitmap(bmd, target.getNextHighestDepth(), "auto", smoothing);
			bmd.draw(targetmc);
			
			_this.broadcastMessage("onComplete");
		}
		
		var loader:MovieClipLoader = new MovieClipLoader();
		loader.addListener(image_listener);
		loader.loadClip(url, image_mc);
	}
}

使い方はこんな感じ。

var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
var lbm:LoadBitmap = new LoadBitmap(mc, "test.jpg", true);
lbm.addListener(this);
function onComplete():Void
{
	mc._xscale = mc._yscale = 200;
}

LoadBitmapクラスは、AsBroadcasterを継承しているので、newで作ったインスタンスにaddListener()すると、引数に指定したオブジェクト(スコープ)でonCompleteイベントを受け取ることができるので、上の例では、読み込みが終わったらonCompleteを受け取って、mcを縦横2倍に拡大しています。

こういう書き方もAS2はできますよね。

var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
var lbm:LoadBitmap = new LoadBitmap(mc, "test.jpg", true);
var listener_obj:Object = new Object();
lbm.addListener(listener_obj);
listener_obj.onComplete = function()
{
	mc._xscale = mc._yscale = 200;
}

ちなみに、大きい画像にスムージングをかけてトランジションするとそこそこ重いので、トランジション中はMovieClip._quality = "LOW"とかにして、終わったら元に戻すとかすると、気が利いてるのかもしれませんね。

----

どうでもいいけど最近ニョロ括弧({})の書き方を、上述のコードのように一段改行するようになってきました。Adobeのコーディングガイドラインや、FlashDevelopの機能のせいでもあるのですが、この書き方の方が、文字や行が密集していないので、ディスプレイに顔を近づけなくてもコードが読みやすいですね。あと、できるだけAS2であってもちゃんと型指定をするっていうのと、変数名(とくに再利用される可能性のあるコード)はあまり省略しない、っていうのを心がけるようにしています。おかげでタイプする文字は多くなるのですが、あとから(たとえば数ヵ月後とかに)再度見たとき、コードが読みやすいですね。

Navigation

prev: AS2でTextFieldの行数を取得する
next: Flex SDK 3で、Flash Player 10(Astro)を予習する

Recently Entries