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

2009
4/22

超訳:Tweenerドキュメント&言語リファレンス

Tweenerのドキュメントの一部を日本語化してみました。ただ、未完成&わりといいかげんなので、参考程度に利用してみてください。

【超訳:Tweenerドキュメント&言語リファレンス】

Filed under: actionscript2,actionscript3,translation,tweenerComments (2)— tonpoo @ 11:35 AM