ActionScript3.0から、Flash領域内で右クリックしたときに出るコンテキストメニューを非表示にすることができるようになりました。
ActionScript3 1
2
3
import flash.ui.ContextMenu; var menu_mc = new ContextMenu(); menu_mc.hideBuiltInItems(); 拡大縮小や描画領域を表示させるのはユーザーの方に見せる必要がないと思い消してもいいと思いますが、コンテンツによってはセキュリティーの設定項目と、Flash Playerとは。のメニューは残しておいたほうがいいかもしれへんなぁーっと個人的には思いました。
ローカルの時間を取得する方法 この辺の感覚はAS1、2とあまりかわらないですね。
ActionScript3 1
2
3
4
5
6
7
8
9
10
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などを入れることによって正しい時間を表示させることもできます。
ActionScript3 1
2
3
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.
古のFlashからあるgetURL関数がAS3でなくなっていることに戸惑われた方もいらっしゃるのではないでしょうか。AS3の仕様変更により、URLRequestクラスの変数に、ページ遷移する先のURLテキストを持たせて、navigateToURL関数の引数に渡してあげるとページ遷移します。
ActionScript 1
2
var url:URLRequest = new URLRequest("http://creator.cotapon.org/"); navigateToURL(url, "_self"); ボタンで実行する時はリスナー登録したイベントに対して書けば動作します。一回覚えてしまえば簡単ですねー。
ActionScript 1
2
3
4
5
6
7
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"); }
ActionScriptでクロスドメインを認識させる方法は、
ActionScript 1
Security.loadPolicyFile("http://mysite.com/crossdomain.xml"); ↑たぶん、このようにスクリプトを書きます。
ActionScript 1
Security.loadPolicyFile("http://mysite.com/sitemap/crossdomain.xml"); ↑状況によってはドキュメントルート直下に「crossdomain.xml」置けないときもあると思います。
ボクは事情により後者で設定してFlashを再生させると、、
Error #2044: ハンドルされていない SecurityErrorEvent : text=Error #2048: セキュリティサンドボックス侵害 (※これはFlash Debug Playerからのアラートです) 出た!出たよ!!出てしまったよ!!!(TOT)
そこでFlashTracerでログを追跡してどんなエラーが出ているかを調べてみました。
ここでクロスドメインの構造をサクッと説明しますが、ドキュメントルート以外のクロスドメインの方法は更に下のほうに書きます。
crossdomain.xmlの設置と記述方法 Flashのクロスドメイン問題はいにしえからある問題です。 そもそもクロスドメインというのは、swfファイルを貼り付けているHTMLをからみて、外部ファイルをロードするときに、そのファイルが置いてある場所は、HTMLファイルとは違うドメインという状態のことを指します。つまり、FlashPlayerは他人のドメインを攻撃してしまわないようにしているわけです。でも、世の中には写真共有サービスがあったりRSSコンテンツがあったりAPIなんかもあります。そういった場合は、どこからでも情報を取得してもいいですよ。といった感じに許可をすることができます。 その許可をするための設定ファイルが、 crossdomain.xml にあたります。
たとえば、自分のサイト http://mysite.com というサイトに表示させるFlashコンテンツが http://hoge.com というサイトにあるRSSをロードするとします。 この場合、クロスしてますよね。 hoge.com サイトは、 mysite.com がRSSをロードしてもいいよ!と許可をする為に、 crossdomain.xml をドキュメントルートの場所においてあげます。 アドレスは
http://hoge.com/crossdomain.xml このようになります。実際に、この crossdomain.
ライブラリにおいてあるムービークリップに対して、リンゲージでActionScriptに書き出しをチェックを入れてクラス化したモノを、var 変数名:クラス名 = new クラス名();で生成して、stage.addChild(変数名);でステージに配置するのは基本だと思います。が、この一連の流れで一体どこにインスタンス名を設定するのか非常に悩んでしまいました。
単純にMovieClipを生成するだけなら、 var 変数名:MovieClip = new MovieClip(); でできちゃいます。ActionScript2以下の場合では、createEmptyMovieClipを使って空のMovieClipを生成していたと思います。
インスタンスを作成する場所.createEmptyMovieClip(インスタンス名, 深度)
第二引数にインスタンス名を設定ができ、例えばforで繰り返し生成する場合は、インスタンス名に対して「i」を連結させて連番名などにしたりしていました。さて、、ActionScript3.0ではどうするのでしょうか。。。
まず、空のMovieClipを生成した時の名前を調べました。
ActionScript3 1
2
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したインスタンス名に設定できることが分かりました、つまり、
ActionScript3 1
2
3
var mc:MovieClip = new MovieClip(); mc.name = "myMc"; trace(mc.name);//「myMc」と出力 こう書けちゃうんです!勘の鋭い方はもう分かると思いますが、forで繰り返すときは、変数名.
そろそろActionScript2.0から脱皮できそうな予感がしてきました!(オソw)そこで、ActionScript2.0でできたことで、ActionScript3.0でできないこと、その違いと方法を記録していきたいと思います。
AS3でeval();が使えない evalは「テキストをインスタンス名のターゲットに変換してくれる」というのがボクのイメージです。
例えば、ステージ上に、mc0からmc9までのムービークリップがあるとします。これらに一気に命令する時は、
ActionScript1.x ~ 2.0の場合 ActionScript 1
2
3
4
5
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の場合 ActionScript3 1
2
3
4
5
for(var i:int = 0; i<10; i++){ this.["mc"+i].onRelease = function(){ trace("ほげ"); } } えーっと、実は、この記述の方法はActionScript1.