2010
6/24

Flash Communication Server:プロキシサーバに関する問題

HTTPトンネリングの件に関連して、FCS関連でプロキシサーバを経由した場合の接続方法についての下記の記事も簡単に和訳しました。

Macromedia – Developer Center : Tunneling Macromedia Flash Communications through Firewalls and Proxy Servers. Page 3

例によって文書自体が古い上に意訳・適当な訳文ですが、HTTPトンネリングと同じく何かの参考までに。

※注:HTTPトンネリングの記事同様、こちらもリンク先が無くなってしまいました。アドビサイトにどこかに原文残ってないのかな・・・。


プロキシサーバに関する問題

内部のネットワークとインターネットとの中継役としてプロキシサーバを利用することで、組織のネットワーク環境をより安全にすることができる。WEBプロキシサーバというのは通常、ネットワークの通信料を削減するためのキャッシングサーバとして利用される。とはいえ、プロキシサーバの使い道は他にもある。

ネットワークレイヤーのファイヤーウォールとプロキシサーバを組み合わせることで、WEBへのアクセス自体は確保した上で、組織のネットワーク内にあるワークステーションから外部のネットワークに対して直接アクセスする必要がなくなる。ブラウザはリモートのサーバに対してWEBページのデータを直接要求するのではなく、プロキシサーバに対して要求しなければならない。ページのデータがキャッシュされていなかった場合には、プロキシサーバがリモートのサーバに対してリクエストを行ない、返ってきたデータをブラウザに戻すことになる。プロキシサーバが中継役として存在する場合、ファイヤーウォールは基本的にネットワーク内部から外部に対して直接送出されるリクエストは全てブロックするように設定されていることが多い―――たとえそれが80番ポートに対するものであったとしても。プロキシサーバだけが80番ポートを通じて外側の世界との接続を許されているのだ(図8を参照)。

HTTPトンネリングを使わない場合、プロキシサーバの内側にいて、インターネットへの直接接続が許可されていない環境にあるユーザーはコミュニケーションサーバへの接続ができない。HTTPトンネリングを使えばできるようになることがしばしばある。プロキシサーバからしてみれば、RTMPTを使った接続要求というのは通常のHTTPリクエストと同様に捉えられる。コミュニケーションサーバからのレスポンスもHTTPレスポンスと同様に判断される。このため、プロキシサーバはRTMPTリクエストの送出もコミュニケーションサーバからのデータ受信についても対応できるはずである。ところが、HTTPトンネリングがうまくいくかどうかは保証されていないのだ。プロキシサーバにはWEBページをキャッシュする中継役以上の機能がある。それは、外部のネットワークリソースに対するアクセスの制御ということだ。例えば、プロキシの管理者はアクセス禁止サイトのリストを作成し、プロキシサーバ内の全ユーザーに対して、それらのサイトへのアクセスを拒否することができる。プロキシサーバの中には、さらに詳細にデータの調査やフィルタリングが可能なものもある。例えば、特定のコンテンツや、text/thmlのようなMIMEタイプのみを許可することもできる。WEBサーバがWEBページのデータをブラウザに対して返す際、HTTPヘッダにはContentTypeというデータが含まれる。WEBサーバがWEBページのデータを送出する場合のHTTPヘッダの書式は以下のようになる:

HTTP/1.1 200 OK
Server: Netscape-Enterprise/6.0
Date: Sat, 24 May 2003 01:09:43 GMT
Content-type: text/html
Etag: "c96066c3-1-0-1e8"
Last-modified: Tue, 25 Jun 1996 19:11:18 GMT
Content-length: 488
Accept-ranges: bytes

また、画像データを送出する場合のHTTPヘッダの書式は以下のようになる:

HTTP/1.1 200 OK
Server: Netscape-Enterprise/6.0
Date: Sat, 24 May 2003 01:51:17 GMT
Content-type: image/gif
Etag: "782311ca-126-0-f1ae"
Last-modified: Mon, 06 May 2002 21:10:38 GMT
Content-length: 61870
Accept-ranges: bytes

