08-26-10

ActionScriptライブラリTweenerでBlurの使い方

ActionScriptのトゥイーン制御ライブラリTweenerの使い方の補足です。

ぼかし、ブラーをTweenさせようと思ってもエラーが出る。

## [Tweener] Error: The property '_Blur_blurX' doesn't seem to be a normal object property of [object MovieClip] or a registered special property.
## [Tweener] Error: The property '_Blur_blurY' doesn't seem to be a normal object property of [object MovieClip] or a registered special property.

Tweenerライブラリを読み込む「import caurina.transitions.Tweener;」この記述の下に、ぼかしフィルターを適応させるライブラリをimportさせる記述書いて、初期化をする関数を実行させる必要があります。

//▼ぼかしフィルターのimport
import caurina.transitions.properties.FilterShortcuts;
//▼ぼかしフィルターの初期化
FilterShortcuts.init();
//▼ぼかしTween
Tweener.addTween([instance],{alpha:1,
					transition:'easeOutQuint',
					time:5,_Blur_blurX:20,
					_Blur_blurY:20})

サンプルサイトなどでコピペしてエラーが出た方は、これの記述があるか見てみてくださいー。

08-23-10

AS3で文字コードのShift_JISを設定するSystem.useCodePageのエラー

外部テキストファイルやCSV、XMLファイルをFlashに読み込んで表示する。そんなコンテンツはいっぱいあると思いますが、shift-jisの場合は日本語が正しく表示されないので「System.useCodepage」というおまじないを書きます。

1119: 未定義である可能性が高いプロパティ useCodepage に静的型 Class の参照を使用してアクセスしています。

ActionScript3.0でこんなエラーが出たら、「page」の「p」を大文字に変えてみてください。たったこれだけではまってしまいました。。orz

//as3
System.useCodePage = true;
//as2以下
System.useCodepage = true;

08-20-10

AS3で入れ子になったMovieClipからrootの関数を実行する方法

今度は久々にFlashに関して

AS2までは、入れ子になったMovieClipから一番上にあたる「_root」に対して、そこのタイムラインに書かれているScriptの関数を叩く際には、「_root.hoge();」と書けば、「function hoge(){}」関数が実行できました。

AS3になって、XもYもrootもアンダーバー「_」をつけなくなり、入れ子になったMovieClipからアンダーバーのない「root.hoge();」で関数を実行できるのかとおもったっら違うみたいでした。。。今更感がいなめないですが、、メモします。

MovieClip(root).hoge();

ActionScript3.0の場合は、このように書くとhoge関数が実行できました。rootも1つのMovieClipですよー!っていうことですね。もう忘れないw

05-21-10

Papervision3D本語 リファレンスガイド

ActionScriptで3DCGアニメーションや3Dゲームを作るために欠かせない、Papervision3Dの日本語ドキュメントが公開されてましたのでメモします。

Papervision3D™ 2.1 日本語 リファレンスガイド
http://papervision3d-jp.googlecode.com/svn/trunk/docs/index.html
papervision3d-jp(プロジェクト)
http://code.google.com/p/papervision3d-jp/

04-08-10

Flashに値やパラメータを送る方法まとめ

HTMLにswfファイルを貼り付けてブラウザで見るときに、場合によってはHTMLに書いておいた値やパラメータをFlashの変数に渡してあげたいときがあると思います。Flash内を更新したいときや、ちょっとした汎用性のあるコンテンツを作るときに、Flashアプリケーションがインストールされていない環境でも、Flashの更新をしたりする時に便利です。色々ある方法の中で一番シンプルな方法、swfobjectを使って、ActionScriptにどう書けばいいのか紹介します。

swfobjectを使ってパラメータを設定する場合

swfobjectの使い方はswfobject v2.xの使い方を参考にしてみてください。
Flashコンテンツの背景色を色々変更したいという例えで紹介します。HTMLに書くswfobjectの書き方のイメージはこんな感じにします。

<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
<!--
var flashvars = {bgColor: "FF0000"};//←背景色
var params = {allowscriptaccess: "always"};
swfobject.embedSWF("flash.swf", "flashContent", "100", "100", "8", "", flashvars, params,attributes);
//-->
</script>

flashvarsに変数名「bgColor」を書いて、値である16進数の「FF0000」を書いてみました。
ではActionScriptではどのように書くか

ActionScript2.0以下でflashvarsを取得する場合

ステージ全部に収まるシェイプを作って、今回の例では100×100の正方形のMovieClipを作ってステージに配置します。インスタンス名を「bg」としました。第1フレームに下記のActionScriptを書きます。

