Results tagged “AS3”

Jun 172012

asにjsを埋め込む

よく忘れて過去のリソースを探るので、こっちにメモ

ExternalInterface.call( scriptSrc);
private const scriptSrc:XML = ;

スタンドアロンで検証したい場合は、確かExternalInterface.availableで代替処理を入れてやれば切り分けることも一応できるとおもう。(そのJS内の処理内容によるけれど)

きちんと整理してパッケージ化したいと思ったまま5年ぐらい放置・・・汗

HTMLの生成はXMLDocumentからXMLに変更になった際にできなくなった気がする。
flex - Flash as3 process XML Doctype Entities - Stack Overflow
回避策はなんとなしに頭の中にあるのだけど、整理する時間がないので、備忘録的にメモ
Adobe Flash Platform * XML 変数の初期化
とか使うと連携が楽そう

Jul 072011

ProgressionでSWFAddressのExternalChangeが発動しない件

走り書き。

Progression4 + SWFaddressでindexにQueryって駄目だったっけ?
#?id=112
みたいなの。
この形だとexternalChangeeがWebSynchronizer内のSceneId.validatePathに引っかかってgotoまで遷移しない。(Queryの場合はSceneEvent.SCENE_QUERY_CHANGEも呼ばれない)

とりあえず間にひとつシーンをかませば問題なく動作する。
#/v/?id=2
みたいなかんじ。

SWFAddress単体では動作していたような気もするのだけど、記憶が定かではない。

Ref.Asual | SWFAddress - Deep linking for Flash and Ajax
Progression - Framework for Flash

Jun 262011

LoadBitmapData

久々Progressionネタを書いてみる。
LoadBitmapDataのcompleteの処理はL193から以下のように記述されている。
private function _complete( e:Event ):void {
	// 対象が Bitmap であれば
	try {
		// データを保持する
		super.data = Bitmap( _loader.content ).bitmapData;
	}
	catch ( err:Error ) {
		// データを破棄する
		super.data = null;
		
		// 破棄する
		_destroy();
		
		// エラー処理を実行する
		super.throwError( this, err.message );
		return;
	}
	
	// 破棄する
	_destroy();
	
	// 処理を終了する
	super.executeComplete();
}
これ、
super.throwError( this, err.message );
この部分
super.throwError( this, new Error(err.message) );
にしないと動かないんじゃないかしら?と思った。

そんなこたーないかしら? もうライブラリに手を入れないようにしようと思っているけれど、ちょっとここは直さないと動かないんじゃないかなぁ?

Dec 192010

TextAreaへのStyleSheet適応

fl.controls.TextAreaクラス。
納品物として使うことはまずないのだけど、デバッグとかでアウトプット表示に使うことは多々あります。で、そのアウトプットテキストの中にシーン遷移のリンクを入れたりしたい時に、StyleSheetを適応すると便利だろと。

