Results tagged “Flash”

Apr 242008

namespace

どーもオデの頭ではイマイチ利便性が理解できない。
まぁすんげー長いクラスとかで用途によってメソッドを分類したりしたいときには便利そうだけど。(クラスというよりも巨大なパッケージライブラリか?)
Namespaces -- Flash CS3

BeInteractive! [Namespace]
ここに書いてある「動作の切り替え」ってのはなんか使えそうな気もするけど、オデの仕事の進め方だとここまできっちりやろうとおもったらinterfaceやらもう完全に出来上がっていて、検証とか終わっているかも知れない・・・汗

なんかクラスを縦断してnamespaceで制御できたりするのかしら?とか思ったけど、importも普通にしないといけないし、ただ記述することが増えたという印象しか今のところ無い。

うーむ勉強しなくては。

Apr 222008

addEventListenerで一緒に引数を渡したい

と思うのはオデだけですか?
なんか方法あるのかしら??

たとえばボタンが2つあってhandlerを同じmethodに引き渡すとして

bt.addEventListener(flash.events.MouseEvent.CLICK,onClick);
bt.skill="aho";
bt2.addEventListener(flash.events.MouseEvent.CLICK,onClick);
bt2.skill="baka";
function onClick(e) {
	trace(e.target.skill);
	trace(e.currentTarget.skill);
}
みたいに書いたりするんだけど、 これ MovieClipがdynamicだからいいけど(独自クラスだったらそれ様の変数を定義しないと) そして 単純な構造だからいいけど(Spriteが入れ子になってたらとか) 普通はこんな簡単なことにはならない。 しかもいちいち変数を定義するのが面倒。 これはイベントドリブンだけの話ではなく、データドリブン時にも同じような不便さを感じる。 (昔自分で作っていたイベントクラスがそういう形だったからというだけなのだけど)

これ

bt2.addEventListener(flash.events.MouseEvent.CLICK,onClick,"aho");
とか出来ないのだろうか??

いや一応

bt2.addEventListener(flash.events.MouseEvent.CLICK,function(){onClick2("baka")});
function onClick2(skill) {
	trace("onClick2",skill);
}
とかすればできるけど、これはまたこれで冗長でなんか汚い。

直感的っぽいのは"flash.events.MouseEvent.CLICK"で生成されるEventに何かしら動的に変数を埋め込むーみたいな感じだけど、この辺やろうと思ったらdispatchのタイミングになるから、EventDispatcherから手を入れないといけないのでヤダ。

いやなんか普通に出来そうな気もするのだけど、こういうことってプログラムの世界ではどういう呼称なのかさっぱり分からないから検索出来なかった。
なんかふつーにできることだったらめっさ恥ずかしいんだけど・・・。

Continue reading addEventListenerで一緒に引数を渡したい.

Apr 182008

特定の文字だけを埋め込んだフォントのランタイム共有方法(AS 2.0)

ちとplayer9になってルールが変わったのでその辺少し整理しておく。
これはまだAS2の話なのであしからず。

Player9からはこれまでの禁則が緩和され簡単になっている。
やり方は以下のとおり

  1. 本体のFLAを作成。名前を"main.fla"として"main.swf"を書き出すようにする。
  2. フォント埋め込み用のFLAを作る。仮に名前を"share.fla"として"share.swf"を吐き出すように。
  3. share.flaの中に"share"というMovieClipインスタンスを作る。
  4. その中にtextFieldを作成し、埋め込みたいfontで埋め込み文字を設定する。ここでは"ヒラギノ角ゴ Pro W6"で"あほでまんねん"と埋める。
  5. "share"インスタンスを共有書き出しする。ここでは"share"というlinkage nameで、share.swfに書き出す。
  6. main.flaのライブラリで新規シンボル作成。名前を"share"として「ランタイム共有用に読み込み」としてURLに"share.swf"を設定。それをタイムラインに配置。
  7. main.flaに以下のスクリプトを書く
    txf = new TextFormat();
    txf.font = "ヒラギノ角ゴ Pro W6";
    txf.size = "20";
    tx1 = this.createTextField("tx1", 1, 0, 0, 0, 0);
    tx1.embedFonts = true;
    tx1.setNewTextFormat(txf);
    tx1.text = "あほちゃいまんねんばかでんねん";
    tx1.autoSize = "left";
  8. 埋め込まれているfontは"あほでまんねん"なので、main.swf上では"あほちゃいまんねんばかでんねん"ではなく"あほまんねんでんねん"と表示される。(別にstage上に配置されたtestFieldにsetTextFormatでもよいけど)

