5月 26

ActionScriptのデバッグの定番にtrace()があるのだが、あまりに不便。配列くらいは表示できるけど、オブジェクトの中身は理解できず、

[object Object]

と、表示されてしまう。いちいちfor inでやるのも面倒すぎる。

…と、悩んでいたら、なんと、ObjectDumperという超便利な関数があるではないですか。いままでの苦労はいったいなんだったのかと。

…しかし、実はObjectDumperは、AS2.0のみ対応で、AS.0には該当する関数がなかった。AS3にはそれが無いということ。もうね、アホかと。今の時代にtrace一本で、デバッグしろのかと。

せっかく、AS2.0にはObjectDumperという便利なものがあるのだから、AS3.0でも使いたいじゃないですか。そこで、ObjectDumperのソースがあれば、使えるかなーと思って探すと、

C:\Users\(ユーザ名)\AppData\Local\Adobe\Flash CS3\ja\Configuration\Classes\mx\data\binding\ObjectDumper.as

にあった!(↑Win Vista/Flash CSの場合です)

そこで単純にAS3.0のソース中に、

import mx.data.binding.ObjectDumper;

と書いてみたが、エラーとワーニングが出まくる。そりゃそうか。AS2.0と3.0ではシンタックスもだいぶ違うしね。
しかし、なんとしても使いたいので、このソースを自分のところのパッケージのフォルダにコピーして、(例 com.ironhearts.utils.ObjectDumper)、AS3.0でコンパイルが通るよう、ちくちくとソースを修正して対応。

ObjectDumperの出力はJSONぽいので、応用が利きそう。

ObjectDumper.toString(オブジェクト)は、タイプが面倒なので、自分パッケージ用にショートカット用関数というか、ラッパーを作った。

>>>>>続きを読む

Popularity: 18% [?]

written by ANN

5月 14

AS3.0でのローディング中など、読み込みの状態を得るには、LoaderInfoのbytesTotal(総バイト数)とbytesLoaded(読み込んだバイト数)を使ってパーセンテージを計算したりするのだけれど、なぜか、bytesTotalの値がゼロ(0)になり、総バイト数が取得できない。

うーん。なんでだ~?といろいろ調べると、ロードの対象の画像をサーバ側で動的にリサイズするPHPを使っていて、それがContent-Lengthを出力していなかったため、Flash側でbytesTotalが取得できず、総バイト数を取得できなかった。

LoaderInfo.bytesTotalがゼロになる場合、サーバ側でちゃんとContent-Lengthが出力されてるか調べてみよう!

Popularity: 12% [?]

written by ANN

5月 10

AS2.0だと、コンポーネントのButtonに、簡単にアイコンを付けることができた。
アイコンのシンボルを作って、リンケージIDを付けてやり、コンポーネントのButtonのコンポーネントインスペクタの”icon”に、そのリンケージIDを指定するだけ。

◎Buttonのプロパティインスペクタ

as2prop.png

◎アイコンのライブプレビューは出来ないものの、オーサリング環境で、簡単にアイコンを指定できる。

as2btn.png

◎結果↓

これと同等のことをAS3.0でやりたいと思ったのだが…なんと、Buttonコンポーネントのプロパティインスペクタに、iconがない。つまり、オーサリング環境で、アイコンを指定する方法がないのだ。

調べると、Buttonクラスはアイコンを配置できるLabelButtonを継承していて、機能としては持っているようだ。
しかし、AS2.0のように、オーサリング環境でチョチョイのポン!では設定できなくなっている。

そこで今回はAS3.0でコンポーネントのボタン(Button)にアイコンを付ける方法を書きます。

>>>>>続きを読む

Popularity: 19% [?]

written by ANN

4月 30

ずばり、コンポーネントの初期化の話なのですが、正味、これで3日はツブしました。頭悪くて済みません。

以下のようなflaファイルがあったとします。
compcheck.png

