Home > flash

flash Archive

TextFieldから文字列が溢れたときに「…」ってするやつのasを少し高速化

TextFieldから文字列がはみ出した時の処理 – blog.nium.jpを読んでいて、高速化できそうだと思ったのでほんの少しいじくりました。

ソースだけ必要な人もいると思うのでいきなりソース!適当なクラスのstaticにでも置いてください。

public static function trimmingText(textField:TextField, endText:String = "...", defaultFontSize:Number = 12):void
{
	textField.wordWrap = false;
	if (textField.maxScrollH <= 0)
		return;
	textField.appendText(endText);
	var text:String = textField.text;

	//ループの回数を減らす
	if (textField.maxScrollH > defaultFontSize * 1.5);
		textField.text = text.slice(0, text.length - endText.length - 1 - Math.ceil(textField.maxScrollH / defaultFontSize)) + endText;
	while (textField.maxScrollH > 0)
	{
		text = textField.text;
		textField.text = text.slice(0, text.length - endText.length - 1) + endText;
	}
}
//こうやって使う
var unko_txt:TextField = addChild(new TextField()) as TextField;
unko_txt.width = 100;
unko_txt.autoSize = TextFieldAutoSize.LEFT;
unko_txt.text = "君、ウンコくさいね。すごく臭うからしたよね?ね?ね?君が好き。"
Hogehoge.trimmingText(unko_txt);

本家でのソースの流れ

本題に入る前に、本家ではどういう処理をしてるかを少し説明します。

  1. 水平スクロールがあれば
  2. テキストフィールドの最後に”…”をつける
  3. 水平スクロールがなくなるまで↓をループする
  4. 1文字ずつ削除していく

以下高速化をした点

テキストをトリミングする方法を配列じゃなくて、Stringをいじくる方法に変えた

配列はnewして、中身を入れるときがずいぶん重いらしいので、普通のStringをいじくる方法にしてみた。5~10%高速化。

//配列を作ってspliceして、joinするという、配列生成+操作が重そうだったので
//var words:Array = textField.text.split( "" );
//words.splice( words.length - 4, 1);
//textField.text = words.join( "" );
 textField.text = text.slice(0, text.length - endText.length - 1) + endText;

whileループの回数を減らすために、if分をひとつ挟んで、がっつり削除する

1文字ずつ削除するのがもったいない気がするので、ある程度がっつり削除する方向にしてみた。文字数にもよるけれど、80%高速化

 if (textField.maxScrollH > defaultFontSize * 1.5);
 	textField.text = text.slice(0, text.length - endText.length - 1 - Math.ceil(textField.maxScrollH / defaultFontSize)) + endText;

whileループ前に一枚かませます。あふれた文字数をフォントサイズから割り出してがっつり削除します。半角文字などが大量にあると一発では消えませんが、それでもかなりの量の文字を一気に消せます。

図にするとこんな感じです。

(textField.getTextFormat().sizeからフォントサイズを取得できますが、ここでいちいち取得してると重くなるので引数にしています)

結果 45ms → 5ms

計測方法は

  • 以下の文章が入ったTextFieldを5つ用意してまわしました。
    □□□□■□□□□1□□□□■□□□□2□□□□■□□□□3□□□□■□□□□4□□□□■□□□□5□□□□■□□□□6□□□□■□□□□7□□□□■□□□□8□□□□■□□□□9□□□□■□□□□10
  • TextFieldのwidthは200にしました。

for文で10万回まわしたとかじゃないですよ。日常的に使う場面っぽくしてみました。

ちっさいところとは言えど、ループ回数が多いのと、描画に関わるところなので若干の高速化ができました。

デザイナー上がりのFlasher1年生が読んだ19冊の本を、これほどかというほどに感想を書きます。だいたい3行だけど。

Flasherになって1年が経ちました。この1年いろいろと勉強さしてもらいました。

大掃除で本の片付けついでに、今年買ったFlash技術周辺本のレビューでもしましょう。

途中までしか読んでない本が大半ですが、まったく読まなかった本もあります。
ここでは最低でも50ページは読んだ本19冊を選抜しました。Flash本9冊、それ以外10冊です。

ずらずらと並べた19冊の感想を読むのはつらいと思うので、1冊だけ「ムツゴロウさんの動物王国のナレーション」のモノマネをしながら書いています。

