Results tagged “Flash”

Feb 072009

AS3での埋め込みフォントの共有について:其の参[ランタイム共有ライブラリ編](未解決)

AS3での埋め込みフォントの共有について:其の一の続きです。

子swfのFontクラスを親swfで使用するやり方は便利な面もありますが、先のエントリーに書いたようにコンフリクトが発生する可能性があります。コンフリクトをクリアするには、子swfの中でそのフォントのTextFieldを適応したTextFieldを生成して親に戻してやれば親swf上で表示可能ですが、早い話がTextFormatのテンプレートを内包する必要があり、TextFormatが追加になるたびにデータサイズの大きいフォントを内包する子swfを更新、その都度ユーザに読み込み負荷をかけることになり、本来の目的に則していないことになります。(コンパイル時間の短縮という制作サイドの利点もありますが、あくまでユーザの利点ベースで考えていきます。)

ということで、他のフォント共有方法というと昔からあるRSL(ランタイム共有ライブラリ)のやり方です。昔はこのやり方のほうにフォントのコンフリクトが発生していたのですが、どうもこの一連の検証をしていてフォントの管理方法がPlayer9からクラスベース(リンケージネーム)からFont.fontName(String)に変更されたような感じです。(この辺はapeirophobia: 特定の文字だけを埋め込んだフォントのランタイム共有方法(AS 2.0)に書いているように、Player9からコンフリクトが改善されている)

ということでまぁこなれた手法ではありますが、一応検証。


Continue reading AS3での埋め込みフォントの共有について:其の参[ランタイム共有ライブラリ編](未解決).

Feb 072009

AS3での埋め込みフォントの共有について:其の弐(未解決)

AS3での埋め込みフォントの共有について:其の壱の続き。
(今朝方一度共有ライブラリでのエントリーをアップしましたが、ちょっとまだ問題あったので削除しました。ハテブとかに登録された人スイマセン・・・。追ってまた整理します)


子swfに含まれるFontクラスを用いたフォントの共有は親swfにそのフォントが含まれていると親側ではレンダリングされないということを書きました。恐らくこれはFontクラスは各ApplicationDoamin内グローバルに定義されており、TextFormat等で使用するフォント名はそのFontクラス自体を参照するのではなく、フォント名からApplicationDoamin内のフォントクラスを逆引きするという仕様のような気がします。(ただまぁそうするとApplicationDomain.currentDomainで動作するのもおかしいか・・)

まぁそんなことを考えても仕方が無いので、解決策を考える。

先のエントリーでは子swf内で生成したTextFieldにTextFormatを指定してやれば、適応が可能だというところまで書きました。んが、まぁ正直使えないので今度はFontの実体化のタイミングの視点からコンフリクトを解消できないか調べます。

つまり、「子swfの中のFontクラスを先に定義してしまう」ということ。具体的には「子swfの読み込み+Fontクラスの実体化が、親swfの中の同じフォントの実体化よりも先に完了するように。」するということになります。

これにはタイムラインを使用します。まず、親swf上の静的テキストを2フレーム目に配置。1フレーム目には共有するフォントを配置しないようにします。
090207a.jpg

Continue reading AS3での埋め込みフォントの共有について:其の弐(未解決).

Feb 062009

AS3での埋め込みフォントの共有について:其の壱(未解決)

以前apeirophobia: 特定の文字だけを埋め込んだフォントのランタイム共有方法(AS 2.0)というエントリーを書いたけど、今度はAS3版。既出のリソースとしては
FACEs: as3:フォントのダイナミックなローディング
CS3版 フォントのダイナミックなローディング|_level0.KAYAC
あたりが有名なところ。


で、このやり方で読み込む親SWFの中に同じフォントを用いた静止テキストを配置すると、フォントが表示されなくなるという問題がある。これはPlayer8以前に見られたフォントのconflictと同じような状態(詳細はapeirophobia: 特定の文字だけを埋め込んだフォントのランタイム共有方法(AS 2.0))。恐らくフォントクラスが親SWFで先に設定されてしまうことで、外部SWFのフォントクラスが適応されないというのが理由だと思う。(そう考えるとPlayer8の原因とは違うのかもしれないけど)
簡単に検証したい人はCS3版 フォントのダイナミックなローディング|_level0.KAYACのサンプルをDLして、loader.flaのステージ上にAXIS Std Hで静的テキストを配置すると再現できます。


AS3から外部SWFのクラスアクセスはApplicationDomainの設定も絡んできて、ちょっと原因の切り分けがややこしくなっているので、検証してみました。

