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

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

import flash.ui.ContextMenu;
var menu_mc = new ContextMenu();
menu_mc.hideBuiltInItems();

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

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を足していくこの方法だと簡単に時を刻むことができます。

<br />
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));
}

ActionScript3.0でgetURLにかわるnavigateToURL

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

var url:URLRequest = new URLRequest("http://creator.cotapon.org/");
navigateToURL(url, "_self");
ボタンで実行する時はリスナー登録したイベントに対して書けば動作します。一回覚えてしまえば簡単ですねー。
import flash.net.URLRequest;
import flash.net.navigateToURL;
btn.addEventListener(MouseEvent.MOUSE_DOWN, btnMouseDown);
function btnMouseDown(e:MouseEvent):void {
	var url:URLRequest = new URLRequest("http://creator.cotapon.org/");
	navigateToURL(url, "_self");
}

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を覚える最初のほうの壁ですね。。。どなたか同じ壁にぶち当たってこれみて助かれば御の字です。

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);
}

ActionScriptでスペクトラムのサンプル

spectrum
※↑リンク先はポップアップします。音量に気をつけてください。
ここにあったスペクトラムのサンプルをちょこっと改造。コピペしてmp3のパスを書き換えたらとりあえず動きました。ByteArrayクラスがバイナリデータを読み取ったり操作したりすることができるみたいです。
▼参考サイト
ByteArray
http://livedocs.adobe.com/flex/3_jp/langref/flash/utils/ByteArray.html
Flash 9 Sound Spectrum!
http://theflashblog.com/?p=181
SoundMixer.computeSpectrum() stretchFactor変化デモ
http://dev.ekndesign.com/2008/02/16/soundmixercomputespectrum-stretchfactor%E5%A4%89%E5%8C%96%E3%83%87%E3%83%A2/

▼サンプルダウンロード
spectrum.zip

▼このエラーが出たときは、mp3ファイルのパスが間違っていると思います。

Error #2044: ハンドルされていない IOErrorEvent : text=Error #2032: ストリームエラー。
	at spectrum_fla::MainTimeline/frame1()

var s:Sound = new Sound();
var sc:SoundChannel;
var ba:ByteArray = new ByteArray();
var array:Array;
<p>s.load(new URLRequest("my.mp3"));
sc = s.play(0,1000);
this.addEventListener(Event.ENTER_FRAME, spectrum);
var a:Number = 0;
var al:Number = 0;
function spectrum(event:Event) {
	a = 0;
	al = 0;
	graphics.clear();
	SoundMixer.computeSpectrum(ba,true,0);
	for (var i=0; i < 180; i=i+10) {
		a = ba.readFloat();
		al = Number(a.toFixed(3));
		var num:Number = a*360;
		graphics.lineStyle(num/15,0x003333|(num << 8),al);
		graphics.drawCircle(stage.stageWidth/2,stage.stageHeight/2,i);
	}
}

ActionScriptのトゥイーン制御ライブラリTweenerの使い方

Tweener(トゥイーナー)とは

例えば、1秒かけてX座標に100pxゆるやかにだんだん加速しながら移動後に、”テスト”と出力する場合。

//ActionScript2
import caurina.transitions.Tweener;
Tweener.addTween([instance],{_x:100, time:1, transition:'easeOutQuint', onComplete:handler});
function handler(){
	trace(&quot;テスト&quot;);
}

TweenerはActionScript3.0とActionScript2.0で使用する事ができ、インスタンスに対して「だんだんゆっくり止まる」「どんどん勢いよく移動」「びょーんびょーん(?)」と、いろんなイージングが設定できるトウィーン制御ライブラリです。とても簡単なScriptで実現できます!

導入手順

▼まずはGoogle Codeに公開されているライブラリをダウンロード。
配布元:http://code.google.com/p/tweener/
ダウンロードしたzipファイルを解凍すると、「caurina」というフォルダができると思います。それをflaファイル直下、またはFlashの環境設定でクラスパスを追加します。これで準備は完了しました。