これまでは同じswf内に同名フォントで設定されたtextFieldが存在していたりするとconflictしてどちらかが表示されないという問題があったが、Player9で書き出しを行えばその辺クリアになっている感じ。

まだplayer ver8で作らないといけない場合は、また話が少しややこしくなる。
fontのconflictが発生するために同じfont nameのtextFieldが使用できなくなる。

conflictの簡単な特徴としては以下のような感じ。

  1. 同じswfファイル内で静的、dynamicTextFieldでlinkageされたものと同じfont名のものが存在すると、先に出てきた方が優先され、あとのTextFieldの文字がレンダリングされない。
  2. ただし外部swfのなかでembedすることは可能。親のconflictの影響は受けない。ただしそのswf内でも前述のconflictの条件は存在する。
  3. attach等をおこなってもconflict条件の対象になる。

といったところ。なのでこの条件が無ければver9と同じ設定で実装は可能。(なはず)

font setとして外部linkageする場合にはlinkage font nameを本来のfont nameと異なる名前にして設定することでこの問題を回避できたのだけど、TextFieldへの特定文字の埋め込みの場合font nameの設定を行う術が無い。

簡単に対応しようと思えば、同じfont nameのものを配置しない。ということになる。 つまり静的TextFieldの文字などをアウトラインにしてしまえばよい。ただ後々修正が入る可能性などを考えるとアウトライン化は避けたいところ。

ではどーするか?
まぁ今更使うこともないだろうけど、一応自分のためにもメモしておく。

Continue reading 特定の文字だけを埋め込んだフォントのランタイム共有方法(AS 2.0).

Apr 162008

慣性移動しながらバネ運動しつつ回転モーメントで回転するバネ

式を作るのに四苦八苦・・・汗
歳だなあ・・・・

つーか入れ子過ぎる。
ちょっと整理しよーっと。

Apr 132008

2101を拾うタイミング

URLVariablesのdecodeの際に発生するエラー。

2101 The String passed to URLVariables.decode() must be a URL-encoded query string containing name/value pairs.

これを一体どこで拾えばよいのか?分からなくてしばらくはまってしまった。

URLLoader - ActionScript 3.0 Language and Components Referenceを見ていると、明確に取得する方法はなさそうな感じ。サーバとのやり取りの型には問題は存在しないという前提条件で、あとは"HTTPStatusEvent"でサーバエラーかそうじゃないか?を判断すると・・・いうことなのか・・。
(でもHTTPStatusEventでエラーがおこったからと言ってEVENT.COMPLETEをスキップするわけでもなさそう)

これはどうかなー。微妙だ。
URLLoader.dataFormatの設定は逆にリスキーじゃねえ??
これだとURLLoader.dataFormatは指定しないでEvent.COMPLETEハンドラーの中で
new URLVariables
してtry,catchしたほうが確実ってか?
おかしーだろ、じゃdataFormatなんてイラネーじゃねえか。

tryありすぎ・・・多段になっちゃうヨ(書き方がまずいのか?)

っつーかHTTPStatusEventのプロパティがIOErrorEventとかと違うから、一括して単純にエラー処理にまわせない。statusとtextを分岐処理すれば良いだけだけど、面倒なんだけど。せめてstatusとtextを両方に用意しておいてもらいたいと思うのはオデだけですか?
え?event丸ごと投げろって?
まぁそれでもええけど。

Apr 112008

あ゙~~~~!

地味にややこしい!
解決策が見出せない!
ふがっ!

Apr 112008

ByteArrayで変数をサーバに送信するの巻