2008-01月~03月に読んだ本

01.ActionScript 3.0 アニメーション

★★★★★。オススメ。3か月で全ページ読破しようと思ってた。

結局、最後の100ページは流し読みをしたけれど、初心者にはかなりいい内容。とりあえず大量のモノを動かして、ある程度の高速化を意識して…という基本がわかればええと思う。

02.UMLモデリングレッスン-21の基本パターンでわかる要求モデルの作り方

★★★☆☆。例がFlashと無縁なので忍耐が必要。

UMLでも勉強しようと思って買った。この手の本に共通して言えるのが、例がよくわからんのだ。会員が何かを購買した情報を分類したり、従業員の種類を気にしたり、顧客の種類を気にしたり、といった「Flashではない向こう側のプログラミング」の例だらけだ。このような例に耐えられる、もしくはそんなん気にせず本質を読み取れるならいい本じゃないかと思う。UML、つまりオブジェクト指向の表現の幅が広がるはず。

03.リファクタリング―プログラムの体質改善テクニック

★★★★★。オススメ。ビューティフルなコードを書くための本。

第3章まで読めとamazonに書いてあったけど、そこまで読めたら全部読める。コードの不吉な匂いがわかればよし。優秀な人のソースも読めるようになる。
ただ、このままFlashに適応させると大変な目にあうので注意!律儀に書くとコードの実行が遅くなるので、この辺のバランス感覚は経験が必要になってくる。

04.モーション・タイポグラフィ

★★★☆☆。古い。中古で買ったら間の4ページくらいが破られてた。

モーション・タイポグラフィの歴史とか見方とかその辺を意識できるようになった気がする。とりあえず、映画のオープニングはしっかり見ようと思った。

05.ActionScript3.0 ビジュアル・リファレンス

辞書は1冊あればいいだろう。Flashのヘルプで事足りるので不要かもしれない。1か月に1度開くと知らん機能を発見できたりする。

06.Advanced ActionScript 3 with Design Patterns

★☆☆☆☆。Flashでのデザインパターンはどのようにして行われるのか、そういった疑問を持ち、英語の本に手をだした。

しかし、単に他言語の教育用デザインパターンをActionScriptで書きました的内容なのがとても気になってしまった。AbstractGameのサブクラスにFootBallGameやで。どこで使うねん。Flashのために書かれたとは思えない内容で残念。

2008-04~06月に読んだ本

07.Webデザインの「プロだから考えること」

★★★☆☆。一流の人たちの作り方がほんの少しわかる

個人的には電通の中村洋基氏とimaginativeの水藤祐之氏・深澤 洋介氏の話が印象に残ってる。みんなクオリティを高めるために死に物狂いなんやなー。そらぁ、僕みたいな底辺が太刀打ちできるはずもない。そういうことを実感できただけでもありがたや。

08.FLASH OOP (AS2のやつ)

★★★★☆。オススメ。のちにAS3版がでるけど、こっちのがいい。

なにがいいかというと、Flash以外のことが書いてある。すなわち、Flash以外の本を読め!と書いてあるのと同義だ(と思う)。これを見てプログラミングの世界の広さを垣間見れたし、興味の対象も広がった。

09.Learning Actionscript 3.0

★★★☆☆。のちに和訳が出たのでこいつ(原著)は買う必要がない。和訳はこっち初めてのActionScript 3.0 Flashユーザーのためのステップアップガイド

内容は実にわかりやすい。わかりやすすぎる。コードもわかりやすいし、サンプルも興味をそそるものが多い。あと、AS3でつまづきやすいところと基礎的なところに絞られていて、無理なく読めた。デザイナ上がりで大重さんの本を読んだら次はこれか。

10.Production Studio マスター After Effects

★★★☆☆。高い。高いけど、サンプル素材がすごいらしい。

内容は初心者向け。エフェクトの一覧があるので、やさしい。Flashばかりに頼ってたら死ぬ状況もあるので、AfterEffectsは絶対覚えとかないといけないし、表現の幅も広がる。

11.Flashデザインラボ -プロに学ぶ、一生枯れない永久不滅テクニック

★★★☆☆。初心者向けだけど、むらけん氏とTeamLabがずば抜けてる。