で、以前はTextAreaに"stylesheet"というプロパテイがあった気がするのですが、今見てみると無い。(そのかわり"textField"というプロパティが追加されて、コンポーネント内部のtextFieldが直接参照できるようになっている。

で、textField.stylesheetとしてOKか?と言われるとそんなことは無く、

Error: Error #2009: このメソッドは、スタイルシートを使用するテキストフィールドに対しては使用できません。
at flash.text::TextField/setTextFormat()
at fl.controls::TextArea/drawTextFormat()
at fl.controls::TextArea/draw()
at fl.core::UIComponent/callLaterDispatcher()
こんなエラーが戻って来ます。
基本的にtextFieldで管理するんだから、styleSheet等使うんじゃない!ゴルァ!と言う感じの対応ですが、かろうじて"drawTextFormat"が"protected"なので、extendsで対応することにします。

package display
{
	import fl.controls.TextArea;
	public class ExTextArea extends TextArea
	{
		public function ExTextArea() {
			super();
		}
		
        override protected function drawTextFormat():void {
            if (!textField.styleSheet) {
				super.drawTextFormat();
			}
            else {
                setEmbedFont();
                if(_html) textField.htmlText = _savedHTML;
            }
        }
	}
}
こんな感じでとりあえず使えるようになります。 ただそもそもAdobeが何故StyleSheetを使用不可にしたのか? 致命的に解決できないバグがあるのか?は不明です。

その辺ご了承ください。

Oct 022010

flash developからprojector(.exe)形式の書き出し

flash developとか使っているとどーするのだ?という質問を時々されますけど、swfファイルをflash playerで表示して、メニューから「プロジェクタの作成」で可能なり。

AIRでもいいんだけど、AIR用に書き直ししないといけない部分とか多々あるので、簡単に済ませたいときはこんな感じで・・・。

Macはちょっと分からないけれども・・・

Oct 012010

LoadBitmapData.defaultCacheAsResourceなど無い

最近あまりFlash実装の機会がありませんけれど、唐突にProgression。

LoadBitmapDataのdefaultCacheAsResourceを設定しようとして、
LoadBitmapData.defaultCacheAsResource
とか書いてエラーになって困っていたが、ドキュメントのURLをよくよく見たら、リンク先がsuperClassのLoadCommandになっていたアルヨ。

LoadCommand - Progression 4.0 API Reference

つまりLoadCommandのサブクラスも一括設定ということで、他のサブクラスでCache有効にしたい場合とかは個別インスタンスで設定すべし。
べしべし。

なんか前も似たようなことをやっていた気がするけれど・・・。忘れた。

ちなみにキャッシュ有効にして、LoadCommand.disposeを使用しないで、BitmapDataを直接disposeするとリソース管理が把握できなくてヌルっちゃいます。注意。

Mar 262010

Vector.sort

Vector - Flash CS4 Professional ActionScript 3.0 Language Reference

compareFunctionは
function compare(x:T, y:T):Number {}

a negative number, if x should appear before y in the sorted sequence
0, if x equals y
a positive number, if x should appear after y in the sorted sequence

と書いてあるのだけど、実はint(±1以上?)じゃないと判定してくれない?

Feb 272010

Height Problems in fl.controls.*

プロトタイプやらスケルトンを急ぎで作りたいときに、まれにfl.controls系を使いますが、配置の際に高さの問題がでてきて、いつも忘れてバタバタするのでメモ。

fl.controls系でテキストフィールド(textArea)を内包しているコンポーネントは高さが100pxになる。変数で配置して行く場合など非常にうっとおしいことになる。単体でのheightはoverrideされて見た目の高さを取得できるが、親DisplayObjectのheightは100px。ちなみにgetRectだと単体でも100になる。これはoverrideされていないらしい。(半端だ)

これの原因は大概コンポーネントの中に含まれるtextAreaで、autoSizeがカマされてない素の状態でaddChildされているのかheight=100である。fl.controls.TextInputだと以下のような感じで調整してやれば最適な高さになる。

_inputFld = new TextInput();
inputFld .getChildAt(0).height = 0;

ただfl.controls.ComboBoxとかだと階層化していてめんどくさいので、

var pd:ComboBox = new ComboBox();
_optHeight(pd);
...
private function _optHeight(arg:DisplayObjectContainer):Number
{
	var child:DisplayObject;
	for (var a:int = 0; a < arg.numChildren; a++)
	{
		child = arg.getChildAt(a);
		child.height = 0;
		if (child is DisplayObjectContainer) _optHeight(child as DisplayObjectContainer);
	}
	return arg.height;
}
な感じでやっちゃう。 全部試したことがないので、NGなコンポーネントもあるかも知れないけど。


ということでメモ

Dec 122009

Query the Loaded Classes

ううーん、ちと欲しいなとおもってググって見つけたのだけど、ちょっとByteArrayの走査の部分が重たそうな気がするなぁ・・

Query the Loaded Classes in Flex / AS3

Source of DefinitionListDemo
AS3 Commons Reflect - Welcome to as3commons-reflect

結局のところ、親はこれらにダイナミックに対応するわけではなく、明示的に指示をだすので、事前把握されてるということが前提と考えると、あえてダイナミックに処理する必要はないんだよなぁ・・。

とすると、どこかラッパーみたいな中でそれらを定義するか、定義自体を外部ファイル化してしまうか?なんだけど、定義自体を外部化しても対してメリットがないのかも・・・。

Jul 042009

メモ

Jun 212009

VerifyError: Error #1021

昨日からこのエラーではまっている。

VerifyError: Error #1021: 最低 1 つのブランチターゲットがメソッドの有効な命令を反映していません。 * メモ : このエラーは、SWF 内の ActionScript が無効であることを示します。 該当ファイルが壊れていない場合は、問題をアドビ システムズ社までご報告ください。

なのだそうだ・・・。
どうもswitch文あたりが影響を与えているっぽいが、なんか良く分からないな・・・。

Apr 132009

Supported Character Sets

よく忘れるのでメモ
Supported Character Sets - ActionScript 3.0 Language and Components Reference

日本語だけでも聞いたこと無いやつあるけれど・・・。
これとか昔のMACのキャラクターセット?
Japanese (Mac) x-mac-japanese

Apr 132009

URLStreamでFLVを再生する

イメージやらswfは特に問題ないが、flvってどうやるんだろう?
attachStreamにURLStreamを割り当てるわけでもないだろうし・・・。

誰かやっている人とかいるのかしら??
(まぁそんな需要もないかもしれんのだけど)

Continue reading URLStreamでFLVを再生する.

Apr 132009

SecurityDomain周り

SecurityDomainで諸々メモ。(まだ間違っている部分があるかもしれない)

条件
・セキュリティポリシーファイルを読込先サーバに配置できない
として、どーやってそのサーバに配置されているソースを読み込むか?ということでProxyのような働きをするswfを用意し、それを介して読込先サーバのリソースにアクセスしてみるようなかんじ。


・Security.allowDoaminの設定。
Security.allowDoamin("*")でも良いが、危険なので

親:Security.allowDomain(loader.contentLoaderInfo.url);
子:Security.allowDomain(this.root.loaderInfo.loaderURL);
な感じで動的に設定した方がよさげ。


・LoaderContextの設定
checkPolicyFile = false;
securityDomain =null;
これらを設定するとcrossdomain.xmlを参照し、その時点で停止。
ApplicationDoaminの設定は問題ないが、Security.allowDoamin前に確認されるからか、適応されないっぽい。まぁLoaderContext無しで動くようにする必要がある。


・子swf内クラスのイベント
取得するにはdispatchを受け付けるように、親にもSecurity.allowDoaminが必要(当たり前ですが)


・子swfでのクラス定義のタイミング
ポリシーファイルが定義されている場合は、子swfの変数として
var a:hoge = new Hoge()
見たいにして定着させるが、Security.allowDoaminで開放する場合には、解放後定義しないと参照できない。つまりコンストラクタで

Security.allowDomain(this.root.loaderInfo.loaderURL);
とした後に new Hoge(); 等と空打ちして焼き付ける。


・子swfのクラスの取得
SecurityDomainが同じ場合は、ApplicationDoamin.currentDoamin.getDefinitionでクラスを取得できるが、前述の通りSecurityDomainが異なるためApplicationDoamin.currentDoaminに子swfが含まれていない。このため

loader.contentLoaderInfo.applicationDomain.getDefinition("Hoge") as Class;
みたいに取得する。ただし、これを親クラス側で変数に代入して流用は可能。
var hogeClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("Hoge") as Class;
var hoge = new hogeClass();
ただし型指定をするとエラーになる。 簡単なのは子クラスを格納するクラスを作って、その中にStaticで格納するのが楽。


・Loader系
子swfで定義されたLoader拡張クラスを、親swfでgetDefinitionして取得した後は、親でインスタンス化しても使用可能。ただしcontnt等セキュリティエラーに抵当するプロパティもある。例えばBitmapDataを取得したい場合は、子swfに含まれるLoader拡張クラスの中で、BitmapData化して引き渡すなどの処理が必要。

public function get bmd():BitmapData 
{
	var bmd:BitmapData = new BitmapData(content.width, content.height);
	bmd.draw(content);
	return bmd;
}
こんなかんじ?このBtimapは親で自由に使える。Sprite系なども基本newしてしまえば自由に使えるが、SecurityDomainを超えた要素はやはりセキュリティエラーになるので注意。(この辺ローカルでは確認できないので、サーバ上で確認するしかないのだけど・・、そこが非常に面倒)


ただリダイレクト系の分散負荷のシステムだと、結局このproxySWFとそこから呼ばれるソースのIPがまた変わってしまうという延々とループな感じの挙動にってしまう。イメージやらswfやらが対象であればバイナリ化してLoadしたほうが圧倒的に楽。ただFLVの場合が・・・・汗

ということでとりあえずメモ。

Apr 112009

はて・・・

ScruityDomainを超えるとApplicationDomainを統一しても、子SWFのドキュメントクラスはgetDefinitionできなかったっけ??

なんか頭こんがらがってきた。

Feb 162009

TextFieldAutoSize.RIGHTの憂鬱

もうこれ前々から良く分からないんだけど、改めて今日再チャレンジしたけどやっぱり分からない。
何がやりたいかっていうと
・右揃え(基点、行送り共に)
・改行アリ
・幅固定
をやりたいってこと。
幅固定をなしにして普通にやるとこんな感じ。

import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;

var txf:TextFormat = new TextFormat();
txf.align=flash.text.TextFormatAlign.RIGHT;

var tx:TextField = new TextField();
tx.defaultTextFormat = txf;
tx.border=true;
tx.autoSize =TextFieldAutoSize.RIGHT;
tx.x=200;
tx.text="これは どうしてああああああ \nこうなるの?";
addChild(tx);

mmts_mobile004.gif
この場合はtextFieldの端ではなく、内部のテキストの右端がx=200にフィットする。
TextField自体の右端にあわせる場合は一度defaultのwidth=100をリセットしてwidth=0とすれば可能。またautosize設定の前にx座標を指定する場合には、これも同じく一度width=0にしてやればよい。
こんな感じ

var tx:TextField = new TextField();
tx.defaultTextFormat = txf;
tx.border=true;
tx.x=200;
tx.width=0;
tx.autoSize =TextFieldAutoSize.RIGHT;
tx.text="これは どうしてああああああ \nこうなるの?";
mmts_mobile001.gif

で、wordWrapを入れた場合いきなりこんなことになる。

var tx:TextField = new TextField();
tx.defaultTextFormat = txf;
tx.border=true;
tx.wordWrap=true;
tx.autoSize =TextFieldAutoSize.RIGHT;
tx.x=200;
tx.text="これは どうしてああああああ \nこうなるの?";
mmts_mobile002.gif いきなり左基点である。(この場合のTextFieldの幅はdefaultの100)
Continue reading TextFieldAutoSize.RIGHTの憂鬱.

Feb 092009

ProgressionでRSLを配置するとCastDocumentの"_onInit"がロストしてしまう件

先日のエントリー(AS3での埋め込みフォントの共有について:其の伍[RSLの先読み対応 with Progression](多分解決))の中で書いた、「2)ProgressionでRSLを配置するとCastDocumentの"_onInit"がロストしてしまう。」の件について少し調べてみました。前回のエントリーでは

