Results tagged “Flash”

Mar 242008

getDefinitionByNameの罠

ちとプレビュー前でばたばたしているので走り書きだけど、たとえばプリロードみたいなやり方で、メインコンテンツを先に展開しつつ、後追いで優先度の低い埋め込みリンケージサウンドなんかを実体化させる場合、スクリプト内で"getDefinitionByName"を使って定義しちゃうと、実体化の前に定義できてしまう。(try,catchでも一応定義はされているということでスルーされてしまうっぽい、そもそも定義自体がされていない場合はReferenceErrorをcatchできます。)

生成されたサウンドクラスは値はnullにもならず、よく分からない空の状態で定義されてしまって、soundChannelとかsoundEventでエラーが連発して悲惨な状況になる。

なので実体化されているかどうか?の確認は

try{
	var className:Class = getDefinitionByName(sndID) as Class;
	var snd:Sound = new className() as Sound;
	if (snd.length > 0) return snd;
}catch (e:ReferenceError) {
	return null;
}
みたいな感じになるかと・・。 非常に厳密にエラー定義がされている割には、この手の抜けっぷりが非常にうっとおしいですな。実体化されているかどうか?もcatch出来るようにしてくれれば良いのに・・・。

もちっとローディングの分散の手法はAS3で的確な方法があるのかもしれないが、まだAS2との折衷みたいな段階で煮詰め切れていない。

今一つ使っている手法としては、でかいサウンド系は外部SWFファイル埋め込んでおいて、

var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
の定義をしておいて、Event.COMPLETEの発動=実体化として認識してしまう形にすれば、getDefinitionByNameでReferenceErrorを取得することは可能(なはず)。

取り急ぎメモ。
間違っていたらゴメン。

Mar 232008

むうう・・

サウンド消失系の処理で、フェードアウトとかかけるとかなーりいやな感じのエラーがでる。
かといっていきなりstopをかけると「プチ」って小さい音が聞こえるんだよなあ・・・。
いやだなあ・・

Mar 222008

ShadedMaterialメモ

まだ検証中なのだけど、ShadedMaterialをMaterialsListで個別の面に割り当てるとエラーになる。
"all"の場合は問題ない。なんだ?(ちなみに元マテリアルはMovieAssetMaterial)


>とりあえず他のshaderをはずして、他のマテリアルで検証。
簡単なところでBitmapFileMaterialあたりから。

Mar 212008

swfファイルのパブリッシュ先のフォルダ指定

これもしかしたら簡単にできるのかわからないけれど、質問。

"hogehoge.fla"というFLAファイルにはデフォルトで"hogehoge.swf"という名前が付くんですが、ここに自動的に"swf/"ってフォルダを定義することはできないんですかね?

この辺の設定ファイルは
C:\Documents and Settings\User\Local Settings\Application Data\Adobe\Flash CS3\ja\Configuration\Publish Profiles\default.xml
にあって、この中の

<flashFileName>名称未設定 - 1.swf</flashFileName>

になるのだけど、ここに"swf/"を入れても適応されないですね。
ディレクトリ設定をプロファイルには定義できないもんなんですかね?

そもそも公開用SWFを"/swf"に、検証用SWFを"/dev"に切り分けたいとか、プロファイル切り替えだけで対応できないか?っつーところの話なんですが・・・。

Mar 192008

ふううううう

やっとこGridクラスの改変が終わった。
なんつーかRectangleクラスは使いやすいのか使いにくいのか微妙だ。
正直なところ欲しいのは基準点を保持しているグリッド情報なのだが、その辺をRectangleだけで済まそうとして今矛盾を抱えた状態になっている。これはなんかなんとかしたいなあ・・。・

あとはDisplayObjectじゃなくっても構造配列の重複チェックは、フラグチェックより、フラグの状態をRectangleとかBitmapでグラフィックにしてintersectionとかで判定したほうが早そうな気がした。
いや厳密に検証しているわけじゃないからアレだけど。

たとえば母体を毎回全走査するよりも、ビットマップのピクセルを加算して塗りつぶして、それと比較みたいなほうが効率よさそう(いや内部では同じかもしれんけど)、しかもチャンネル使えば1px*1pxの中に色々な情報を色を用いて埋め込める。(でそれの乗算とか制御した結果もきちんと意味がもてれば結構最強)
ただこっちの方法だとビットマップのサイズ上限(2800px)がグリッドの上限になる。つまり8294400グリッドが最大グリッド範囲になる。まぁ実際ここまで大きな状態のグリッドを取り扱うか?と言われると無いような気もするが、なんかそんな忘れるかもしれない制限条件とか抱えたものを作るのもどうかしら?みたいな。

いやもう頭全然回ってない。
多分後日自分でみても理解できない気がする。