Macromedia Flash Communication Serverが返すデータはテキストデータではないが、HTTPヘッダにはContent-typeの記述が含まれない。そして、Content-typeが記述されていない場合にはtext/htmlと判断されてしまう。このため、RTMPTのトラフィックであっても、全てのプロキシサーバを通過できるという保証は無いのである。プロキシサーバとアプリケーションレイヤのファイヤーウォールというものが、システムアドミニストレータの設定した幅広いバリエーションのルールに従ってコンテンツのフィルタリングを行うように作られているということを考慮すれば、これはおかしなことではない。ITセキュリティの部署が正規のHTML文書といくつかの画像フォーマット(image/GIFなど)のみを許可すると決定したならば、それを実現するための精巧なツールが開発されるということだ。もしRTMPT接続さえも通さないプロキシサーバの場合は、組織のファイヤーウォール担当の管理者に連絡を取り、プロキシサーバの例外設定が可能かどうか確認するといい。

fig08

図8.プロキシサーバとファイヤーウォール

注:各端末(Workstation)はインターネットに直接接続することはできず、必ずプロキシサーバを通してリソース要求を行うことになる。プロキシサーバはインターネットからリソースを取得し、それを各端末に転送する。各端末がファイヤーウォールを越えて外部のシステムにアクセスすることは決してない。

一度に複数のポートを利用する

Macromediaは先日、Flash Communication Server バージョン1.5のリリースとともに、Flash Communication Serverコンポーネントのアップデート版をリリースした。このアップデートの目玉のひとつが、Simple Connectコンポーネント内部に新規に追加されたコードである。このアップデートによって、デフォルトのRTMPポート(1935)経由で到達できないサーバへの接続時間を短縮するための機能が追加された。Simple Connectコンポーネントのアプリケーションディレクトリのパラメーターに「rtmp」が指定されていて、かつポート番号が指定されていない場合、Simple Connectコンポーネントは次のように動作する:

  1. NetConnectionオブジェクトを生成し、指定されたアドレスに対して、1935番ポートを使って通常の接続を試みる。
  2. 2つめのNetConnectionオブジェクトを生成し、250ミリ秒待機した後、サーバに対して80番ポートを使ったRTMPT接続を試みる。
  3. 先に接続が成功した方を受け入れ、もう片方のNetConnectionオブジェクトは接続を閉じてから破棄する。

厳密に言えばこのようなやり方は必要ない。FlashPlayerはデフォルトでまず1935番ポートを使ったRTMP接続を試み、その後443番ポート、80番ポートを試みる。その後、80番ポートを使ったRTMPT接続を試みるからだ。ただしこれらの試みは時間がかかる。はじめのRTMP接続が失敗した場合、250ミリ秒後に80番ポートを使ったRMTPT接続を試みることで、接続プロセスにかかる時間は劇的に短縮されるのだ。このコンポーネントの作りを理解するため、FCSimpleConnectClassのactualConnect()メソッドを見てみよう。すべての人がSimple Connectコンポーネントを使うわけではないので、以下に示すコードは本来のコードを少々編集したものになっている。ただし行っている処理はほぼ同じだ。筆者はこのコードをメインのタイムラインに記述したが、よりオブジェクト指向的なアプローチで書き換えることも可能である。

//接続に成功するとonConnectファンクションが実行される
function onConnect(nc) {
	_global.main_nc = nc;// グローバル変数に接続成功済みのNetConnectionオブジェクトを記録
	// 確認のためURIをtraceし、使用中のプロトコルを確認
	trace("onConnect> "+nc.uri);
	// 接続に成功したNetConnectionオブジェクトのためのonStatusハンドラを生成
	main_nc.onStatus = function(info) {
		//ここに各種のイベントをハンドルするためのコードを記述
		//以下のコードはinfoオブジェクトの内容を出力するもの
		trace("----main_nc.onStatus----");
		for (var p in info) {
			trace(p+": "+info[p]);
		}
	};
	//あとは他のコンポーネントに接続したりプログラムを初期化するなど・・・
}