loaderInfoの"Event.COMPLETE"がRSLが存在すると発動しないというのが起因しているかと思います。
ってさらっと書きましたが、一応順を追って書いておきます。

"CastDocument._onIinit"は"ExDocument._initialize"内でdispachされて発動されます。"ExDocument._initialize"の発動は、"ExDocument"内の4つのフラグ"_initialized","_loaderInited","_loaderCompleted","_addedToStaged"が

if ( _initialized ) { return; }
if ( !_loaderInited ) { return; }
if ( !_loaderCompleted ) { return; }
if ( !_addedToStaged ) { return; }
を満たした場合に実行されます。 で、RSLを配置しない場合は
trace("ExDocument._initialize",_initialized,_loaderInited,_loaderCompleted,_addedToStaged);
//ExDocument._initialize false false false true
//ExDocument._initialize false true false true
//ExDocument._initialize false true true true
//発動
な感じで"_onInit"がcallされます。

一方RSLを配置した場合は

trace("ExDocument._initialize",_initialized,_loaderInited,_loaderCompleted,_addedToStaged);
//ExDocument._initialize false false false true
//ExDocument._initialize false true false true
//停止

のなります。問題になっているのは3番目の変数"loaderCompleted"であって、これは"ExDocument.loaderInfo"の"Event.COMPLETE"によって切り替わるフラグになります。