>>>>>続きを読む

Popularity: 16% [?]

written by ANN

4月 23

最先端のFlasherの方々は、あまりステージにムービークリップやコンポーネントを配置したりしないのかもしれないが、個人的にはステージにグラフィックやボタンなどを配置することが多い。
それらをドキュメントクラスから使う場合、どうしたらいいのかわからなくてかなり悩んだ。

たとえば、以下のような画面があるとする。
as3compo.png
ステージ上にButtonとTextInputコンポーネントを配置し、それぞれ、
btn,inputtというインスタンス名とする。

ドキュメントクラスは、Main.asとする

パブリッシュ設定から、「ステージのインスタンスを自動宣言」をチェックしている場合(デフォルトでON)、ステージに配置したムービークリップおよびコンポーネントは、パブリッシュする際に自動的にオブジェクトのインスタンスが生成される。

Flashでは、ムービークリップシンボル、ボタンシンボル、またはテキストフィールドをステージに配置し、プロパティインスペクタでインスタンス名を割り当てた場合、自動的にそのインスタンス名で変数が宣言され、オブジェクトインスタンスが作成され、そのオブジェクトが変数に格納されます。

この場合、class Mainにおいて、btn,inputに直接アクセスできる。サンプルソースはこちら

>>>>>続きを読む

Popularity: 24% [?]

written by ANN

4月 16

serproxyと通信するためにAS3.0のSocketをいじってるのだけれど、これがなかなかくせ者。

[as]
import flash.net.Socket;
import flash.events.*;

send_btn.addEventListener(MouseEvent.CLICK,send_btn_click);

var num:Number;
var s:Socket = new Socket;

s.connect(“127.0.0.1″,5331);

function send_btn_click(ev:MouseEvent) {
s.writeInt(num++);
s.flush();
}
[/as]
(コードがヒドいのは、動作確認してるだけなので許して!)

で、オーサリング環境で、Ctrl+Enterでムービープレビューして、SocketDebuggerでチェックすると、ちゃんとデータを送信できてる。
しかし、swfをクリックして、Flash Playerで動かすと、Socketにコネクトできない。

なにが違うんだろ~???とかなり悩んだが、普通のFlash Player9じゃなく、Debug用のPlayerで動かすと、

SecurityError: Error #2010: ローカルファイルシステムの SWF ファイルはソケットの使用が許可されません。
at flash.net::Socket/connect()
at socket_only_fla::MainTimeline/socket_only_fla::frame1()

というエラーが。なにー!ローカルのswfからSocketへアクセスできないなんて、聞いてないよ~

どうしたらいいんだろう・・解決策がわからない。

・・・いろいろ調べてると、
Adobe – デベロッパーセンター : セキュリティに関するFlash Player 9の変更点
[233457]Flash Player バージョン 9.0.115.0 以降でソケットが機能しない

・・・う、、これは、、いま作ってる案件において絶望的な状況ではないか・・・。ソケットポリシーファイルを返信できるサーバがないとSocketは使えないということか・・・!Offlineな状況かつ、Webサーバなど居ない状況で、単独のswfがserproxyと通信しようと思っても、絶対できない!ということではないかっ!!!!!!!
(ポリシーファイルを返してくれるサーバが居ない!!)

デフォルトでは、ソケットおよび XML ソケット接続へのクロスドメインアクセスは無効になっています。また 1024 未満のポートでは、SWF ファイルと同じドメインでのソケット接続へのアクセスは、デフォルトで無効に設定されています。これらのポートへのアクセスは、次の場所のいずれかに所属するクロスドメインポリシーファイルを使用することで許可できます。

* メインソケット接続と同じポート
* 別のポート
* ソケットサーバーと同じドメイン内のポート 80 上の HTTP サーバー

ぐわー絶望的だーもうだめだー回線切って氏ぬしかない~

Popularity: 33% [?]

written by ANN

4月 14