//接続に失敗するとonConnectFailedファンクションが実行される
function onConnectFailed(info) {
	//infoオブジェクトを検証し、接続失敗の原因についてレポートする
	//以下のコードは単にinfoオブジェクトの内容をtraceしているだけなので、
	//各自でエラーハンドリングコードを書き換えること
	trace("----onConnectFailed----");
	//infoオブジェクトの全プロパティの分ループ処理
	for (var p in info) {
		trace(p+": "+info[p]);
		// If the application rejects the connection and passes back
		// and application object loop through all its properties too.
		if (p == "application") {
			var appObj = info.application;
			for (var q in appObj) {
				trace("   "+q+": "+appObj[q]);
			}
		}
	}
}

//RTMP接続用のNetConnectionオブジェクトを生成
rtmp_nc = new NetConnection();
//こちらの接続が先に成功した場合に、rtmpt_ncオブジェクトを破棄するための
//onStatusハンドラを生成
rtmp_nc.onStatus = function(info) {
	this.pending = false;
	if (info.code == "NetConnection.Connect.Success") {
		if (rtmpt_nc.pending) {
			rtmpt_nc.onStatus = null;
			rtmpt_nc.close();
			rtmpt_nc = null;
			clearInterval(connectionID);
		}
		onConnect(this);
	} else if (!rtmpt_nc.pending) {
		onConnectFailed(info);
	}
};

//RTMPT接続用のNetConnectionオブジェクトを生成
rtmpt_nc = new NetConnection();
//こちらの接続が先に成功した場合に、rtmp_ncオブジェクトを破棄するための
//onStatusハンドラを生成
rtmpt_nc.onStatus = function(info) {
	this.pending = false;
	if (info.code == "NetConnection.Connect.Success") {
		if (rtmp_nc.pending) {
			rtmp_nc.onStatus = null;
			rtmp_nc.close();
			rtmp_nc = null;
		}
		onConnect(this);
	} else if (!rtmp_nc.pending) {
		onConnectFailed(info);
	}
};

//どちらのNetConnectionオブジェクトについてもペンディングフラグを立てておく
rtmp_nc.pending = true;
rtmpt_nc.pending = true;

//rtmp接続を試みる
rtmp_nc.connect("rtmp://host.domain.com/myApp/myInstance",userName,password);

//rtmpt接続を400ミリ秒後に行うように設定
connectionID = setInterval(connectRTMPT, 400);

//このファンクションが実行されたらインターバルを破棄してRTMPT接続を試みる
function connectRTMPT() {
	clearInterval(connectionID);
	rtmpt_nc.connect("rtmpt://host.domain.com/myApp/myInstance",userName,password);
}
//80番ポートが使えず、8080番ポートを使う場合などのconnectRTMPTメソッドの記述例は以下のとおり
function connectRTMPT() {
	clearInterval(connectionID);
	rtmpt_nc.connect("rtmpt://myHost.myDomain.com:8080/myApp/myInstance",userName,password);
}

Filed under: ActionScript2,ActionScript3,TranslationComments (0)— tonpoo @ 1:22 PM

2010
6/15

Flash Communication Server:HTTPトンネリングプロトコルについて

諸事情からFlashCommunicationServerへのHTTPトンネリング接続の方法について調べる機会があり、下記のドキュメントを簡単に和訳してみました。

HTTP Tunneling protocols

※注:リンク先が無くなってしまいました・・・。げ、原文まだどっかに残ってないかな・・・。

旧Macromedia時代の文書で、例によってかなり意訳・適当な訳文ですが、何かの参考までに。


HTTPトンネリングプロトコル

RTMP、RTMPT、RTMPS

FlashPlayerはFlashCommunicationServerと通信する際、デフォルトではRTMPプロトコルを使い、1935番ポートに接続する。 失敗したら443番ポートと80番ポートでの接続を試みる。 ファイヤーウォールが設定されている場合、非標準のポートを経由したTCP/IP通信が許可されていないことがあるため。 これらの手法で、およそ96%のユーザーをカバーすることができるはず。

100%に近いユーザーをカバーするためには(もしあれば)プロクシを通すか、ファイヤーウォールのためにHTTP通信しかできない場合などはHTTPトンネリングを使ってHTTPプロトコル越しにRTMPパケットを送信することになる。

以前のFlashPlayerでは、サーバへの通信要求は常にRTMPプロトコルで行われ、オプションとしてポート番号を指定することが可能であった。以下のコードでは、RTMPを利用し、1935番、443番、80番の3つのポートを使った計3回の接続を試みる。