apeirophobia: mx.utils.Base64Encoderでバタバタやっていましたが、nutsuさんのお力添えもあり、無事実装できましたので一応ご報告。

TASK
URLVariablesの中に普通のString等と一緒にByteArrayで構造化した情報を突っ込んで送ることができるか?またそれをサーバから再度読み込んで復元できるか?

PROCESS
1)Base64エンコーダを探すの巻
ByteArrayの送信の際にBase64でエンコードする必要があるので、その辺のクラスを探してみる。corelibのSHA256クラスの中とかにmx.utils.Base64Encoderというクラスの存在が確認できるのだが、そんなものはどこにも無い。ということで最初はhttp://crypto.hurlant.com/のcom.hurlant.util.Base64クラスを使って実装。一応これでも動く。
ただし開発が去年で停止しているのとcorelibの中にもcryptoパッケージが移植されているので、できればmx.utils.Base64Encoderで実装してみたいということでモソモソしてみる。

2)Base64Decoderでエラーが出るの巻
nutsuさんからFlex3 SDKの中に入っているという情報を頂き、喜び勇んでゲット。しかしvar bde:Base64Decoder = new Base64Decoder();を行うと

Error: No class registered for interface 'mx.resources::IResourceManager'.
at mx.core::Singleton$/getInstance()
at mx.resources::ResourceManager$/getInstance()
at mx.utils::Base64Decoder()
at test_PostPlay_fla::MainTimeline/frame1()
が表示され動作しない。

3)Base64Decoderのエラーを回避するの巻
nutsuさんの環境では動作するということでしばらくググッてhttp://bugs.adobe.com/jira/browse/SDK-12205#action_178148に到達。
ということで以下のスクリプトを追記。

import mx.core.Singleton;
var resourceManagerImpl:Object =
flash.system.ApplicationDomain.currentDomain.getDefinition("mx.resources::ResourceManagerImpl");
Singleton.registerClass("mx.resources::IResourceManager", Class(resourceManagerImpl));
これでエラーは出なくなった。
Continue reading ByteArrayで変数をサーバに送信するの巻.

Apr 102008

mx.utils.Base64Encoder

おう、これはどこにあるんだよ?!
ねえじゃねえかよ!!
Flex3買わねえといけねえのかよ?!

Apr 102008

BINARYでloadしたSWFとかをClassに割り振れないのか?

なんか方法ありそうな気がするのだけど、うまくいかないので書いてみる。

以下のようにbinaryでLoadするとして,

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, _onLoaded);
loader.load( new URLRequest( "dummy.swf" ) );
これをMovieClipとして利用するのにはEvent.COMPLETEでバイナリを格納。(実際使っているときはバイナリ管理のクラスをつかってますが)
_bytes = URLLoader( e.target ).data;
_bytes.objectEncoding = ObjectEncoding.AMF3;//これは別にいらんけど
で、実際addChildする際には
var loader1:Loader = new Loader();
loader1.loadBytes( _bytes );
addChild( loader1 );
っつー感じなのですが、これをたとえば"ahoaho"クラスとかに割り振って
new ahoaho();
とかでインスタンス化できるようにできんのか?っつーこと。

いや別にloader使ってaddChildでもいいのだけどさー。
なんか出来そうな気がするのだけど、うまく割り当てが出来ない。

Continue reading BINARYでloadしたSWFとかをClassに割り振れないのか?.

Apr 072008

外部swfを読み込むとIEでは表示されるのに、FFでは表示されない件

なんだか変なトラブルばかり起きている今日この頃です。

今作っているものが親swfから外部の子swfを読み込むものなのですが、
なんかしらんけど、Firefoxで子供のswfが表示されないというトラブル。

IEは問題なく表示されサクサクと動いております。
Firefoxでは一応読み込みは出来ているようなのだけど、表示されない。

他のダミーファイルを読み込むと表示される。
なーんでだ?!

処理速度の問題でつか??
うーん、どうやって問題を切り分けていくか非常に悩ましいな・・・。

しかしこれの解決にまた朝までかかるのか・・・?
やだなあ・・・。

Apr 072008

TweenerのaddCallerをクリアする