むらけん氏とTeamLabの2つはつくりがきれいだし、解説も豊富。Flashの実践的な作り方をきちんと書いてある本はほとんどないので、それだけで買う価値はある。

12.FLASH OOP for ActionScript 3.0

★★★☆☆。OOPとは少し違う。

AS版と比べて、OOPに比重が置かれていない。初心者には難しいだろうし、上級者ならすぐわかるだろうし…といった中途半端感が目立つ。もうすこしページがあってもいいのではないか。値段も高いんだから。

2008-07~09月に読んだ本

13.Adobe Flash CS3 詳細! ActionScript3.0入門ノート2

★★☆☆☆。入門ノート1の続編。

入門ノート1がかなりわかりやすかったので買ってみた。内容はそれほど高度なことや必要性のあることでもない(FLVのキャプションはそんなに必要ないだろう)。こちらは立ち読みをして購買の検討をすればいいと思う。

14.ゲーム開発のための数学・物理学入門

★★★☆☆。最近はAS3の数学・物理学本も出たみたいなので、そっち読めばいいのではないか。僕も今買った。

この本は説明をかなりはしょるけれど、公式は暗記すればいいのでそんなのでもいいかもしれない。高校数学どまりでも読めるけど、わけわからないぜ!これを乗り切らないと野たれ死ぬだけなので頑張ろう。

15.実例で学ぶゲームAIプログラミング

★★★★☆。ゲームの世界に衝撃を受けた。

ゲーム業界のノウハウはすごい。こんな膨大な知識が埋まっているとは。

内容は単純なステートパターンから探索行動まで、きっちり書かれてる。もうここまでくるとデザイナ上がりのFlasherは太刀打ちできないレベル。しかし、ここを理解できないとそのうち野たれ死ぬだろう。ノード探索とかはしっかり覚えたいところ。

16.増補改訂版Java言語で学ぶデザインパターン入門

★★★★★。オススメ。日本人のデザパタ本。読みやすくわかりやすい。

デザパタ本はずーっとGoF本と周辺本を読んでたけど、ぜんぜんわからん。ごめん言い過ぎた、なんとなくはわかる。でも「えっ?デザインパターン?ああ、となりのクラスの?」という顔見知りレベルを脱却できない。つまりなんにも使えないのだ。

しかし、この本は相当わかりやすい。わかりやすすぎて、Decoratorパターンはそんなに使う必要がないこともなんとなくわかる。抽象化して思考することを嫌というほど叩き込んでくれるので、パターンやOOPの本質を理解できるし、どのように応用すべきかもなんとなくわかる。デザパタ本ってそういうところが重要なんだわ。

2008-10~12月に読んだ本

17.達人プログラマー―システム開発の職人から名匠への道

★★★★★。オススメ。達人がなんたるかをなんとなく理解できる。

Web業界の歴史は浅いので、なかなか達人や師匠に巡り合えない。また、Flashなんて大抵1人で開発が終了するから、技を盗むことも至難だ。Web業界における「達人から盗む」という作業は、「他の業界の達人」から盗んだ方が効率がいい。この本は徹底した達人の姿勢を教えてくれる。個人的には「割れ窓理論」がマジウケるんだけど~!

18.ゲームプログラマになる前に覚えておきたい技術

★★★★★★★★★★。超オススメ。通称セガ本。セガの偉い人が新人教育用に書いた本。

これはすごい。どうしてこういう作りの戦略をとるか、最適化を行うかなどなどありったけのノウハウを詰め込んでる。まったくノウハウがない新人に教える感覚なので、Flasherみたいな独学大王たちはこの本からものすごくたくさんのことを学べるはずだ。まじで(僕のamazonリンクから)買えばいいと思う。

19.詳説 ActionScript 3.0

★★★★☆。せめて半年前に読みたかった。もうFlash10が来てるんだぜ!

広大なアメリカ大陸から西へ西へと遥々やってきたコリンムックさんの本。さあ、ここにはいったいどんな動物がムツゴロウさんを待ち構えているんでしょうか?

ムツゴロウ「いや~かわいいですね~、これを見てください。表紙をみてください。アメリカサンゴヘビですね~。アメリカサンゴヘビは毒を持っていて、この毒が獲物の体に回るまで噛みついたまま離さないんですね~」