nc.connect("rtmp://mysite.com/myapp");

以下のようにしてポート番号を指定した場合には、指定されたポート番号を使った1回の接続のみを試みる。

nc.connect("rtmp://mysite.com:PORT/myapp");

現在のFlashPlayerでは、以下の3つのうちどれか一つのプロトコルを使った接続がサポートされるようになった。

  • RTMP(デフォルトポート:1935)
  • RTMPT(HTTPを経由したトンネリング。デフォルトポート:80)
  • RTMPS(HTTPSを経由したトンネリング。デフォルトポート:443)

コードの書式は以下のようになる。

  • nc.connect("rtmpt://flashteam.macromedia.com/myapp");
  • nc.connect("rtmps://flashteam.macromedia.com/myapp");

上記の場合、各プロトコルのデフォルトポートに対しての計1回の接続のみを試みる。

ポート番号を指定する場合の書式は以下の通り。

  • nc.connect("rtmp://flashteam.macromedia.com:PORT/myapp");
  • nc.connect("rtmpt://flashteam.macromedia.com:PORT/myapp");
  • nc.connect("rtmps://flashteam.macromedia.com:PORT/myapp");

上記の場合は、指定されたポートに対しての計1回の接続を試みる。

また、以下のような特殊な接続方法もある。

  • nc.connect("rtmp://flashteam.macromedia.com/myapp");

この場合、RTMP:1935を試みたあとにRTMPT:80(昔のHTTP:80に代わるもの)を試みる。

新しいFlashPlayerでは、これは「万が一の場合の代替手法」として機能している。もしデフォルトの方法が失敗した場合、FlashPlayerは80番ポートでの接続を試みる。おそらくこれがHTTPトンネリングのための最も一般的な手法であろう。

メモ:HTTPトンネリングはリアルタイムな音声・映像配信のパフォーマンスに影響をおよぼすことがある。


・・・結論としては、以下の方法がベスト、っていう認識でいいのかな。

nc.connect("rtmp://flashteam.macromedia.com/myapp");

Filed under: ActionScript2,ActionScript3,TranslationComments (0)— tonpoo @ 2:39 PM

2010
3/3

BitmapDataの「2880ピクセルの罠」もとい、「幅or高さ8,192ピクセル&ピクセル総数16,777,216の罠」

またまた今更ながらの備忘録メモ。FlashPlayer8から使えるようになったBitmapDataクラスによって、動的にフィルターをかけたり、グラデーションのついたマスク表現などを使えるようになりました。

が、フィルターやグラデーションマスクといった機能、サイズ(ファイルサイズではなく、width x heightのサイズ)の大きな画像やオブジェクトに対しては効きません。具体的には、対象となるオブジェクトのwidthまたはheightが2880ピクセルを超過すると、こうした機能が無効になります。

で、その詳しい理由については下記のURLが詳しい:

Flash 8 のイメージ API の概要 | デベロッパーセンター

該当する部分の引用:

メモ : Flash Player では、ビットマップの最大サイズは幅、高さいずれも 2880 ピクセルに制限されています。この制約よりも大きい BitmapData インスタンスを作成しようとすると、ビットマップは作成されません。これは、クライアントの RAM を使い切るような Flash ムービーを作成できないようにするために設定されています。2880 × 2880 ピクセルのビットマップには、約 32 MB 程度の RAM が必要です。

残念ながらFlashPlayer10でもまだこの点についての変更は無い模様。なぜこの記事を書いてるかというと、今現在この問題で引っかかってるため。さて、どうして回避したものか・・・。

<追記>

kaedeさんからコメントで情報いただきましたが、FlashPlayer10からはBitmapDataサイズの制限が拡大されていますね。

BitmapData – ActionScript 3.0 言語およびコンポーネントリファレンス

当該部分を引用:

AIR 1.5 および Flash Player 10 では、BitmapData オブジェクトの最大サイズは幅または高さが 8,192 ピクセルで、ピクセルの総数は 16,777,216 を超えないようにする必要があります(したがって、BitmapData オブジェクトの幅が 8,192 ピクセルの場合、高さは 2,048 ピクセル以下にする必要があります)。Flash Player 9 以前および AIR 1.1 以前では、高さの制限は 2,880 ピクセル、幅の制限は 2,880 ピクセルです。幅または高さに 2880 より大きい値を指定すると、新しいインスタンスは作成されません。

