2012.01.11 | 

こんばんはmuchoです。
今日知ったんですが、addFrameScriptなる隠しメソッド?
があるとのこと

public function addFrameScript(frame:uint, notify:Function):void

言語バージョン : ActionScript 3.0
Playerのバージョン : Flash Player 9

指定したフレームにスクリプトを追加します。

こんな技が・・・もしかして使うかも?
ラベルでも飛びたいだろうということでクラスを作ってみました。
AddLabelScript.as



package  
{
	import flash.display.FrameLabel;
	import flash.display.MovieClip;
	import flash.display.Scene;

	public function AddLabelScript(mc:MovieClip, label:*, func:Function = null, arg:Array = null):void
	{
		var frms:Array = [];
		var f:Function;
		if(func != null){
			f = function():void{ func.apply(mc, arg); };
		}

		if (label is Number) {
			frms.push(int(label));
		} else if(label is String) {
			var ss:Array = mc.scenes;
			for each(var s:Scene in ss) {
				var ls:Array = s.labels;
				for each(var l:FrameLabel in ls) {
					if (l.name == label) {
						frms.push(l.frame);
					}
				}
			}
		}

		for (var i:int = 0; i < frms.length; i++ ) {
			var frm = frms[i];
			if (frm > 0 && frm <= mc.totalFrames) {
				mc.addFrameScript(frm, f);
			}
		}
	}
}

使うときは
AddLabelScript(this, "label1", function() {
	trace("label1 is "+ currentFrame);
});
とか
AddLabelScript(mc, this.totalFrames, function() {
	trace("last frame");
	this.stop();
	//ここでのthisはfunctionを埋め込んだmc
});


2012.01.07 | 

This movie requires Flash Player 9

今回はいまさら感たっぷりな話です。おとなしくFROCESSING使えよって話です。
そんな話なんですが、こんばんはmuchoです。
RGBを個別に設定したり、16進数で設定したり、
その逆がしたかったりしたのでColorクラスなんぞ作ってみました。
欲を出してついでにHSVで設定したり、
その逆も出来るようにしてみようとしたら
ちょっとはまりました。
はまったのはHSVからRGBに変換するところです。
(続きを読む...)

2011.12.20 | 

やぁやぁ、kaminayです。だいぶ久しぶりの投稿になってしまった。
自分的にも、DevJamMemo的にも。