var color_obj = new Color(bg);// カラーオブジェクトを作成する
var colorStr = "0x"+_root.bgColor;//ここがswfobjectで設定した値が入ります
color_obj.setRGB(colorStr);

厳密なことはわかりませんが、flashvarsに格納した値はFlash上では_rootに宙に浮いてて、それを_root.[変数]にしてあげるとポコ!ってはいる。そんなイメージにしてますボクはw

ActionScript3.0でflashvarsを取得する場合

ActionScript3.0になってから、そんな宙に浮いていた値のイメージが、ちゃんとScriptを書いて値を取りに行くことを書かなければいけなくなりました。swfに渡そうとする変数の値は、LoaderInfoクラスで取得することができます。

import flash.display.LoaderInfo

var params:Object = loaderInfo.parameters;
var bgColorStr:String = params["bgColor"];

params[flashvars]になるので、複数の値を取得する時は名前を指定してあげれば取得することができます。

04-06-10

ActionScript3.0で右クリックのコンテキストメニューを消す方法

ActionScript3.0から、Flash領域内で右クリックしたときに出るコンテキストメニューを非表示にすることができるようになりました。

import flash.ui.ContextMenu;

var menu_mc = new ContextMenu();
menu_mc.hideBuiltInItems();

拡大縮小や描画領域を表示させるのはユーザーの方に見せる必要がないと思い消してもいいと思いますが、コンテンツによってはセキュリティーの設定項目と、Flash Playerとは。のメニューは残しておいたほうがいいかもしれへんなぁーっと個人的には思いました。

03-29-10

ActionScript3.0でローカルやサーバーの時間を取得する方法

ローカルの時間を取得する方法

この辺の感覚はAS1、2とあまりかわらないですね。

var myDate:Date = new Date();
trace(myDate.fullYear);
trace(myDate.month + 1);
trace(myDate.date);
var dayAry = ["日","月","火","水","木","金","土"];
trace(dayAry[myDate.day]);
trace(myDate.hours);
trace(myDate.minutes);
trace(myDate.seconds);
trace(myDate.milliseconds);

文字列を渡して時間を設定する方法

ローカルの時間だと、ユーザーのパソコンの時計にしまいますので、サーバーの時計等を取得して時計を表示させる場合は、下記のパターンのように、new Dateの引数にStringなどを入れることによって正しい時間を表示させることもできます。

var myDate:Date = new Date("Fri, 26 Mar 2010 06:35:19 +0900");
var myDate:Date = new Date("Sat Nov 30 01:20:00 GMT-0800 1974");
var myDate:Date = new Date(1974, 10, 30, 1, 20);

文字列から時間を再設定してから時を刻むサンプル

getTimer()はFlashPlayerが再生し始めた瞬間からの経過時間をミリ秒で取得できる関数です。1000=1秒です。Date.parseは時間をミリ秒単位で表示してくれる関数です。ミリ秒になった数字に1000を足していくこの方法だと簡単に時を刻むことができます。

trace(Date.parse(dateParsed));//1269552919000
var nowTime = Date.parse(dateParsed);

addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event):void {
	trace(nowTime+getTimer());
	trace(new Date(nowTime+getTimer()));
}

Event.ENTER_FRAMEを使わないサンプル

ENTER_FRAMEで実行させ続けると、どのタイミングで1秒変化したのか分かりにくくナンセンスなので、AS3から使えるようになったTimerクラスを使うと、1秒ごとにカウントしていく。というのが作れます。setIntervalは使いにくかったですからね。。。助かります。ボクはこの方法がベストだと思います。

var dateParsed:String = "Fri, 26 Mar 2010 06:35:19 +0900";
trace(Date.parse(dateParsed));//1269552919000
var nowTime = Date.parse(dateParsed);

var myTimer:Timer = new Timer(1000);
myTimer.addEventListener("timer", timerHandler);
myTimer.start();

function timerHandler(event:TimerEvent):void {
	trace(new Date(nowTime+=1000));
}

03-22-10

ActionScript3.0でgetURLにかわるnavigateToURL

古のFlashからあるgetURL関数がAS3でなくなっていることに戸惑われた方もいらっしゃるのではないでしょうか。AS3の仕様変更により、URLRequestクラスの変数に、ページ遷移する先のURLテキストを持たせて、navigateToURL関数の引数に渡してあげるとページ遷移します。

var url:URLRequest = new URLRequest("http://creator.cotapon.org/");
navigateToURL(url, "_self");