なるほど、8192 x 8192ピクセル、ってのはダメなんですね。で、改めて今回作業してるファイルを見ると、cacheAsBitmapかけようと思ったインスタンスの横幅が9600ピクセル・・・。そ、そりゃあダメですよね。


Filed under: ActionScript2,ActionScript3,TroublesComments (2)— tonpoo @ 12:37 PM

2009
12/22

FlashからExternalInterfaceクラスを使ってLightboxを呼び出す

「Flash(swf)からLightboxを呼び出す」というニーズがこれまでに何回かあり、またついさっきもあって、その都度ちょっと面倒だったりしたのでメモ。なお、ウチの会社ではswfファイルの埋め込みには通常swfobject2を使ってるので、以下は「Lightbox2.04 + swfobject2 + ActionScript(ExternalInterfaceクラス)」という組み合わせが前提となっています。

Lightboxを入手

まず使用するLightboxのバージョンは2.04。Lokesh Dhakar氏によるLightbox 2の公式サイトで入手。

ベースHTMLの作成

次にベースとなるHTMLを作成。今回はとりあえずSWFObject 2 HTML and JavaScript ジェネレーターを使ってサクっと作りました。ポイントとしては、「SWFの定義」のオプションを一部変更すること。
ss1

(続きを読む…)


Filed under: ActionScript2,ActionScript3,SWFObject,TipsComments (1)— tonpoo @ 10:55 PM

2009
12/19

ECMAScript 第5版承認-ActionScript次期バージョンはどうなるか?

前にECMAScript HarmonyとActionScriptという記事を書きましたが、そのECMAScriptの最新版、ECMA-262第5版の仕様策定が完了したそうです。

ECMAScript 第5版 承認 – スラッシュドット・ジャパン
InfoQ: ECMAScript 5リリース

上記ページを読んでも正直よくわかんないんですが、前者の記事では

Microsoft/Yahooが主導するマイナーチェンジとバグフィックスが主のECMAScript 3.1と、 Adobe/Mozilla/Opera/Googleが主導する野心的な機能拡張である ECMAScript 4の間で対立があったが、 ECMAScript Harmonyと呼ばれる統合計画によって ES3.1をベースに ES4のサブセットを取り込む形で両者が合意した経緯がある。

・・・と書かれている一方、後者の記事では

ECMAScript 4を合理化しようという初期の試みは大失敗に終わった。結局、Adobe社のActionScriptだけが提案された変更点に対応しただけだった。

・・・と書かれています。これはつまり、
●ECMAScript本体の方は3.1をベースにES4の一部機能(仕様)を取り込むにとどまった。
●ES4に対応したのはActionScriptだけだった。
・・・というようなことなんでしょうか?

とりあえず、ActionScript次期バージョンへの影響が心配されます。AS3にやっと慣れてきた手前、この学習資産が無駄にならなきゃいいんだけど・・・。


Filed under: ActionScript2,ActionScript3,TopicsComments (0)— tonpoo @ 7:40 PM

2009
7/21

ECMAScript HarmonyとActionScript

先日、とある機会に友人と話をしていたときのこと。(webページの記述言語が)html4.01からxhtml1.0になり、かつては書籍などにも↓

HTMLは1999年12月公表の4.01で終了しており、マークアップ言語の開発はXHTMLに引き継がれている

・・・とまで書かれていたにもかかわらず、当のxhtmlの策定が打ち切られ、webページの記述言語は再びhtmlに戻ることになるらしい。「今後はこっちが主流になるよ、って言うんで勉強しても、数年たったら結局あっちに戻る」とかって言うのは嫌ですねえ。なんていう話をしたら、「そうですよねえ。ActionScriptもそんな感じらしいですよ」と言われてビックリ!

で、その時は酒が入ってたので、その後調べるのを忘れてしまっていたんだけど、さっきたまたま関連する記事を発見。

BeInteractive! [ECMAScript Harmony と ActionScript]