オデのためのオデによるブログ "apeirophobia"です。

さて
TweenerでaddCallerを途中で解除したいぜ!というときにどすればええのん?
という質問をされたので書いておきます。

addCallerの場合はproperyが設定されていないのでオデはざっくりと

Tweener.removeTweens(this);
で対応しています。

ただこれだとその要素に対して設定されているすべてのTweenが削除されてしまいますが・・。
オデは基本的にaddCallerを停止させるときはremoveのタイミングで、他のモーションも一括で削除することが多いからそんなに不便さは感じていませんけど、まぁ個別に細かく制御したい場合はaddCallerを割り当てるためのSprite(Shapeでもいいのかしら?)を作ってそこで管理するって感じですかね?

そうする場合の注意点なのですが、

Continue reading TweenerのaddCallerをクリアする.

Apr 062008

外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件

ここ数日色々やってきましたが、
apeirophobia: Loader.removeChildapeirophobia: 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件


Loader.unloadの処理にミスがありました・・・。(恥ずかしい・・・)


apeirophobia: Loader.removeChildの方でテストしていたスクリプトで

	_loader.unload();
	_loader= null;
となっている部分。これunloadでlodar.contentsが非表示になるのでうっかりしていたのですが、loader自体がremoveChildされていませんでした・・・orz。 ということで
	_world.unload();
	removeChild(_world);
	_world = null;
としてもう一度検証してみました。 以下その結果。
Continue reading 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件.

Apr 062008

外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件

延々と検証をしてきましたが、なんかLoader.unloadは使わない方が良いのではないか?という結論に至りました。既出だったらスンマセヌ。

追記:06-Apr-2008 20:55:08
以下の検証には誤りがありました。
正確な検証結果はapeirophobia: 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件を参照してください。スイマセン。

やり方としてはunloadを使う代わりに、removeChildを用いる。
で、子供の方でEvent.REMOVED_FROM_STAGEをlisten。
これをキーにしておけばネストしている子供に対しても一気にremove処理が適応できる。
で、それぞれの子供の中でTwennerやらEventListenerを掃除するprivateメソッド組んでおく。
(当然removeのメソッドの中ではEvent.REMOVED_FROM_STAGEもremoveする)

これで前にやったapeirophobia: Loader.removeChildと同じ検証をしてみた。
結果は以下のとおり。

Continue reading 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件.

Apr 062008

Loader.removeChild

何故エラーになるか?

Error: Error #2069: Loader クラスは、このメソッドを実装しません。
at Error$/throwError()
at flash.display::Loader/removeChild()

DisplayObjectContainerを継承してるんじゃないのか??
ちゃうのか?
俺がまちがっとんのか?
あーあーあー。
あほう。

追記:06-Apr-2008 20:55:08
以下の検証には誤りがありました。
正確な検証結果はapeirophobia: 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件を参照してください。スイマセン。
Continue reading Loader.removeChild.

Apr 052008

ぐーーーー

AS3マジでメモリの開放がめんどくさい。
外部swf入れ替え系はまぢでうっとおしいな。
なんか手っ取り早い方法はないんか。
作れってか?
あーあーあーあー。

Apr 042008

img8.debug.Debugger

先日エントリーしたDebuggerをちょっと変えました。
基本FPS計測はOFF。でFPS表示の前のボタンをクリックして計測開始、再度クリックで計測中断。ただこれによって一度増えたメモリ消費が下がるのか?はまだ完全に検証できていません・・。(もともとがあまりに微小な値なのでかなり長時間回して検証しないと良く分からん)あとはグラフの幅だとか、レコードする個数とかプロパティを設定できるように。(普通はさわらないだろうけど)

Continue reading img8.debug.Debugger.

Mar 312008

Event.ENTER_FRAMEをしているだけでメモリが浪費される??

ちょいとデバッグ用に使用メモリとFPSを表示する"debugger"クラスなるものを作ってみた。
で、色々試していると、FPSを算出するためにEvent.ENTER_FRAMEをまわしているだけでメモリが4KBぐらいずつ浪費されているっぽい。Event.ENTER_FRAMEのhandlerに渡されるeventをnullにしてみたりしたのだけど変わらない。

