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

2010
1/12

navigateToURL+IE+wmode:”transparent”の憂鬱

addEventListenerの書き方の定番」や「ステージのインスタンスを自動宣言」と同じような、備忘録を兼ねたas3メモ。

as3で他ページへのリンクを実装する場合、通常はnavigateToURLメソッドが使われます。

package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.net.navigateToURL;
	import flash.net.URLRequest;

	public class Main extends MovieClip {
		btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
	}

	public var btn:MovieClip;

	public function onBtnClick(e:MouseEvent):void {
		var url:String = "http://www.tonpoo.com/";
		var req:URLRequest = new URLRequest(url);
		navigateToURL(req, "_self");
	}
}

(続きを読む…)


Filed under: ActionScript3,Tips,TroublesComments (0)— tonpoo @ 9:36 PM

2009
12/25

ByteArrayクラスを使って配列やオブジェクトのコピーを生成する

まず、”name”, “birth”, “part”というプロパティを持つオブジェクトを生成し、それぞれのプロパティに値を入れる。

var obj1:Object = new Object();
obj1.name = "John";
obj1.birth = 1940;
obj1.part = "guitar";
trace(obj1.name);	//出力:John

次に、このオブジェクトのコピーを作成し、一部のプロパティを変更するために、以下のスクリプトを実行する。

var obj2:Object = obj1;
obj2.name = "George";
obj2.birth = 1943;
trace(obj1.name, obj2.name);	//出力:George George

すると、コピー先(obj2)だけでなく、コピー元(obj1)のプロパティまでも変更されてしまっている。

これは、obj2 = obj1; としたとき、obj1をコピーしているのではなく、obj1への参照を作成しているにすぎないためである。
(続きを読む…)


Filed under: ActionScript3Comments (0)— tonpoo @ 12:57 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 (3)— tonpoo @ 10:55 PM

ActionScriptで別ドメインの画像を読み込んで「使う」ときの注意点