今新たに策定されようしている ECMAScript Harmony は、ECMAScript 3.1 がベースで、今まで策定されてきた ECMAScript 4 とは異なる部分が多々あります。そのため、ECMAScript 4 準拠を目指していた ActionScript 3.0 は、当然のことながら ECMAScript Harmony と異なる部分が多々あります。そして、現時点で、ECMAScript Harmony には、パッケージや名前空間といった仕様は入れず、今後も議論の対象としない、ということが決定しているので、ActionScript 3.0 は機能を削らない限り、ECMAScript Harmony 非互換非準拠になることが既に決定している訳です。

・・・ってコレ一年前の記事じゃないですか!えええええ。し、知らなかった・・・。むー、もしかして次期バージョン(ActionScript4?)では、ECMAScript3準拠のActionScript1ないし2の書き方に戻るようになったりするんでしょうか。うー、憂鬱・・・。


Filed under: ActionScript2,ActionScript3Comments (0)— tonpoo @ 10:02 AM

2009
6/25

FlashDevelopのコードアシスト機能

昨日のSpark project 勉強会 #10の中で、Adobeの西村さんがFlash Builderの特徴(?)として挙げていた項目の中に、「ASDocの参照機能」と「getter/setterを一発で設定できる」というものがあった様に記憶してるんですが、これらの機能はFlashDevelopでも存在するんですね。

Flash Develop + CS3 – Flash OOP Japan
以下、上記ページからの引用:

【FlashDevelopコードアシスト.xls】

[Ctrl]

[Space]

文脈に応じたコードヒントが表示されます。”.”の後や途中まで入力したプロパティ名など、色んなところで使ってみてください。
[Ctrl]

[Shift]

[Space]

メソッドの () の中で使用すると、そのメソッドの引数に関して説明が表示されます。メソッドにASDocがあればそれに応じた説明が表示されます。説明が多い場合は省略して表示されますが、その際は[F1]キーで拡大できます。なお、IMEが全角の場合は無効となるので注意してください。
[Ctrl]

[Alt]

[Space]

そのプロジェクトで使えるクラスのリストが表示されます。
[Ctrl]

[Shift]

[1]

最新版 Beta6 より追加された新機能で、文脈に応じたコード生成を行います。
例えば、
・addEventListener() の、引数内のイベントタイプ・ハンドラ関数名よりイベントハンドラ関数のコード生成
変数名より getter/setter 関数のコード生成
・関数内のローカル変数をインスタンスプロパティへ変換しコード生成
マウスカーソルの位置を変えて実行してみてください。なお、公式Wikiにはキャプチャ画像つきで詳しく載っています。
http://www.flashdevelop.org/wikidocs/index.php?title=Features:Generation

FlashDevelop、すばらしい!(Adobeさん、スイマセン・・・)


Filed under: ActionScript2,ActionScript3,Flash,FlashDevelopComments (0)— tonpoo @ 8:45 PM

2009
5/29

MovieClip.scrollRectプロパティ

「超訳:Tweenerドキュメント&言語リファレンス」の翻訳作業を進める中で、MovieClip.scrollRectプロパティというものの存在を知った。

import flash.geom.Rectangle;

//ステージ上にムービークリップ(灰色・100×300)を生成
var mc:MovieClip = this.createEmptyMovieClip(“movie_mc”,this.getNextHighestDepth());
mc.beginFill(0×999999);
mc.moveTo(0,0);
mc.lineTo(100,0);
mc.lineTo(100,300);
mc.lineTo(0,300);
mc.endFill();

//生成したムービークリップの中にテキストフィールドを生成し、ダミーテキストを表示
var txt:TextField = mc.createTextField(“movie_txt”,mc.getNextHighestDepth(),0,0,100,300);
txt.wordWrap = true;
txt.multiline = true;
txt.text = “Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.”;

//scrollRectとして設定するためのRectangleオブジェクトを生成
var rect:Rectangle = new Rectangle(0,0,mc._width,100);

//生成したムービークリップのscrollRectとしてrectを設定
mc.scrollRect = rect;
//scrollRectプロパティを設定したムービークリップのcachaAsBitmapプロパティをtrueに設定
mc.cacheAsBitmap = true;