ActionScript 2.0とActionScript3.0が思っていた以上にいろいろ違うので、そのあたりをまとめていく。

  • AS2.0にあったAttachMovieが、AS3.0には無い。参考→ActionScript3.0でattachMovie (Unknown Quality)
  • createEmptyMovieClipも無くなったYO!
  • 各種プロパティのアンダーバーが無くなった。例)my_mc._x → my_mc.x
  • Delegate.createが無くなった。イベントリスナーのスコープが変わった??先日、やっとAS2.0のDelegate.create()をバリバリ使い出したところなのに、もう捨てなければならないのか。。orz..
  • AS2.0のgetURL()が無くなった。代わりにURLRequestを使う。参考→ogies.net AS3.0 | getURLも引越し。
  • AS2.0には正規表現が無かったが(それもどうかと思うが)、AS3.0では使えるようになった
  • rootの概念が変わった。以前みたいに気軽にrootにアクセスできない。
  • FlashVarsの取り出し方も変わった!
     参考1→ActionScript3.0でFlashVars (Unknown Quality)
     参考2→Peter deHaan: Using FlashVars with ActionScript 3.0
  • AS3.0にはドキュメントクラスという概念というか仕組みが追加された。(これは最初ハマると思う)
  • コンポーネントに、なぜかMenu,MenuBar,Treeが無くなった。Yahooで補完→Yahoo! Developer Network – Flash Developer Center – ASTRA Flash Components
  • AS3.0ではバイナリデータが扱いやすくなった。従ってJPEGやPNGなど画像への出力がわかりかし容易だし、外部ライブラリもでてきた。JPEGEncoderなど。
  • AS3.0ではバイナリのSocketが使える。XMLSocketじゃなくて、ただのSocket。AS2.0で最初から実装汁!
  • ムービークリップにclickなどのイベントを追加しても、カーソルが自動的に「指」に変わってくれない。明示的に指定しやる必要あり。
    myMovieClip.buttonMode = true;
    myMovieClip.useHandCursor = true;
    とか。

その他、判明した時点で追加していく。

Popularity: 9% [?]

written by ANN

4月 10

Flash + serproxy.exeを使って、シリアル制御するアプリケーションを作成してるのだが、大大大苦戦。

文章にまとめる元気がないので、箇条書き。

  • ArduinoのActionScript 2.0のクラスは、コンストラクタでconnectしてるので、インスタンスを生成したあとに、再度、connectしてしまうと、“failed to open comm port-connection refused”が発生して、接続できなくなる。これでほぼ1日つぶれた・・馬鹿すぎる自分。というか、コンストラクタでconnectすんなよぉ~!
  • ↑この原因にたどり着くまで、かなり遠回りした。Flash→serproxy→モデムと接続して、FlashからATコマンドを送信して、ちゃんと送ることができるかなど。ATモデムなら投入したコマンドのエコーバックがあるからね。
  • シリアルのデバッグというか、接続テストには、Acknowrichが便利。
  • ソケットのデバッグには、Socket Debuggerが便利。
  • ActionScript 2.0は、シリアル制御には向いていないといことがわかった。どういうことかというと、ActionScript 2.0のXMLSocketは、ソケット通信ができるが、送信データの最後に、強制的に”0×00″を付与してしまう。当然、制御先の機器にも送られるので、こちらは”3030″と送ってるつもりでも、相手には、”303000″というデータが送られ、コマンドを理解してくれない。
  • “0×00″(ヌルバイト)を付与しないようなオプションがないため、スクリプトレベルではどうにもできない。
  • ActionScript 3.0は、XMLSocketクラスとは別に、Socketクラスがあり、バイナリデータを送受信できる
  • さて、インターフェースその他スクリプトはAS2.0で作っているし、AS3.0はまだ慣れてない。しかし、AS2.0では通信できない(純粋なコマンドデータを送信できない)。解決策は、AS2.0で画面を含むメイン部分を作成。データ送信部分のみ、AS3.0で作成し、その二つのswfがLocalConnectionで通信し、その結果をserproxyに送信する・・という、プロクシ2段構えでやるしか・・・ないのか!!orz…
  • これはやっぱり早くAS3.0に移行せよ!というAdobeの意志なのだろうか。
  • もう泣きたい・・・