まとめると…「Flasher1年生は2学期からFlashの本を読むな」

みなさんお気づきの通り、ムツゴロウさんのナレーションは間違いなく不要でしたね。高枝切りバサミに付いてくる普通のハサミと同じくらい不要ですね。

それはさておき、これらを一言でまとめると

「Flasher1年生は2学期からFlashの本を読むな」

ということです。いまのところFlash本でかっちりとした構築ノウハウを提供してくれる本はあまり見かけません。それならいっそのこと他の分野からノウハウを移植したほうが効率的です。

最初の4~6ヵ月でASの基礎を固めておいて、あとはデザインパターンや数学など、他分野から吸収したほうがよさげです。

特にゲームはFlashと近いところにいます。uiがあって、ローディングがあって、動的に画面が遷移して…と、かなり似ています。衝突判定やAI、画像処理など山のようにノウハウが蓄積されています。僕は今後がっつりこっちの本を読もうと思っています。

それと、あと1冊で20冊というキリのいい数字なのにどうして19冊なのか?そう思いますよね。いや、読んでるんです。50ページ以上ね。読んでるんです。なんだったら2周読んでます。でもね、その1冊が通学路で拾ったエロ本だったんです。

よいお年を~!!

ですから奥さん、FlashDevelopにちょっとうれしいプラグイン3つなんです

2008-09-14追記 すみません!「trace文をショートカットキーで書いてくれる便利なヤツ」のurl間違えてました!

PCの操作で不便に感じることがあれば真っ先に思うのが、「誰かが作ってくれてるやろ」ですね。だからwindowsはやめられない。そんなことで、FlashDevelop回りで調べたら見つかったプラグイン3つです。

以下、すべてFlashDevelop3.0.0 beta7での設定です。

1. as3・as2でASDocを吐き出してくれるやつ

5分もかけずにas3のASDocを吐き出すらしい

厳密にはプラグインではありませんが、コマンドラインを勝手に叩いてくれます。

http://www.flashdevelop.org/community/viewtopic.php?t=918

  1. FlashDevelopを起動。
  2. 「tools」→「Custom Arguments」でkeyとvalue を設定します
    • name → "ASDoc",
    • value → flexのpath\bin\asdoc.exe,
  3. ツールバーに「ASDocを作成」するボタンを追加します。ソースは上記リンク先で。

FlashCS3用のプロジェクトだと、結構失敗します。コンポーネントとかはうまいこと指定しないとできないかもしれません。

2分くらいでas2でのASDoc(as2api)

デフォルトで入っていました。しかもGUIで。

  1. 「tools」→「Flash Tolls」→「AS2API GUI」
  2. 必要項目を入力
    • pagetitleはhtmlのタイトルとか
    • packageはASDoc化したいパッケージ。「com.katapad.*」みたいに書く。
    • Outputとclasspathはそのまんまなので適当に入力
  3. 「Generato Documentation」ボタンを押してできあがり!…って文字化けしてるじゃねーか!
    • 文字コードがiso-8859-1で書き出されるので文字化けします。ちょこっといじくる必要ありです。

      1. 「tools」→「Application Files」でエクスプローラが開くので「Tools/as2api」 を開く
      2. as2apigui.bat をテキストエディタで開きます。iso-8859-1と書かれてるとこをutf-8に変更して保存
      3. as2apigui.batを実行すると、ようやく文字化けが直ります。

文字化けがうざいですが、それでもかなりの時間短縮になりますね。

2. trace文をショートカットキーで書いてくれる便利なヤツ

andrewlucking.com � fdtracer
FlashDevelop Trace Plugin
http://www.andrewlucking.com/archives/category/fdtracer/
http://www.double-quotes.com/flashdevelop/trace-plugin/
  1. ダウンロードしたら「tools」→「Application Files」→pluginディレクトリにぶち込む
  2. FlashDevelop再起動

変数とかを選択して「ctrl + 0」もしくは「ctrl + shift + 0」でtraceがきれいな形で!スニペットのtracethisと組み合わせたら、かなりの量のtraceを自分で書かずにすみます。

2-1 trace文をのぞき見するplugin

間違えて上のtraceのプラグインとこに書いてたurlのプラグインです。