今日は昼から打ち合わせだ。
少しは眠りたい。

Mar 152008

外部swfのクラスを親swfから使う。

もともとBGMで使用するサウンドファイルがでかいので、共有ライブラリにして外部に持たせておこうと思ったのが始まり。で、AS2はもうパッケージにしていたのだけど、AS3でどーやって実装しようかと色々試しているうちに、別に共有書き出しとかしなくっても普通に共有できた。(昔からだっけ?忘れた)
昔は一度タイムライン上に出現(これはMovieClipを作って1フレ目でstop&visible=falseにして、それ以降のタイムラインにサウンドを割り当てて、とかやるアタッチ系プリローダーの手法ね)させないとattachも出来無かったと思うのだけど(違う方法があったらゴメン)、それすらもしなくて良いと言う、超お手軽になっていた。大量の外部ファイルでの連携を必要とするコンテンツには便利だ。

ということでメモ。

肝のクラスは
flash.system.ApplicationDomain;
flash.system.LoaderContext;
の二つ。

たとえば外部SWFに埋め込んだサウンドクラスを引っ張り出したいときは

var shareLoader:Loader = new Loader();
var shareURLreq:URLRequest = new URLRequest(aURL);
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
shareLoader.load(shareURLreq, context);
で、あとはEvent.COMPLETE発動後にそのクラスを引っ張り出してやれば良い。 (音の処理のところは面倒なので書かない。) これと同じ手法で、イメージ、ムービークリップインスタンス、クラス等も利用可能だと思う。 ただし注意点としては同じクラスが重複しないようにすること。(同じクラスが存在する場合オーバーライドはされないけど、子供のクラスは使えない)

* All code in a SWF file is defined to exist in an application domain. The current domain is where your main application runs. The system domain contains all application domains, including the current domain, which means that it contains all Flash Player classes. * All application domains, except the system domain, have an associated parent domain. The parent domain for your main application's application domain is the system domain. Loaded classes are defined only when their parent doesn't already define them. You cannot override a loaded class definition with a newer definition.

ちなみにこんなことも出来る。

Continue reading 外部swfのクラスを親swfから使う。.

Mar 132008

360° Video with Papervision3D

360° Video with Papervision3D
前に書いたような気もするけど、一応メモ。

Mar 132008

行くぞ!

今までPV3D1.7で作ってきたけど、表現としてGreateWhiteの機能で使いたいものがあるので、これから切り替え作業に入ってみる。クラスを見ているとかなり構造が変わっているので、ほぼ一から作り直しの予感。

確実に死ぬ。
でもがんばる。

でも一応バックアップも残しておく・・・


Continue reading 行くぞ!.

Mar 132008

クラスライブラリの管理とか

最近良く思うのだけど、comとかorgとか頭につけてけど、これってそのままドメイン名からいくって方向にならないのかしら?最近その下に複数のリポジトリが出来てて管理しにくい・・・。

特にPaperVison3Dのversion1系とGreatWhite系。
あれ思いっきりクラス名被ってるじゃないですか。

ってみんなそれぞれクラスパスを分けて管理してるのかしら?
いや、ドメイン名にしてもするんだけどさ。
http://code.google.com/p/as3corelib/
とかもう直接汎用クラスライブラリに入れたいじゃないですか・・。
もうそれなら
com.adobe
とかじゃなくて
adobeで良いじゃん。
駄目?
comパッケージって意味なくね?

そんなこたーないですか?
そうですかそうですか・・。

いいよ、自分のクラスは
img8パッケージにするから。

Mar 102008

メモ:DisplayObject subclass

ちょいとメモ。

Loader.content(もしくはLoaderInfo.content)の抽出に悪戦苦闘。
cloneの必要があるのかと思ったがどうもそーでもないっぽい。BitmapDataではなくBitmapらしい。そもそもLoader自体がDisplayObjectのサブクラスだから、そゆことをしてはいけないのかもしれない。

Shape for a "canvas" for drawing content on-screen. In particular, if you want to create an instance for drawing shapes on the screen, and it won't be a container for other display objects, you'll gain significant performance benefits using Shape instead of Sprite or MovieClip.

A loaded image will be a Bitmap instance.

A loaded SWF file written in ActionScript 3.0 will be a Sprite or MovieClip instance (or an instance of a subclass of those classes, as specified by the content creator).

Sprite if the object will be created using only ActionScript, or as the base class for a custom display object that will be created and manipulated solely with ActionScript.

If you are creating a class that will be associated with a movie clip symbol in the Flash library, choose one of these DisplayObjectContainer subclasses as your class's base class:

* MovieClip if the associated movie clip symbol has content on more than one frame
* Sprite if the associated movie clip symbol has content only on the first frame