なんか良く分からない部分もあるのですが、とりあえず忘れないようにダラダラ書いておきます。

Continue reading AS3での埋め込みフォントの共有について:其の壱(未解決).

Feb 062009

ApplicationDomain

くそーーーーー。こいつめーーー。
なんとかならんのか?!
今のところ八方手塞がり。
ガッデム!

Feb 032009

泣きっ面に蜂

AS3になって丁寧にエラーが出てくるようになったが、若干過剰に感じる時もある。
今日は1行コードを追加したら1300行近くのエラーが排出された。
エラーを読むだけでエラーが発生しそうな勢いである。

倍返しどころの騒ぎではない。

死者に鞭打つ
の方が適当だったろうか?

Jan 302009

ToneWheels

aM laboratory
FP10から音が動的に生成できるので、こういうこともできる。
今までやりたいなーと思っていたことの一つなので嬉しい。
(一応これまでもbyteArray弄ればできたのだろうけど)

Jan 292009

LoaderContext.securityDomain

サーバ上でのクロスドメインでのSWF連携はこれで出来るんだけど、ローカルからサーバ上のSWFを参照するとこれが引っかかる。getDefinitionとかregisterClassAliasがはじかれちゃうなぁ・・・。

とりあえずSecurity.sandboxType == Security.REMOTEの場合だけサーバを参照するようにして対応したけど、そーゆーものなのかしら??クロスドメイン系はいろんなやり方がある上に、ドキュメントも曖昧なので良く分からないなぁ。


Jan 182009

baseが上手く適応されない件(Progression3.1.2)