こいつはブラウザで見たswfのtrace文を拾ったりしてくれます。要debug playerです。

andrewlucking.com � fdtracer
http://www.andrewlucking.com/archives/category/fdtracer/
  1. ダウンロードしたらpluginディレクトリにぶち込みます
  2. F10押して設定を開きます。
  3. FDTracerの項目でflashplayerのlogファイルへのパスを設定({user}と書いてあるところをpcのユーザ名に)します
    • mm.cfgというテキストファイルを新規作成して、Cドライブ直下に置きます。中身は以下

      TraceOutputFileEnable=1
      ErrorReportingEnable=1
      TraceOutputFileName=C:Documents and Settingsユーザ名Application DataMacromediaFlash PlayerLogsflashlog.txt
  4. debugplayerを使ってその辺のサイトを見る。FlashDevelopのFDTracerパネルにたくさんtraceされてるはずです。マァ、いやらしい。

3. addEventListenerのrollOverHandlerとかをrollOutHandlerに勝手に書き換えてくれたりする、今回紹介する最強のplugin

以下にムービー付きで紹介されてます。今日は徹夜なのにブログを書く気にさせてくれるほど、ものすごい便利です。

FlashDevelop Duplicate Plugin
http://jde.name/duplicate/
mc.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);

と書いた文を複製すると

mc.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);

Eventのtypeとハンドラまで「out」に書き換えて複製してくれます。まだ続けて複製するとclick、doubleClickまで書いてくれます。ヤッベー。ヤッベヤッベ。

mc.addEventListener(MouseEvent.CLICK, clickHandler);
mc.addEventListener(MouseEvent.DOUBLE_CLICK, doubleclickHandler);

他にもtrue→falseを切り替えたり、連番を自動で振ったりとかなり便利です。ありがとう、神様。

AS2で遅くなる書き方を研究しようか

上条さんとこで、AS2でOOPをやると遅くなる可能性があると書いてあって泣いた。

AS3 で動的言語のススメ

AS2 における型の使用は、オーサリング時の ”生産性向上のベストプラクティス” としての位置づけ以上ではないわけです。実際 OOP をまじめに追求するほど AS2 のアプリケーションは遅くなる傾向を持っています。

気になったので、単純なカウントアップでベンチマークをとった。

試したところは以下

  • タイムラインに書くかクラスに書くか
  • 型宣言の有無
  • 処理をfunctionにくるむかどうか

AS2でタイムラインに書く。型宣言はなし

//型宣言なし
var startTime = getTimer();
var trialNum = 100000;
var cnt = 0;

for (var i:Number = 0; i < trialNum; i++) {
	cnt++;
}
benchmark();

function benchmark()
{
	var endTime = getTimer();
	trace("time: " + (endTime - startTime));
}
//だいたい228

AS2でタイムラインに書く。型宣言あり・カウントアップは生で書く

//型宣言あり
var startTime:Number = getTimer();
var trialNum:Number = 100000;
var cnt:Number = 0;

for (var i:Number = 0; i < trialNum; i++) {
	cnt++
}

benchmark();

function benchmark()
{
	var endTime:Number = getTimer();
	trace("time: " + (endTime - startTime));
}

//だいたい230

AS2でタイムラインに書く。型宣言あり・カウントアップはfunctionにくるむ

リファクタリングの本やOOPの本を読んでいると、できるだけ細かいfunctionに分けるべきだ、と書いてある。確かにそのほうがやりやすいが、やればやるほど遅くなる気はしていた。

//型宣言あり,function
var startTime:Number = getTimer();
var trialNum:Number = 100000;
var cnt:Number = 0;

for (var i:Number = 0; i < trialNum; i++) {
	countUp();
}

benchmark();

function countUp():Void
{
	cnt++;
}

function benchmark():Void
{
	var endTime:Number = getTimer();
	trace("time: " + (endTime - startTime));
}

//だいたい709

クラスに書く

クラスに書いてみた。やってる中身は上とほとんど一緒。試したのは以下。

  • 型あり
  • 型あり・function
  • 型あり・別クラスstatic function
  • 型あり・別クラスを参照static function
    「型あり・別クラスstatic function」は

    for (var i:Number = 0; i < trialNum; i++) {
    	cnt = sandbox.BenchTest.countUp(cnt);
    }