話はずれるが、
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/

http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/js/html/wwhelp.htm
って一つにまとまらないのかしら?
タブブラウザだと切り替えがめんどくさい。(ウインドウ一つ追加すればいいだけなんだけど)

Mar 102008

ObjectDumper

AS3にmx.data.binding.ObjectDumperに相当するものはないんかい?

Mar 092008

EX4はまった

今まで独自で拡張したXMLクラスでXMLの処理をしていたのだけど、まぁ世の中の時流にのってみようと思い、E4X(PDF)に手を出してみた。

で、はまった。

たとえば

<order>
	<item id='1' price="100" star="4">
		<menuName>burger</menuName></item>
	<item id='2' price="200">
		<menuName>fries</menuName>
	</item>
</order>
こんなXMLを読み込んだとしてitemノードのattributes名が不確定の場合、これまではこのノードのattributes(Object)を取得してfor in でぶん回せば属性名と属性値を取得できたのだけど、E4Xで取得したXMLListだとちと違う。 たとえば
var _node = myXML.item[0];
var _attr = myXML.item[0].attributes();
for (var i in _attr) {
	trace(i,_attr[i]);
}
これだと
0 1
1 100
っツー感じ。つまりObjectではなくなんちゃってArray(lengthも使えるのだけど、プロパティでは無くmethodになってる) ということで名前は"name"でList内に格納されているのだけど、これがまた何故かmethod(いや、XMLを走査するわけだから何故かでもないんだけど・・。) ということで正解は
for (var i in _attr) {
	trace(_attr[i].name(),_attr[i]);
}

で疑問なのはこのやり方は早いのか?っツーことぐらいかな・・・。
Objectに一度変換してとり回しした方が早いようなきもするけどAVM2だと関係ないのか?
(setter使ったって実質内部でmethodな訳だし変わらない?)
なんかこれやるんだったら、value()とかのメソッドがあるとオデの頭では理解しやすいのだけど、まぁノードも属性も一括で管理しているから、その辺でのつじつまなんだろうな・・。

まぁこれまで使ってきたものとあまりに使い勝手が違うのでまだ違和感あるけど、
ノード名、属性名などがきちんと分かっている情報に対してのアクセスはとても簡単。
判定条件を内包できるもの素敵です。

最近JSONばっかりで、久しぶりにXMLを触ってはまったっつーことで、とりあえずメモ。


あ、ちなみに
var _attr = myXML.item[0].attributes();

var _attr = myXML.item[0].@*;
でもいいです。こっちで書くとなんかかっこいい気がする。

Continue reading EX4はまった.

Mar 082008

改行コードはLFで

com.adobe.serialization.json.JSONで処理する際には改行コードはLFで・・・?
StringにignoreWhiteSpaceみたいなんはないんか?
つくらなあかんのか?

まぁ正規条件あるから簡単には出来るだろうが、これくらい用意してくれていてもよかろうもん・・。

Feb 292008

あれ?

PV3Dのcameraにはrollプロパティは無いのか?

Feb 252008

スクリーン座標からワールド座標算出

PV3Dには無いのかしら??

一昨年イエカキを作ったときに作った3Dクラスには力技でつけたんだけど、AS2だとQuaternionの逆算部分の処理が重くてリアルタイム処理が厳しかった。(結局初期化の際に、全部変換させている)
多分この算出にはWorldとCameraの情報が必要なので(もううろ覚えだ)両方の情報を保持しているクラスみたいなのがあるのかな?

あのクラスにはカメラのObject traceや、Stage>World変換(Camera変換も)など3Dソフトの機能を付けたのだが、実際は計算処理が重くてほとんどダイナミックに動かせなかった・・・。(一応WorldとCameraと内部のObjectを動かしているけど、ある程度座標値は指定範囲内に収まるようになってるはず)

自分で作ると好きなように色々できて便利だけど、PV3Dのモデリング部分とか見てたらもう一人で作るとかとても無理。

多分スクリーン>ワールド変換ってどこかにあるんだろうけど、深すぎてまだ探しきれてない・・・。
ふあ・・。

Continue reading スクリーン座標からワールド座標算出.

Feb 212008

ストリングからクラスのインスタンスを作る

以前にBeInteractive!さんが書いていたAS2のストリングからクラスのインスタンスを作るはAS3ではどーなったのか?
ということで、書いておく。

これは前のエントリー。loadBitmapの延長線上にあります。
つまりライブラリにある画像をクラスに割り当て、BitmapDataとして取得する際に、画像のクラス名を変数として処理しないと正直使えないぜ!ということです。