うまくいかないのは、ずーっと、serproxyのバグじゃないかなーと、疑っていたのだが、serproxy.exe自体は、まったく問題なかった。私は人を疑う卑しい心の持ち主です(卑屈モード)

Popularity: 11% [?]

written by ANN

4月 04

最近、AS3.0およびAIRについていろいろ調査していたのだけれど、AS2.0から、AS3.0への移行が、思いのほか困難ということがわかった。下手にAS2.0の知識・経験があると、AS3.0習熟の障壁になってしまうと思う。

キャンバスや_root、イベントの処理が違うのは当たり前だが、それ以前の、ドキュメントを作ってパブリッシュするのも一苦労。

そもそも、FlexなどでSWFを作っていた人の場合は、違和感がないだろうが、FlashベースでActionScriptを書いていた僕にとって、キャンバスというかステージありきのスクリプトしか書いたことないので、ネットでサンプルとして掲載されているAS3.0のスクリプトを試したい場合、xxx.asファイル(クラス定義が入ってる)しかなく、どうやってパブリッシュしていいかすらわからなかった。

たとえば、Papervision3Dのプリミティブ・オブジェクト – Cone, Cube, Cylinder, Sphere -の、
Papervision3D のサンプルスクリプトを試そうとしたとき、Flash CS3でどうやってパブリッシュしていいかわからなかった。Flexとかだったら、簡単なのだろうか。

このあたりって、ActionScript3.0のチュートリアルを載せてるサイトにも載ってないので、しばらく悩んだ。

結果的には、

ステージの空白の領域をクリックして、ステージとタイムラインのすべてのオブジェクトを選択解除します。これによって、プロパティインスペクタの [ドキュメントプロパティ]が表示されます。
プロパティインスペクタの [ドキュメントクラス] テキストボックスにそのクラスの ActionScript ファイルのパスと名前を入力します。
注意: また、[パブリッシュ設定] ダイアログボックスにドキュメントクラスの情報を入力することもできます。

flash-prpt.png

ということで、まっさらのflaファイルを生成して、ドキュメントのプロパティもしくはパブリッシュ設定中の「ドキュメントクラス」に、外部asファイルで定義しているメイン処理のクラス名を書くことで、外部asファイルのスクリプトをパブリッシュできるようになる。(ややこしい)

なので、この場合、キャンバス(***.fla)には、何もなく、フレームにもなにもない状態となる。タイムラインベースのFlashに慣れていると、非常に違和感がある。

さらに、AS3.0のドキュメントクラスに相当するクラスが、Spriteを継承(extend)している場合、キャンバスにフレームがあったり、フレームにスクリプトを書いてあったりするとコンパイルエラーになり、コンパイルすら通らない。
Spriteを継承している場合、キャンバス上にオブジェクトおよびフレームにスクリプトを書いてはいけない。これがわかるまでにだいぶ時間がかかった。
うーん。ムズカシス。

AS3.0のイベントハンドラ周りをAS2.0ライクにしてくれるライブラリがあった。(fladictさん)
あとで使ってみよう。
sketchbook – Spark project
trick7.com blog: sketchbookライブラリを使わせてもらう

Popularity: 10% [?]

written by ANN

3月 28

FlashのDataGridという、いわゆる「表組み」のインターフェースをもつコンポーネントがあるのだが、そのままでは、文字以外を入れ込むことができない。

そこで、PhilFlash – HtmlCellRendererを利用させてもらい、サンプルを作ってみた。

>>>>>続きを読む

Popularity: 10% [?]

written by ANN