「型あり・別クラスstatic function」は

var test:BenchTest = BenchTest;
for (var i:Number = 0; i < trialNum; i++) {
	cnt = test.countUp(cnt);
}

AS2速度まとめ

型なし 型あり 型あり・function 型あり・別クラスstatic function 型あり・別クラスを参照static function
タイムライン 228 230 708 455
クラス 102 101 245 313 227

ループ処理だけでの単純な比較なので、あまりあてにならない。

実際のところどっちが速いのかよくわからん、という結果になった。とりあえず、タイムラインでのfunctionがやたら遅いということがわかった。アクティベーションオブジェクトのせいだろうか。

でも、OOPにのっとってめちゃくちゃ細かく分割すると、遅くなることは事実だろう。わりと、お茶濁しな結果に!

AS3とAS2での差はクラスのメンバにあるかどうかでかなり変わる

AS3では

var point:Point = new Point(x,y)
point.x++;

と書くとめちゃくちゃ早い。メンバ変数であるかどうかがかなりの違いの模様。

これを単なるオブジェクトとして扱うとめちゃんこ遅くなる。ハッシュがどうのこうのらしい。配列はそこそこ早い。
PointとArrayで速度比較

var obj:Object = new Object();
obj.x = 1;
obj.x++;

AS2ではどれをやってもほとんど同じ速度だった。

さっさとAS3に全部移りたいぜ!

//var point:Point = new Point(1, 1);
//var obj:Object = new Object();
//obj.x = 1;
var array:Array = [1];
for (var i:Number = 0; i < trialNum; i++) {
	//point.x++;
	//obj.x++;
	array[0]++;
}
AS2でメンバとかの速度
point.x++; obj.x++; array[0]++;
94 93 106

いまさらDelegate.createを理解しようと思ったけれど、謎が深まった愛され系の俺

長らくAS2でお世話になっているおまじない、Delegate.create。ただなんとなしに使うのではなく、そろそろ理解しようと思い調べてみました。

理解するためには2つ必要でした。

  1. argumentsオブジェクトの理解
  2. Functionクラスの理解

argumentsオブジェクトの理解

argumentsオブジェクトは引数オブジェクトのことです。アクセスするには配列演算子を用いますが、単なる配列とは異なるようです。

argumentsオブジェクトにはcallerとcalleeプロパティが存在します。

arguments.caller

現在実行中の関数を呼び出した関数への参照となります。関数オブジェクトはdynamicクラスなので、あとからいくらでもプロパティを追加できるので、実際に参照しているのかテストしてみましょう。

function firstStep(){
	secondStep();
}
firstStep._x = 1;

function secondStep(){
	trace(arguments.caller._x);
	arguments.caller._x++;
}
firstStep();   //1が出力される
firstStep();   //2が出力される
firstStep();   //3が出力される

arguments.callee

現在実行中の関数への参照となります。

Functionクラスの理解

Function.apply()

Function.apply(scope:Object, [argArray: Array ]) :Void

functionオブジェクトのthisを置き換えるのがこのapplyメソッド。
これをうまく使えばmc.onReleaseなどのthisが変わるめんどくささから解放されます。

以上を踏まえて、mx.utils.Delegate.create()では何をしているのかというと

まずはmx.utils.Delegate.create()のコードを見てみましょう。

static function create(obj:Object, func:Function):Function
{
	var f = function()
	{
		var target = arguments.callee.target;
		var func = arguments.callee.func;
		return func.apply(target, arguments);
	};

	f.target = obj;
	f.func = func;
	return f;
}
  1. functionオブジェクト(var f)を作成
  2. functionオブジェクトに匿名関数を参照させる
  3. functionオブジェクトはdynamicクラスなので、追加プロパティを作れる
    • scopeとなるobjectと関数を保持させる
  4. 匿名関数内で、arguments.calleeを使って、自身(現在の関数)を参照し、
    • 先ほど保持したscopeと関数を拾う。
    • func.apply()で意図したscopeにfuncを割り当てる(thisを変える)

だいたいこんな感じでした。しかしながら、func.apply()には同時に引数も渡せるはずです。なので、ちょっと付け足してみました。