Tweenerの使い方サンプルを簡単に説明

import caurina.transitions.Tweener;
この1行は、Tweenerを使うために、ダウンロードしたTweenerライブラリをimportする記述です。ライブラリを管理している環境によって左右されますが、Flashの実行ファイルがある場所に「caurina」フォルダーを置いたら、「caurina」からの階層になります。
Tweener.addTween([instance],{
この1行の[instance]は、トゥイーンして動かしたいインスタンス名をいれます。[] ←括弧は必要ないので、例えば、「myInstance」というインスタンス名のムービークリップを動かすとした時の最初の1行は、
Tweener.addTween(myInstance,{
このようになります。

Tweenerの書き方、ActionScript3.0

import caurina.transitions.Tweener;
Tweener.addTween([instance],{
	x:100,
	y:100,
	scaleX:1,
	scaleY:1,
	rotation:0,
	alpha:1,
	time:1,
	delay:0,
	transition:'easeOutQuint',
	_Blur_blurX:20,
	_Blur_blurY:20,
	_Blur_quality:3,
	_color:0x330066,
	onComplete:onCompleteHandler,
	_bezier:[{x:115,y:115},{x:200,y:200},{x:285,y:285}]
});

Tweenerの書き方、ActionScript2.0

import caurina.transitions.Tweener;
Tweener.addTween([instance],{
	_x:100,
	_y:100,
	_scale:1,
	rotation:0,
	_alpha:1,
	time:1,
	delay:0,
	transition:'linear',
	_color:0xffffff,
	onComplete:onCompleteHandler,
	_bezier:[{x:115,y:115},{x:200,y:200},{x:285,y:285}]
});

トゥイーンの逆再生

import caurina.transitions.Tweener;
Tweener.removeTweens([instance],{
	_x:100,
	_y:100,
	_scale:1,
	rotation:0,
	_alpha:1,
	time:1,
	delay:0,
	transition:'linear',
	_color:0xffffff,
	onComplete:onCompleteHandler,
	_bezier:[{x:115,y:115},{x:200,y:200},{x:285,y:285}]
});

Tweenerのパラメータ

パラメータは必要に応じて足したり減らすことができます。

x:100,  //移動後のX座標
y:100,  //移動後のY座標
scaleX:1,  //X座標への大きさ
scaleY:1,  //Y座標への大きさ
rotation:0,  //回転
alpha:1,  //透明度
time:1,  //何秒かけるか
delay:0,  //トゥイーン開始までの待ち時間
transition:'easeOutQuint',  //トゥイーンのトランジション
_Blur_blurX:20,  //X座標へのぼかし
_Blur_blurY:20,  //Y座標へのぼかし
_Blur_quality:3,  //ぼかしのクオリティ
_color:0x330066,  //着色
onComplete:onCompleteHandler,  //トゥイーン後の処理
_bezier:[{x:115,y:115},{x:200,y:200},{x:285,y:285}]  //ベジェ曲線状にトゥイーンする通過点

BlurをつかってぼかすTweenを使う場合

ブラーを使ってぼかしをTweenさせる前に、フィルター用のライブラリを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});

動きを途中でとめる場合

Tweener.pauseTweens(mc);

エラーコード

## [Tweener] Error: The property 'x' doesn't seem to be a normal object property of [object Object] or a registered special property.
例えばコレの場合だと、「The property ‘x’」プロパティのXが間違ってますよ。ということですね。これが出たときは、「_x」と「x」の記述違いでした。AS2とAS3とではアンダーバーがいるいらないがありますので、コピペしたサンプルでエラーがでたら、プロパティを見てみましょう。

トゥイーンする動きのトランジションチートシート

どういう動きでトゥイーンするか、transitionに設定する名前が載っているチートシートです。「transition」のパラメータに「easeInSine」とか「easeInOutSine」をコピペしてつかってください。