先日Progressionがバージョンアップした(blog.progression.jp» ブログアーカイブ » [リリース] Progression 3.1.2 をリリースしました)それに伴い、SWFObjectが2にバージョンアップ。それに伴いJS関係が色々変更。
今進めている案件はJSONを組み込んだりとJSを結構弄ってしまっていたので、Class関係だけを更新してJSは前のままにしたら、SWFAddressが動作しなくなってしまった(汗

ということでJS系の更新を試みたのだけど、外部ファイル参照起点設定のbase="."が上手く認識されないのか、起点がindex.htmlになってしまっているっぽく、外部ファイルの参照ができなくなってしまった。

ということでバージョンアップの手順を実際にやりながら書いていく。
(検証しながら色々やっていると自分でどこまで潰したか分からなくなるので・・・)

まず、オデの良く使うフォルダ構造は

/root
 index.html
 /swf
  preloader.swf
  index.swf
 /data
  hoge.xml

っつーような構造で、参照起点をindex.htmlではなく、/swfにする。これはまぁhtmlから読み込んだ際にも、Flashのパブリックプレビューからでも同じように外部ファイルにアクセスして動作するようにしたいということです。(じゃないと正直開発できない。)(index.htmlと同じ階層にSWFを配置すれば問題は無いのだけど、ルートに色々ファイルがあるのは個人的に好みではないというだけ・・)

じゃあまずFlash単体で動作するようにしてみようちうことで、IndexSceneの中でTopちうCastSprite拡張のクラスをAddChildして、その中で外部XML(hoge.xml)を読み込んでみる。

ま、特に悩むことはない。簡単に書く

var url:URLRequest = new URLRequest("../xml/hoge.xml");
net = new LoadURL(url);
net.after(_onLoadComp);
net.error(function(e) {
	txf.text += e;
});
addCommand(
	net
	);

index.flaをパブリッシュプレビューすれば問題なく読み込める。

次にswf/preloader.swfswf/index.swfを読み込み、その中からxml/hoge.xmlを読み込んでみる。いや、別に特別なことは何も無い、Preloader.asのコンストラクタは

public function Preloader() {
	// 読み込みたい SWF ファイルの URL を設定します。
	url = "index.swf";
	
	// SWF ファイルの URL の起点を、自身の SWF ファイルが存在するフォルダにするかどうかを指定します。
	useSWFBasePath = false;
}

ですが、swf基点からの読み込みなので、特に変更せずとも読み込める。
(ただuseSWFBasePath ってのがイマイチどのswfまで継承されるのか良くわからないけど・・)

ということで、一度HTMLを経由して表示してみる。

Continue reading baseが上手く適応されない件(Progression3.1.2).

Jan 152009

MovieClip.addFrameScript

Flashには幾つかundocumented functionが存在するのだけど、そのうちの一つ"addFrameScript"。
存在は知っていたのだけど、今まで上手く動作せず、どーしたもんかしら?と放置していた。ちと今回どうしても使いたくなってきたので改めてClassを見てみたらこんな感じだった。

// NON-DOCUMENTED (MANUAL ADDITION)
/**
* Attach a callback method to a frame. Note that this will replace any timeline code or
* previously attached callback.
* The callback method should not expect any parameter.
* @param frame Target frame number (starting from 0).
* @param notify Callback method to attach.
*/
public function addFrameScript(frame:uint, notify:Function):void;

やー (starting from 0).だった。これだけで長い間放置していた・・・汗

ちなみに複数フレームに一気に追加する場合には

addFrameScript(5, aho,6,aho2);

削除する場合には

addFrameScript(5, null);

となります。
ちなみにflashguruでは

addFrameScript(9,output,false,false);

というような記述がありますが、これは動作確認取れませんでした。


ちなみにProgressionの"ExMovieClip"クラスではループ再生制御のためにコンストラクタで

addFrameScript( totalFrames - 1, _complete );

されているので、ループさせる場合等には1フレーム程多目にフレームを定義しておかないとフレームアクションが上書きされてしまいます。


Ref.FlashGuru Consulting - Undocumented Actionscript 3

Dec 052008

毎回行き詰るのは

・extends Arrayのクラス内要素の厳密な型指定
>結局Object化して、配列演算子をブロックする方向に・・汗

・変数のoverride(クラス違い)
>結局子供クラスで定義して、共用メソッドが上にこぼれてくる。

・Static系methodの継承問題
>シングルトン作って、ワンクッション。

いつもここで四苦八苦している気がする。
金なし、暇なし、進化なし。

Dec 022008

ニャホアーーー

Inheritance -- Flash CS3

この辺ではまり中・・・・。
EventDispatcherのStatic化も面倒だ。
なんか良い解決策は無いかしら?

Dec 012008

Progressionサイトリニューアル

Progression™
リニューアルされました。
これに伴いドキュメントのURLも変更されました。(突然見れなくなって泣きそうになった)
All Packages - Progression 3.0 - API Reference

リニューアルに際して、恐れ多くもメッセージを送らせていただきました。
んが、ちょっと一人だけ浮いている気がします。ゴメンナサイ。
(仮面ライダーファンなら分かってくれると思いますが・・・)

Dec 012008

Date.timeはNumberです。

Date - ActionScript 3.0 Language and Components Reference

int定義で演算すると演算結果が無茶苦茶になる。
っつーかなんでNumber?端数出る場合があるのだろうか?
小数点を代入できるっつーことなのか?
カッペむかつく。

Nov 292008

Arrayの拡張で配列演算子でのアクセスを防止できないか?

Proxyとか色々試してみたけれど、駄目だった。
Adobe Flex 3 ヘルプ

うーむ・・・・・。配列演算子を使用しないという前提条件で、代替メソッドを用意するしかないか?
なんかイラッとするなぁ・・。

Nov 252008

SharedObjectの一時変数

AS2の頃は

To create private values for a shared object--values that are available only to the client instance while the object is in use and are not stored with the object when it is closed--create properties that are not named data to store them, as shown in the following example:

ということで

var my_so:SharedObject = SharedObject.getLocal("superfoo");
my_so.favoriteColor = "blue";
my_so.favoriteNightClub = "The Bluenote Tavern";
my_so.favoriteSong = "My World is Blue";
for (var prop in my_so) {
    trace(prop+": "+my_so[prop]);
}
ということができたのだけど、AS3からはdynamicじゃなくなっちゃってできなくなっちゃった。

まぁ何がやりたいかっつーとJSのcookieのexpireみたいなことをやりたいんだよね。ブラウザのウインドウが閉じられた瞬間に破棄する・・みたいな。そういうイベントがあるのかもしれないけど、displayObject系では今のところ無理そうな悪寒。次回アクセスの際にタイムスタンプから継承するかどうか?っつーのはできそうだけど、美しくないなぁ・・。

Nov 222008

progression検証 #20 HistoryManagerの拡張

今回は正確に言うと検証ではなく、改造です・・・。
今後のバージョンアップ等を考えると同期が取れなくなるのでお勧めしません。実装される方は一応自己責任でお願いします。

ドキュメントには掲載されていないのですが、
jp.progression.core.managers.HistoryManager
という履歴を管理するクラスがあります。基本的にはブラウザの「戻る」「進む」ボタンに対応してシーンを遷移させる働きをしています。これを使用しているクラスとしては
jp.progression.core.managers.KeyboardManager
jp.progression.core.managers.SceneManager
jp.progression.core.ui.CastObjectContextMenu

の3つがあります。コンテキストとかは標準的に表に出てくるので使っている人も多いと思います。

で、これと同じ働きをする「back」「next」ボタンをFlash内で実装する場合

HistoryManager.back();//戻る
HistoryManager.forward();//進む
という感じになります。

ただ履歴とその中における現在の位置の関係が分からないため、これ以上戻れない、進めない状態になったときにボタンを殺したりすることができません。(その口を見つけられていないだけかもしれないけど)

つまりHistoryManager._positionとHistoryManager._histories.lengthの関係をチェックして、フロントのボタンの制御を行える口を用意したいなと・・。
ただposition、histories共にprivate static属性のためextendsもできず・・・ということでHistoryManagerに2つメソッドを追加してしまいました。

Continue reading progression検証 #20 HistoryManagerの拡張.

Nov 202008

フルスクリーンモードとswfAddressとIE6

フルスクリーンモードのFlashから別ウインドウや別タブを立ち上げるとフルスクリーンモードは自動的に解除されます。ただWindows IE6でswfAddressを組み合わせた場合、ハッシュレベルでのURL変化が起こっただけでフルスクリーンモードが解除されてしまいます。

なんとはた迷惑な・・・・。
とりあえずメモ。

Nov 172008

progression検証 #19 progression.jsを使用した際のSWFForceSizeの挙動不審

ちとはまったのでメモ。

swfの最小表示領域を確保したい場合にSWFForceSizeを使用するのですが、それがIEで上手く動作しなくてフガフガしてた。現象としては
・設定ウインドウサイズになってもスクロールバーが表示されない
・最初に小さいウインドウで表示させた後に、ウインドウを拡大してもFlashサイズが変わらない。
・縦サイズのみスクロールバーが表示され、横方向は表示されない。
等、上手く動作するときもあれば、上記のようなバラバラの挙動を示していた。

SWFObject2.0でSWFForceSizeを使う | FlashやWebにまつわるいろいろなことが原因かな?とも思ったのだけど、ちと違う。そもそもSWFForceSize.onResizeDivが発動していない。

Progression.jsの中を確認してみると"/contents/objects/version.swf"を用いてバージョンチェックを行って、progression.onLoadを実行。その中でswfObject,SWFForceSizeを定義するってのがデフォルトの流れ。

SWFForceSize内部では定義時に

this.addWindowEvent( 'onload', this, this.onLoadDiv );

をセットして初期化を行うようにしている。

んがprogression.onLoadの発動タイミングによって、document.onload後にSWFForceSizeが定義される可能性があり、そこが多分不具合の原因なのではないだろうか?と思う。(違ったらごめん)

単純に考えて"prog.onLoad"の一番最後にdocument.onLoad()を強制的にCALLしてやれば上手く動くかな?と思ったのだけど、横方向のスクロール制御が不能になったりしたので断念。

外部JSの読み込みのタイミング等に依存しているのか上手く動いたり動かなかったりという不安定な挙動をしめすので一度Progression.jsをはずした形で実装を進めてみることにする。

落ち着いたらも少し調べてみる。

Nov 162008

progression検証 #18 CastImageLoaderの読み込み強制終了 CastImageLoader.close編

apeirophobia: Loaderの読み込み強制終了 Loader.close編apeirophobia: Loaderの読み込み強制終了 Loader.unload編の続き。Progression3でやるとどうなるか?の検証。

主要なコードは以下の通り。本当はもっとスマートな書き方がCastImageLoaderにはありますが、敢えてここはcontentsLoaderInfoと比較するためにこの記述の仕方で・・。
CODE:1

_loader = new CastImageLoader();
//CastImageLoaderイベント
_loader.addEventListener(CastEvent.CAST_LOAD_COMPLETE, _loaded_Loader);
_loader.addEventListener(CastEvent.CAST_LOAD_START, function() { trace("CastImageLoader::ロード開始");_output.text = "CAST_LOAD_START"} );
_loader.addEventListener(Event.UNLOAD, function() { trace("CastImageLoader::アンロードされました"); _output.text = "CAST_REMOVED" } );
//contentLoaderInfoイベント
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function() { trace("contentLoaderInfo::ロード完了"); } );
_loader.contentLoaderInfo.addEventListener(Event.OPEN, function() { trace("contentLoaderInfo::ロード開始"); );
_loader.contentLoaderInfo.addEventListener(Event.UNLOAD, function() { trace("contentLoaderInfo::アンロードされました"); } );
・・・
_bt_cancel.onCastMouseDown = function()
{
	trace("CLOSE実行");
	if (_loader.contentLoaderInfo && _loader.contentLoaderInfo.bytesLoaded < _loader.contentLoaderInfo.bytesTotal)
	{
		_loader.close();
	}
	_loader.unload();
}
・・・
private function _loaded_Loader(e:Event):void
{
	trace("CastImageLoader::ロード完了");
	addChildAt(_loader,0);
}
で、一点注意点としてはCastEventは"UNLOAD"イベントを持たないので、その部分だけはEvent.UNLOADを使用します。あ、あとcontentLoaderInfoではなく直接CastImageLoaderを監視します。

プレビュー/ダウンロードシミュレートでの実行結果は

1:読み込み中にclose実行>読み込みは中断されず、COMPLETEイベント発生。ただし_loaderは表示されない。
2:読み込み前にclose実行>特に問題なし
3:読み込み後にclose実行>_loader消去
4:読み込み中にclose実行後、再度読み込み>2回目の読み込みCOMPLETEイベントが発生するが、_loaderが表示されない。
5:読み込み完了後にclose実行後、再度読み込み>問題なく表示
6:読み込み後、再度読み込み中にclose実行>unloadが無視され、COMPLETE発生後表示されてしまう。

という感じに。読み込みは中断されずCOMPLETEイベントは発生してしまいますが、表示されることはありません。

ただし4、5、6あたりが挙動が不審なところで、読み込み中にunloadを実行する、もしくは一度unlaod無しでCOMPLETEしてしまうとcontents(DisplayObject)の制御が利かなくなるようです。(ExLoader、ExImageLoader、CastImageLoaderの中を見てみましたが、ちょっと原因良く分からなかった)

HTTP経由での実行結果は

1:読み込み中にclose実行>読み込み中断。
2:読み込み前にclose実行>特に問題なし
3:読み込み後にclose実行>_loader消去
4:読み込み中にclose実行後、再度読み込み>問題なし
5:読み込み完了後にclose実行後、再度読み込み>問題なく表示
6:読み込み後、再度読み込み中にclose実行>問題なし

という結果になりました。プレビュー環境でおかしかった4、5、6辺りはHTTP経由では問題ないようです。

で、話はちょっと横にそれますが、contentsLoaderInfoのイベントとのタイミングですが、普通にLoadingした場合

CastImageLoader::ロード開始
contentLoaderInfo::ロード開始
CastImageLoader::ロード完了
contentLoaderInfo::ロード完了

というようにCastImageLoaderのイベントのほうが先に実行されています。ステキです。

では続いて、CastImageLoaderに最適と思われる記述の仕方をしてみます。

Continue reading progression検証 #18 CastImageLoaderの読み込み強制終了 CastImageLoader.close編.

Nov 162008

Loaderの読み込み強制終了 Loader.unload編

前回(apeirophobia: Loaderの読み込み強制終了 Loader.close編)の続き。

とりあえず主要なコードは以下のような感じ。
CODE:1

_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _loaded_Loader);
_loader.contentLoaderInfo.addEventListener(Event.OPEN, function() { trace("ロード開始");_output.text = "START"} );
_loader.contentLoaderInfo.addEventListener(Event.UNLOAD, function() { trace("アンロードされました");_output.text = "UNLOADED" } );
・・・
_bt_cancel.onCastMouseDown = function()
{
	_loader.unload();
}
これをプレビュー/ダウンロードシミュレートで実行すると
1:読み込み中にunload実行>読み込み止らず、読み込み完了して表示
2:読み込み終了後にunload実行>表示されていた_loaderが消去
3:読み込み前にunload実行>何も起きない。
といった感じ。closeの時のように例外throwは無い。ということでhttp経由で検証。
1:読み込み中にunload実行>読み込み止らず、読み込み完了して表示
2:読み込み終了後にunload実行>表示されていた_loaderが消去
3:読み込み前にunload実行>何もおきない
という感じで、どうしようもない感じに終わりましたw

つまりunloadは読み込みが完了したcontentLoaderInfoに対してのみ有効なようです。
ということでcloseと組み合わせて使うのが正解のようですが、なんにしてもプレビュー環境で動作が確認できないのでその辺が面倒です。はぃ。

じゃ次はprogression3のCastImageLoader等で同様の処理を行う場合にどするか?(多分ほとんど一緒だとは思いますが)検証することにします。

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

Search and Archives

Tags