ここまでだとマスクと何ら変わりない。scrollRectの「scrollって何?」って思ったら、こういうことらしい↓

this.onMouseDown = function():Void{
    this.onEnterFrame = function():Void{
        //scrollRectに設定したRectangleオブジェクトのyプロパティを変更
        rect.y ++;
        //scrollRectオブジェクトを再設定
        mc.scrollRect = rect;
    };
};

this.onMouseUp = function():Void{
    delete this.onEnterFrame;
};

おお、スクロールする!うん、割とこれは便利かもしれないですね。今後、活用しよう。

ちなみにTweenerの特殊プロパティを使ってscrollRectをトゥイーンさせた例は下記の通り。

import flash.geom.Rectangle;
import caurina.transitions.Tweener;
import caurina.transitions.properties.DisplayShortcuts;
DisplayShortcuts.init();

//ステージ上にムービークリップ(灰色・100×300)を生成
var mc:MovieClip = this.createEmptyMovieClip(“movie_mc”,this.getNextHighestDepth());
mc.beginFill(0×999999);
mc.moveTo(0,0);
mc.lineTo(100,0);
mc.lineTo(100,300);
mc.lineTo(0,300);
mc.endFill();

//生成したムービークリップの中にテキストフィールドを生成し、ダミーテキストを表示
var txt:TextField = mc.createTextField(“movie_txt”,mc.getNextHighestDepth(),0,0,100,300);
txt.wordWrap = true;
txt.multiline = true;
txt.text = “Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.”;

//scrollRectとして設定するためのRectangleオブジェクトを生成
var rect:Rectangle = new Rectangle(0,0,mc._width,100);
mc.scrollRect =rect;
//scrollRectプロパティを設定したムービークリップのcachaAsBitmapプロパティをtrueに設定
mc.cacheAsBitmap = true;

//Tweenerの特殊プロパティを使ってscrollRectを操作
this.onMouseDown = function():Void{
    Tweener.addTween(mc,{
        _scrollRect:rect,
        _scrollRect_y:(mc._height),
        time:2
    });
};

Filed under: ActionScript2Comments (2)— tonpoo @ 6:41 PM

2009
5/20

配列の(浅い)コピー

ActionScriptで配列をコピーする方法について。

Flash CS4 Professional ActionScript 2.0

下記のように単に元配列を参照しただけでは、copy_arrayへの変更が元配列(base_array)にも及んでしまう。

var base_array:Array = new Array(“a”,“b”,“c”);
var copy_array:Array = base_array;
copy_array.shift();
trace(base_array); //”b”,”c”←base_arrayの方も変更されている
trace(copy_array); //”b”,”c”

Array.slice()メソッドを引数なしで使うことで、配列の(浅い)コピーを作ることができる。

var base_array:Array = new Array(“a”,“b”,“c”);
var copy_array:Array = base_array.slice();
copy_array.shift();
trace(base_array); //”a”,”b”,”c”←base_arrayの方は元のまま
trace(copy_array); //”b”,”c”

Filed under: ActionScript2,FlashComments (0)— tonpoo @ 5:48 PM

Tweener 1.32.74

Tweenerがバージョンアップ(1.31.74→1.32.74)との報告が公式MLでありました。

[Tweener] Tweener 1.32.74

変更点についての記述は下記の通り(一部抜粋)。

変更点は至ってわずか(ほんのコード2行分)。でも重要な変更です。

*Tweenの上書きを「オプション」扱いとし、デフォルトでは無効とした。
*addTween()に「overwrite:」パラメーターを新規に追加。この値が「true」だったら、新しいtweenとオーバーラップする同一オブジェクトの同一プロパティに設定されているすべてのtweenを上書きする。

Tweenの上書きをたくさん使ってるような場合には、この変更によって互換性が失われることがあるかもしれません。ただ、特に大量の数のtweenを生成する場合のパフォーマンスが大幅に向上されるので、こうすることが重要だと考えました。

公式サイトの方にはまだ反映されてないし、上記メールの文中にあるURLはSVN用のものなので、Subversion使ってる人向けってことですかね。


Filed under: ActionScript2,ActionScript3,TweenerComments (0)— tonpoo @ 10:28 AM