そんな久しぶりのmemoはハマったのでメモでした(汗

as3で透過(alpha)付きのマスクのやり方は
いろんなブログ(muchoも書いてたような・・・)や、
adobeのマニュアルにもあるので説明は不要だと思いますが、

maskをかける方、かけられる方の
両方のDisplayObjectのcacheAsBitmapを有効にするだけです。


/*
var view:DisplayObject;
var mask:DisplayObject;
*/
view.cacheAsBitmap = mask.cacheAsBitmap = true;
view.mask = mask;

今回、いつものやり方ではうまく動かない事例を発見しました。
多分、バグではないかと思うんだけど、どうだろう。。

ダメだったのはこんな時でした。


/*
var view:DisplayObject;
var mask:shape;
var bitmapData:BitmapData;
*/
view.cacheAsBitmap = mask.cacheAsBitmap = true;
view.mask = mask;
mask.graphics.beginBitmapFill(bitmapData);
mask.graphics.drawRect(0, 0, bitmapData.width, bitmapData.height);

addEventListener(Event.ENTER_FRAME, function(e:Event):void{
	//bitmapDataをいじいじ
});

つまり、graphics.beginBitmapFill()であてた
bitmapDataをmaskの範囲として使う場合です。

cacheAsBitmapでキャッシュされているデータの更新は
DisplayObjectのviewに関する情報の更新を検知して行っていると思うので、
そのチェックするリストにgraphics.beginBitmapFill()であてた
bitmapDataが入ってないんだと思います。

bitmapDataを使いたいなら、Bitmap使えばいいじゃんという話ですが、
※Bitmapの場合は透過付きマスクは先の方法で適応できます。

今、bitmapDataをいじいじするクラスを書いていて、
bitmapDataの参照を他に渡してしまうと、
外からでdisposeをされて動かなくなるとか、
逆に外で使ってるのにdisposeしちゃうとか、
bitmapDataの管理が面倒になると思ったので、
マスターのbitmapDataをクラスで持って、
graphicsを引数でとって、それにdrawRectしてあげるメソッドを用意するという方法をとっていました。
とてもニッチなケースですね(汗

途中までいい具合だったんですが、
maskとして使ってみようかな?と軽い気持ちでいたら急にハマりました。

対処方法は
graphicsに再度drawRectしてあげると更新されます。
まぁ当り前ですね。

他にも方法がありそうなんですが、
scaleを変えてみたりとか色々試しましたが、結局drawRectで落ち着きました。

PS
せっかくマスク効くようになったけど、
拡大しながら使っていたので、
画質的にイマイチという結果に(汗

2011.12.02 | 

こんばんはmuchoです。
FlashPlayer11が出てから、Stage3Dをあれこれいじってます。
そんなこんなでAway3D4.0でjiglibとBulletの速度比較できるような
サンプルを作ってみたのでレポートをば。

[jiglib]


50個


200個



[bullet]


50個


200個



(続きを読む...)

2011.08.29 | 

やぁ、どうも。kaminalyです。
Flashの設定について、今日気がついた事があったのでメモメモ

Flashのパブリッシュ設定→スクリプト(ActionScript 3.0)設定にある、
ステージのインスタンスを自動宣言のチェックについて。

以前は、チェックした場合、
たとえばHogeクラスをリンケージで関連付けたムービークリップの中のオブジェクトに名前をつけると、
自動宣言してくれるので、定義をしなくてもコード内で急に使えて、
逆に、定義していないと気持ち悪いと思って定義すると、コンクリフトエラーが出ました。
しかし、CS5の環境ではどうやら改善されているようです。
定義しても、コンクリフトエラーが出なくなっていました。


package
{
	import flash.display.Sprite;

	/**
	 * ...
	 * @author kaminaly at SHIFTBRAIN
	 */
	public class Hoge extends Sprite
	{
		//ムービークリップないのオブジェクトにfugaと名前を付けた場合
		//public var fuga:Sprite;//定義してもコンクリフトエラーにならなくなった。

		//連番で名前をつけたい時、自動宣言しない場合すべて定義が必要だけど、
		//public var fuga_0:Sprite;
		//public var fuga_1:Sprite;
		//public var fuga_2:Sprite;
		//public var fuga_3:Sprite;
		//public var fuga_4:Sprite;
		//非常に面倒。
		//同じ機能なのに、連番オブジェクトの数が違うHogeが複数必要だったりすると
		//Fugaもクラス化してループで生成するとか、手間が増える。
		//自動宣言だと定義しなくてOKなので、かなり楽。
		//定義していない変数が急に使えるのは気持ち悪かったり、
		//補完が効かないのは変わらないけど、ササっと片付けたい作業の場合はかなり有効。

		public function Hoge()
		{
			//定義しなくてもfugaにアクセスできる。
			fuga.alpha = 0.5;

			//補完とか効かせたい場合は、
			//public var _fuga:Sprite; とか別の名前で定義して
			//_fuga = Sprite(getChildByName("fuga"));
			//とかで対応してたけど。ムダが多かった。
			//今は必要な分だけ、定義してあげれば良い。
		}
	}
}

クラスベースで作っている人にとっては、チェックを外して作る方が自然だったけど、
Flashで素材をあらかじめ用意して作りたい場合チェックを入れていた方が楽なので
お手軽に制作時間の削減が出来る。もちろんケースバイケースですが。

前はチェック外して作業してたけど、今はチェック入れた方が良くなってた。
が、一つ注意点があります。
Loaderなどで外部swfを読み込む場合、読み込まれるswfにリンケージ素材があり、
読み込む側でも、そのクラスを知っている(読み込んでいる)と、
ApplicationDomainを指定しない限り読み込む側のクラスが主なので、
読み込む側では定義がないのに、読み込んだ側が勝手にfugaを作ろうとするってんでエラーがでます。
その場合は、ちゃんとクラスに定義してあげる必要があります。