loaderInfo.addEventListener( Event.COMPLETE, _complete, false, int.MAX_VALUE, true );

つまり"CastDocument.loaderInfo"の"Event.COMPLETE"が発動しない。というのが先の

loaderInfoの"Event.COMPLETE"がRSLが存在すると発動しないというのが起因しているかと思います。
この一文の意味するところです。

RSLを配置していると何故に"CastDocument.loaderInfo"の"Event.COMPLETE"が発動しないのか?そこさえクリアすれば動作するのですが、RSLの情報にどーやってアクセスすんだ?ってことろが未だ分からず途方に暮れております。

Continue reading ProgressionでRSLを配置するとCastDocumentの"_onInit"がロストしてしまう件.

Feb 072009

AS3での埋め込みフォントの共有について:其の伍[RSLの先読み対応 with Progression](多分解決)

さて、現実的に使うためにどーするか?ということを考えてみます。特にProgressionで・・・。

問題点としては
1)共有フォントの読み込みがドキュメントクラスのコンストラクタ前に発動してしまう。
2)ProgressionでRSLを配置するとCastDocumentの"_onInit"がロストしてしまう。
この2点をなんとか解決したいと思います。

2)はloaderInfoの"Event.COMPLETE"がRSLが存在すると発動しないというのが起因しているかと思います。(何故なのか?は不明。そもそもRSLのローディングが管理できないのでどーしていいのやら)
ということで、コチラは無理やり"CastDocument"のコンストラクタに