メモリ変移を描画するために(ダブルクリックでグラフ表示)時間を取得しているのだけど、それの桁が増えるからその分のメモリが浪費されているのかと思ったのだけど、どーもそうではないらしい。(メモリのチェックはTimerで行っている。)Event.ENTER_FRAMEのhandler内でフレームカウントさせている変数を変化させず、中を空にしていても増加していく。(微々たる量だけど)で、Event.ENTER_FRAMEをaddしなければ使用メモリは増加しない。(つまりメモリーチェックの方の関数系では特にメモリーは増加していないということになるかと・・。)

これはクリアできないものなのでしょうか??


Continue reading Event.ENTER_FRAMEをしているだけでメモリが浪費される??.

Mar 262008

img8.Document

昨日から諸々うにゃうにゃやっていたものを晒してみます。
突っ込みどころ満載だと思いますが・・・汗


目的は
・stand aloneモードなのかcomplex mode?なのかで動作を切り分けたい(開発過程において)
・as2で言うところの_rootを取得したい。
・実行環境がサーバ(http or https)かローカルなのかを取得したい。
・DisplayObject以外でもstageを参照したい。
と言うところ。


使い方はDisplayObjectで、

import img8.Document;
Document.isRoot(this);
といった感じで実行すると、そのDisplayObjectの含まれるswfが最上位である場合rootとstageが格納。それ以降読み込まれた外部swfでisRootがcallされてもreject(多分)。


ただし一番親のswfでisRootが実行されていないと、errorをthrowします。
なので、とりあえず一番親になるswfでは実行必須になってしまっています。
(ここを子供からでも解決できるように悪戦苦闘していました)


用意されているmethod,propertyは以下のとおり。

isRoot(displayInstance:DisplayObject):Boolean
displayInstanceがrootに相当するか否か?相当する場合Documentクラス内にrootとstageが定義されます。親であった場合true。

root:DisplayObject [read-only]
最上位のdisplayObjectを戻す。

stage:Stage [read-only]
ステージクラスを戻します。一応これ経由でlistener登録、削除できますので、DisplayObject以外でonResizeを取得することも可能なはず。

url:String [read-only]
最上位のswfのURLを戻します。まぁ特に使うことはないかと。

isLocal:Boolean [read-only]
動作環境がローカルかサーバ上(http or https)で動作しているか?これでローカル開発モード、サーバモードの切り替えなどを行えるかと・・。

っつーようなかんじです。理想は親swfでisRootしないで、子swfから実行してもroot,stage,urlなどが取得できるのが理想なんですが、うまくいかない・・・。出来そうな気だけしているのですが、実力が追いついていません・・。

Continue reading img8.Document.

Mar 252008

this.stage.loaderInfo.url

勘違いなのかよくわからないのだけど、
mother.swf
child.swf
という二つのSWFがあって、mother.swfがchild.swfをloadするとします。で、このときにchild.swfの方で
trace(this.stage.loaderInfo.url)を実行するとmother.swfのURLが出てくるのだと思っていたのだけど、なんかちょっと予想していない結果になってはまり中。


たとえばmother.swfに

trace(this.loaderInfo.url);
trace(this.stage.loaderInfo.url);
とすると両方とも"motehr.swf"の値が出る。これは問題なし。

続けてmother.swfからchild.swfを読み込みルートタイムラインにaddChild。
で、child.swfの中で

trace(this.loaderInfo.url);
trace(this.stage.loaderInfo.url);
を実行すると両方とも"child.swf"となる。 (期待していた値はL1="child.swf",L2="mother.swf")


ただし、読み込む前になんかしらスクリプトを実行したりすると(明確にそれが何か不明だけど、今作っているカスタムクラスを定義すると)きちんと(L1="child.swf",L2="mother.swf")の値がでる。


なんか根本的に理解が間違っているのか?


Continue reading this.stage.loaderInfo.url.

Mar 242008

catch、catchって

お前はルー大柴かっ!!
とAS3に対して毒づいてみる。

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

Search and Archives

Tags