static function createWithArgs(obj:Object, func:Function, args:Array):Function
{
	var f = function()
	{
		var target = arguments.callee.target;
		var func = arguments.callee.func;
		return func.apply(target, arguments.callee.args.concat()); //ここを追加
	};

	f.target = obj;
	f.func = func;
	f.args = args; //ここを追加
	return f;
}

applyメソッドの第2引数にarguments.callee.args.concat()を追加するとうまく引数を登録できます。
引数の配列となるargsはconcatしないとうまく動作しません。

このあたりがさっぱりわからなかったので、ググってみましたがめぼしいものは見つからずさらに謎の動作まで見つけてしまいました。

http://library.sfug.ch/trac/browser/trunk/doc/as2/examples/sfug_as2lib/ch/sfug/utils/Delegate.as

ここはarguments.shift()でscopeとfuncを定義してるあたりがおもしろいですね。concat(arguments)でさらにdelegateした後で呼び出したときの引数も定義しています。なぜargumentsが使えるのかがなんとなくでしかわからないので、完全なる理解にはしばらく時間がかかりそうです。

大重さんのActionScript3.0セミナーに参加

ActionScript始めて4ヶ月。そろそろas3に足をつっこみたくなったので参加してきました。
http://event.67.org/summercamp/

参加前のAS3印象

  • プロパティから"_x"などのアンダースコアが消えた
  • イベントを全部リスナーに登録せんとダメ
  • ややこしい

実際参加してわかったこと

  • 要素がレイヤーとかじゃなく、displayObject(?)のノードになってる(深度がなくなって、配列の順序で重なり順を操作する感じ)
  • maskがプロパティに
  • ドキュメントクラスのおかげでASは全部外部に移せる
  • フレームアクションがそのMCの全フレーム共通になった
  • timerクラス
  • xml使いやすくなった
  • イベントリスナーっていう考え方はクール。functionをadd、removeがやりやすくなった。
  • pointクラスがいい感じ
  • deleteよりnullが推奨されてるらしい

覚えることも多いけれど、クラスの作り方が一貫してんのかな?勉強がしやすい。

このへんのことは大重さんのActionScript 3.0 入門ノートに書いています。2.0入門ノートもよかったけれど、こちらもたいへん優秀な本です。
http://www.amazon.co.jp/o/ASIN/4881665901/


ちなみに、大重さんのレクチャー手法は…

僕の手法と似てました。もちろん、大重さんの方がすばらしい内容のお話ですが、似てた。

  • 「AはAです」ではなくって、
  • 「AはAだけど、Bっていう概念も知っておかないと…。それでBっていうのは…」

という形です。

「AはAです」と言い切ったほうが初学者の混乱はさけられるけれど、それは本質ではない。だから脇道だとしても伝えたい、というところでしょうか。

そのへんのさじ加減って難しいですよね。僕の場合は

「あーこれはこうやからこうなのですが、あー、(ここまで言っても混乱するだけかな?うまく伝えれるかな?あー)どうしようかな 。(やっぱやめとこ)ええっと、まあそんな感じです」

と最低なパターンになります。 あっ、でも大重さんはきちんと説明されていたので、そのあたり僕とは違います。そこだけはきちんとお伝えします。

IEでSWFObjectを使うときの一つの注意点

2009-05-19追記 対処法をちょこっと書きました http://katapad.com/wp/2009/05/19/stage_size_zero_issue_with_swfobject_on_ie

IEでwidth: 100%、height: 100% のswfを埋め込むときにハマったのでメモ。

IEのムチャクチャな描画速度は、SWFObject を軽く凌ぐようで見事にハマってしまった。リスト化してメモ。

  • IEのflash設置速度が速い
  • しかし、SWFObjectの処理速度は遅い
  • SWFObjectで設定した幅、高さを計算する前に、FLASHの1フレーム目を描画してしまう
  • 結果、Stageの幅、高さが0の状態でswfを描画してしまう。

だいたいこのような感じ。IEは描画だけは恐ろしく速い。

解決策は、Flashの1フレーム目に空のフレームをおくことで対処できた。 以前、スーパープログラマに似たような現象を教えて頂いてたのだが、半信半疑だったのでやってなかった。 半信半疑で本当にすみません。額を床につけるほうの土下座をします。

ホーム > flash


Search
Feeds
Meta

Return to page top