ボタンで実行する時はリスナー登録したイベントに対して書けば動作します。一回覚えてしまえば簡単ですねー。

btn.addEventListener(MouseEvent.MOUSE_DOWN, btnMouseDown);
function btnMouseDown(e:MouseEvent):void {
	var url:URLRequest = new URLRequest("http://event.rakuten.co.jp/food/bussan/shop/" );
	navigateToURL(url, "_self");
}

02-18-10

ActionScript3.0でインスタンス名を調べたり設定する方法

ライブラリにおいてあるムービークリップに対して、リンゲージでActionScriptに書き出しをチェックを入れてクラス化したモノを、var 変数名:クラス名 = new クラス名();で生成して、stage.addChild(変数名);でステージに配置するのは基本だと思います。が、この一連の流れで一体どこにインスタンス名を設定するのか非常に悩んでしまいました。

単純にMovieClipを生成するだけなら、var 変数名:MovieClip = new MovieClip();でできちゃいます。ActionScript2以下の場合では、createEmptyMovieClipを使って空のMovieClipを生成していたと思います。

インスタンスを作成する場所.createEmptyMovieClip(インスタンス名, 深度)

第二引数にインスタンス名を設定ができ、例えばforで繰り返し生成する場合は、インスタンス名に対して「i」を連結させて連番名などにしたりしていました。さて、、ActionScript3.0ではどうするのでしょうか。。。

まず、空のMovieClipを生成した時の名前を調べました。

var mc:MovieClip = new MovieClip();
trace(mc.name);//「instance1」と出力

「name」はActionScript2以下の場合は「_name」でアンダーバーがいりましたが、ActionScript3.0ではアンダーバーがいらなくなりました。newしたMovieClipの名前をtraceしてみると「instance1」と出力されました。
これをforで繰り返して生成したMovieClipにアクセスする為には「instance1」「instance2」とかのまま作られたらダメですよね。。。

そこで調べました。なんと!ActionScript2以下ではインスタンス名を調べることしかできなかったnameが、ActionScript3.0からnewしたインスタンス名に設定できることが分かりました、つまり、

var mc:MovieClip = new MovieClip();
mc.name = "myMc";
trace(mc.name);//「myMc」と出力

こう書けちゃうんです!勘の鋭い方はもう分かると思いますが、forで繰り返すときは、変数名.nameに代入する文字列に対して「i」とかを連結すればOK!

for(var i:int = 0; i<5; i++){
	var mc:MovieClip = new MovieClip();
	mc.name = "myMc"+i;//←ここで連番名にできる
	trace(mc.name);
}

これは、ActionScript3.0を覚える最初のほうの壁ですね。。。どなたか同じ壁にぶち当たってこれみて助かれば御の字です。

02-09-10

ActionScript3.0ではeval();が使えないので解決方法は

そろそろActionScript2.0から脱皮できそうな予感がしてきました!(オソw)そこで、ActionScript2.0でできたことで、ActionScript3.0でできないこと、その違いと方法を記録していきたいと思います。

AS3でeval();が使えない

evalは「テキストをインスタンス名のターゲットに変換してくれる」というのがボクのイメージです。
例えば、ステージ上に、mc0からmc9までのムービークリップがあるとします。これらに一気に命令する時は、
▼ActionScript1.x ~ 2.0の場合

for(var i:Number = 0; i<10; i++){
	eval("mc"+i).onRelease = function(){
		trace("ほげ");
	}
}

for文の中の変数「i」を利用して、「mc0」「mc1」「mc2」「mc3」…..「mc8」「mc9」まで一気にonReleaseのボタンが設定できました。
ActionScript3.0だとevalが使えないので、下記の方法を使います。
▼ActionScript3.0の場合

for(var i:int = 0; i<10; i++){
	this.["mc"+i].onRelease = function(){
		trace("ほげ");
	}
}

えーっと、実は、この記述の方法はActionScript1.x~2.0で、Flash Player5以上であれば使うことができます。

更にもっと深い階層になると、

for(var i:int = 0; i<10; i++){
	this.["mc"+i]["mc2"+i]["mc3"+i].onRelease = function(){
		trace("ほげ");
	}
}

と、ドットで連結させるところを、[ ] ←この括弧で連結することで、インスタンス名にアクセスすることができます。

for文でインスタンスのプロパティに対してアクセスしたい場合、getChildByNameを使ってインスタンス名を参照します。例えばX座標のとき、

for(var i:int = 0; i<10; i++){
	trace(this.getChildByName("mc"+i).x);
}