わかりやすく言うと、ライブラリの中に"photo1","photo2","photo3"...と画像が存在して、それぞれにクラスが割り当てられていたとして、インスタンス初期化の際にすべてクラス名を定数で書いていたらif分の嵐。10個ぐらいなら耐えれるけど、100個とかあったり、可変したりしたらどーすんだ?と・・。
(まぁでも総数はどっちにしてもスクリプトに記述する必要はあるのだけど)

ということで調べてみました。
AS2のときはものすごい技が必要でしたが、AS3はその辺ツールが用意されていました。
getDefinitionByName ()

使い方は簡単。

import flash.utils.getDefinitionByName;
private function getImage(_id) {
var _className:Class = getDefinitionByName("photo"+_id) as Class;
var bmp:BitmapData = new _className(0, 0);
var _bm:Bitmap = new Bitmap(bmp);
this.addChild(_bm)
}
こんな感じ。 一応"getDefinitionByName"で戻ってくるのは"パラメータで指定したクラスのクラスオブジェクトへの参照"なので、"as Class"でクラスに定義してあげます。(多分これをやらないと、型指定無しで使えないと思う)

最初

var _className:Class = "photo"+id as Class;
とかやったんだけど、激しい勢いで怒られた。 asはそんなに万能ではないようです・・・。 うっとおしい。

PS
あ、コードはimport全部してないからbitmapとかは自分でimportしてください。

Feb 212008

loadBitmap

もういまさらAS3の初期の話なんて恥ずかしくて書くのもあれなのだけど、一応自分のために書いておく。

AS2ではリンケージを設定したライブラリ内のビットマップをloadBitmapでビットマップデータに割り当てることが出来た。ただAS3からloadBitmapは消滅している。(そもそもリンケージと言う概念が無い)

ではどーするのか?
簡単なのはMovieClip(sprite)を作って、その中に画像をおくのが簡単。
しかしまぁ画像分MovieClip作るのかよ?って話は面倒なので、ビットマップを直接参照するようにしてみる。

080221a.jpg
まずライブラリに入っている画像ファイルをリンケージさせる。
リンケージプロパティダイアログで「識別子」はdeadしている。
クラス名の部分にはそのままだと画像のファイル名が入る。(aaa.jpgとか)
で、基本クラスは"flash.display.BitmapData"。

一応aaa.jpgとかでも参照できるのだけど、他のクラスとバッティングする可能性もあるからなんか画像用のクラスを割り当てる名称に統一しておいた方がトラブルは無いかも。(注釈のHTMLタグってなんだ?)

ということで一応"photo1"というクラス名にしておくことにする。

で、このクラスファイルは特に明示的に生成する必要は無いので、そのままにしておく。
で、これをBitmapDataとして取得するには。

var bmp:BitmapData = new photo1(0, 0);

ってな感じ。
ここでBitmapDataのコンストラクタの引数width,heightは形式上0,0を指定。ここにはまった・・・。

わざわざリンケージした画像のサイズを書かないといけないのかと思って、そんなあほな話があるかぃ!と・・・。ただ指定しないと怒られるし・・・。ということで悪戦苦闘してしまった・・・。
0,0指定必須じゃなくてNullを許容しておいてくれ・・・・orz。

一応0,0を指定したとしても内部的に割り当てられた画像のサイズに追従してサイズが定義される。
あとはステージに表示させる際にはBitmapを定義してaddChild。

var _bm:Bitmap = new Bitmap(bmp);
this.addChild(_bm);

こんな感じかな?

本当はこれは検証のために外部読み込みの画像を内部において簡単にテストしようとおもってはじめたことなのだけど、なんか非常に面倒だった・・・。時間もったいない。

Feb 212008

ううむ・・・

PV3DでビットマップマッピングしたCubeを100個作ってぐるぐる回していたら
オーサリング環境がクラッシュする・・・・orz

Feb 192008

InteractiveBitmapFileMaterial

AS2では表現的に難しそうだと言うことで、PV3Dに急遽切り替え。
InteractiveBitmapFileMaterialへのボタンイベントの割り当てに嵌る。
とりあえずinterfaceで拡張してフガフガしてみる。

が、実装してみたら激重・・・。
やっぱ200個近くの外部イメージをマッピングしたオブジェクトを動かすのは難しいですか?
そうですか・・・。
そうなんですかーー。

ぐはぁ・・・。
どーしたもんかねえ・・この要望は・・・。

Feb 152008

AVM2のガベージコレクタ諸々

ActionScript最適化 多分その1 ガベージコレクタを攻略する My life as an APE

メモメモ。
おそらくゲームプログラマの方ではないかと思うのですが、ここまで詳しく調査している資料は見たことが無い。すごいです。

奇しくも同じサイト名だが、レベルには雲の上と石の下ぐらいの差がある。

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  

Search and Archives

Tags