addEventListener(Event.ADDED_TO_STAGE, _onAdd);
として、_onInitに連結します。(override出来ないから)

これに関しては諸々調べていますが、問題が発生する可能性があるので、暫定的な処理とさせてください。実際にこの手法を用いる際にはリスクがあることをご理解の上、実装してください。(今のところ問題が発生するものとしないものの2つのパターンがあることは確認していますが、明確な切り分けは出来ていません。)

private function _onAdd(e:Event):void
{
	_onInit();
	removeEventListener(Event.ADDED_TO_STAGE, _onAdd);
}

一応_onInitの重複発動(Preloader経由だと"Event.COMPLETE"が発動するので)防止のために、"onInit"の最初に以下の一文を入れておく。

if (prog) return;
Continue reading AS3での埋め込みフォントの共有について:其の伍[RSLの先読み対応 with Progression](多分解決).

Feb 072009

AS3での埋め込みフォントの共有について:其の四[ランタイム共有ライブラリ+フォントクラス編](ちょっと解決)

吐き気がしてきました。
apeirophobia: AS3での埋め込みフォントの共有について:其の参[ランタイム共有ライブラリ編](未解決)の続きです。

前回かなり絶望的な結果で凹んでいたのですが、検証続行。

今度は基本に立ち戻り、ストレートに子swfでフォントシンボルをRSL化して、親swfと共有してみます。

1)子swfでフォントをシンボル化して、すべてのプロパティを有効に
090207b.jpg

2)これを親コピペして共有読み込みに。

3)共有化しているフォント名でそのままTextFormat指定。

問題となる親swf上での同一フォントの静止テキストはRSLのリンケージ名を使用して設定すればOK。

これまでのやり方に比べて超簡単。

ただし何故にこれをやらなかったかというと、フォントシンボルは実体が無いため、ドキュメントクラスのコンストラクタ発動前に強制的に読み込みが始まってしまう点。※1

※1
これはそのフォントを使用した静的テキストを含むオブジェクトがリンケージ設定で「最初に書き出し」になっている場合です。逆にどこにも使用されていない場合には明示的にそのフォントを使用した静的テキストを配置する必要があります。(そうしないとembed出来ない)
そしてそれがタイムライン上で認識された瞬間にFlashはRSLを含む子swfの参照、読み込みを開始します。既に認識されている(キャッシュに貯まっている?)場合は読み込みリクエストを出さない仕様になっていると思われます。(そのキーがリンケージURL?)

つまり和フォントとか埋め込んでいたら、3MBとかの外部swfの読み込みが完了しないとLoading表示できない・・・という部分。※2これはユーザに謎の空白の時間を与えてしまうことになりあまりよろしくない。ということでもう少し考えてみる。
少し使えるかもしれないサンプルはこちら。
www.img8.com/src/test_font6.zip

あと少しかなあ・・・。

※2
コンストラクタ前のLoadingを回避する方法としてはそのフォントを含むリンケージシンボルをタイムラインで後ろに配置してそこで実体化させる方法ですが、近年のOOPS化によるリンケージシンボルの増加を踏まえると作業効率的に現実的では無い。業界的にシフトしているPreloader化に従うべきかと。

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での埋め込みフォントの共有について:其の参[ランタイム共有ライブラリ編](未解決).
2 3 4  

Search and Archives

Tags