別ドメインにある画像やxmlを読み込んで処理するswfコンテンツの制作中。ポリシーファイルが必要なのはわかっていたので、画像やxmlの置いてあるサーバー(http://www.sample.server/)のルートに下記のcrossdomain.xmlを設置。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
	<allow-access-from domain="*" secure="true" />
</cross-domain-policy>

でもって、swfの方から上記サーバーのrss(http://www.sample.server/rss.php)を読み込んだ所、問題ナシ!

続けて、JPEGファイルを読み込み、BitmapData.draw()で描画しようと思った所:

セキュリティサンドボックス侵害 : BitmapData.draw:http://www.tonpoo.com/hogehoge/foobar.swf は http://www.sample.server/images/photo.jpg にアクセスできません。ポリシーファイルが必要ですが、このメディアがロードされたとき、checkPolicyFile フラグが設定されませんでした。

あれえええええ?

おかしいなと思って調べてみたら、出てきた:

AS で別ドメインの画像を読み込むときの注意点 – てっく煮ブログ

クロスドメインポリシーファイルは設置してるけどなあ、と思いながら読んでいると下記の記述:

これ以外に、Security.loadPolicyFile() メソッドを使って、事前に読み込んでおく方法もある。

これだこれだ!というわけで早速リファレンスを参照。

Security – ActionScript 3.0 コンポーネントリファレンスガイド

でもって下記の記述を追加(www付きの場合とナシの場合と両方対応するように両方を併記)。

Security.loadPolicyFile("http://sample.server/crossdomain.xml");
Security.loadPolicyFile("http://www.sample.server/crossdomain.xml");

そしたら無事解決!

crossdomain.xmlを用意しただけで安心してちゃいかんですね・・


Filed under: ActionScript3,TroublesComments (0)— tonpoo @ 7:59 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
12/16

addEventListenerの書き方の定番

昨日の「ステージのインスタンスを自動宣言」に続いて、AS3の開発ですぐ忘れてしまう件について、備忘録をかねて。ボタンアクションやらENTER_FRAMEやらの処理を行う際など、頻繁に使うのが「イベントリスナの登録」。例えばステージ上にbtn_mcというMovieClipがあったとして、このボタンをクリックしたらonBtnClickというメソッドを実行させたいというような場合、通常は下記のように記述します。

btn_mc.addEventListener(MouseEvent.CLICK, onBtnClick);

これを、addEventListenerの5つめの引数をtrueにする(3つめはfalse、4つめは0)ことで、より効率的なメモリ管理を実現出来ます。

btn_mc.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);

詳しくは上条氏の下記記事を参照下さい。

イベントリスナ (AS3) とガーベジコレクション – akihiro kamijo


Filed under: ActionScript3Comments (0)— tonpoo @ 11:19 AM

2009
12/15

ステージのインスタンスを自動宣言

ああ腹立たしい!!ActionScript3での開発もそれなりにやってきてるというのに、今でも結構単純な作業を行うのに思い通りにいかず、ストレスを感じることがあります。

今回は「ステージのインスタンスを自動宣言」について。

(続きを読む…)


Filed under: ActionScript3,TroublesComments (0)— tonpoo @ 6:55 PM

2009
9/29

TweenerColorExtension

TweenerのColorShortcutsクラスには、オブジェクトのカラーチャンネルを変更するための下記の拡張プロパティがあります。

_color_redMultiplier
_color_greenMultiplier
_color_blueMultiplier
_color_alphaMultiplier
_color_redOffset
_color_greenOffset
_color_blueOffset
_color_alphaOffset

Tweenerを使うようになる以前から、オブジェクトのカラーチャンネルを変更することは割と頻繁にあったのですが、Tweenerでこれらを設定しようと思った場合に、プロパティ名が長かったりするのでちょっと面倒だなと思ってました。

import caurina.transitions.Tweener;
import caurina.transitions.properties.ColorShortcuts;
ColorShortcuts.init();

Tweener(my_mc,{
	_color_redMultiplier:1,
	_color_greenMultiplier:1,
	_color_blueMultiplier:1,
	_color_alphaMultiplier:0.5,
	_color_redOffset:125,
	_color_greenOffset:60,
	_color_blueOffset:255,
	_color_alphaOffset:255,
	time:1,
	transition:"easeOutSine"
});

そこで、R/G/B/AのMultiplier値およびOffset値をまとめて指定するためのTweener用拡張クラス「TweenerColorExtension」を作成しました。下記の例の様に、_colorMultipliersというプロパティに[_color_redMultiplier, _color_greenMultiplier, _color_blueMultiplier, _color_alphaMultiplier]の順の配列を、_colorOffsetsというプロパティに[_color_redOffset, _color_greenOffset, _color_blueOffset, _color_alphaOffset]の順の配列を指定することで、それぞれの値を設定できます。

import caurina.transitions.Tweener;
import TweenerColorExtension;
TweenerColorExtension.init();

Tweener(my_mc,{
	_colorMultipliers:[1,1,1,0.5],
	_colorOffsets:[125,60,255,255],
	time:1,
	transition:"easeOutSine"
});

ColorShortcutsのimportやinitは必要ありません(TweenerColorExtensionのinitの中で処理してます)。

ソースコードやサンプルファイルは下記で配布してますので、もし使ってみたい方がいらっしゃったらご自由にどうぞ。

tonpoo/TweenerColorExtention – Spark project


Filed under: ActionScript3,TweenerComments (0)— tonpoo @ 11:40 AM

2009
9/1

書籍:「基本からしっかりわかるActionScript 3.0

zz2485cab9
基本からしっかりわかるActionScript 3.0 (Web Designing BOOKS)
森 巧尚 (著)

まつむらまきおさんのブログで発見。定番の「おしえてFLASH」シリーズにCS3版やAS3版が無かったので、今後人に薦めるのにどうしようと思ってたんだけど、AS3に関してはこの本がよさそう。ちょうどAS3の参考書を求めてる人がいるので、薦めるがてら購入してみようかな。


Filed under: ActionScript3Comments (0)— tonpoo @ 11:25 AM