info

category : FlashAS3 Tips
[JavaScript]swfobject2.1  @ JavaScript , FlashAS3 Tips 2009年5月15日

flashをhtmlに貼り付けるときに便利なswfobjectというJavaScriptライブラリがあります。
今まで1.5を使っていました。2.1が出ているんだけど面倒くさいなぁと避けていたのですが、
flashばっかりだと飽きるのでちょいと気分転換に調べ上げました。
swfobjectはこの↓サイトでダウンロードできます。
スクリーンショット1
http://code.google.com/p/swfobject/

まずhtmlに貼り付けるには下記のようにします。サンプル

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="js/swfobject.js"></script>
</head>
<body>

<div id="flashcontent"></div>
<script type="text/javascript">
swfobject.embedSWF("swf/main.swf", "flashcontent", "400", "300", "9.0.45");
</script>

</body>
</html>

1.5のときと同じようにdivタグにidをつけ、
flashplayerのバージョンが足りないときに表示するコードを記述する。
embedするためのコードの引数は下記のようになっています。

swfobject.embedSWF(swfファイル, divタグのid, flashの幅, flashの高さ, 必要なバージョン, expressInstall.swf, flashvars, params, attributes);

5個目までは分かると思いますので6個目から説明します。
6個目以降は必ずしも必要ではありません。
expressInstall.swfはflashplayerのバージョンが足りないときに画面遷移なしに
その場で最新flashplayerをインストールすることができるモジュールです。
使わないときはfalseを渡します。
これを使って貼り付けてflashplayerのバージョンが足りないときは下図のような
画面が出てインストールすることが出来ます。
スクリーンショット2

スクリーンショット3

見た目がアレなので素直にAdobeのサイトへ飛ばすリンクを記述したほうがいいかも。
7個目のflashvarsはflashに値を渡したいときに使います。
使い方:

var flashvars = {};
flashvars.id = "232";

8個目のparamsはmenuやallowfullscreenを設定するものです。
使い方:

var params = {};
params.menu = "false";
params.wmode = "opaque";
params.allowfullscreen = "true";
params.allowscriptaccess = "sameDomain";

9個目のattributesはnameやstyleclassを設定するものです。
使い方:

var attributes = {};
attributes.name = "flashswf";
attributes.styleclass = "jack";
attributes.align = "middle";

これら全部の引数を使うとコードはこんなふうになります。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="js/swfobject.js"></script>
</head>
<body>

<div id="flashcontent"></div>
<script type="text/javascript">
var flashvars = {};
flashvars.id = "232";

var params = {};
params.menu = "false";
params.wmode = "opaque";
params.allowfullscreen = "true";
params.allowscriptaccess = "sameDomain";

var attributes = {};
attributes.name = "flashswf";
attributes.styleclass = "jack";
attributes.align = "middle";
swfobject.embedSWF("swf/main.swf", "flashcontent", "400", "300", "9.0.45", "swf/expressInstall.swf", flashvars, params, attributes);
</script>

</body>
</html>

以上がswfobject2.1の説明です。便利ですねー。
ここまで長々と説明してきましたが、自分で書くのめんどくせーってときは
swfobjectのサイトでswfobject_generator_1_2_air.zipをダウンロードして使えばコピペで済みます。

JavaScriptをかましたMac対応ScrollBarとかswfobject1.5用に作っていたので
2.1のものも作らなければ。

[Tips]ポップアップブロック  @ FlashAS3 , FlashAS3 Tips 2009年4月20日

flashから新規ウィンドウでリンクを開こうとすると
ポップアップブロックにかかるんですが何かいい回避方法知りませんか?
という質問を5回ぐらいはされているような気がする。そのたびにサンプル作って
こうするとよいですよと教えているような気がする。
面倒くさいのでここにサンプルを記す。
サンプル[ActionScript3.0 FlashPlayer9.0]
サンプル[ActionScript2.0 FlashPlayer8.0]
ソースファイル[両方]

[AS3]jsからflashのメソッドを叩く  @ JavaScript , FlashAS3 , FlashAS3 Tips 2009年4月17日

jsからflashのメソッドを叩くメモ。

あらかじめ↓のようなjsメソッドを用意する。
今回は例としてブラウザサイズが変更されたらflashメソッドを叩くことにする。

function init_callback(){
	if(window.addEventListener&&!window.opera){
		window.addEventListener('resize', onResize, false);
		window.onresize = document.onresize = onResize;
	}else{
		if(window.opera){
			window.onresize = onResize;
		}else{
			window.onresize = document.onresize = onResize;
		}
	}
}
function onResize(){
	callMovie(so.getAttribute("id")).windowResizeEvent();
}
function callMovie(id){
	if(swfwheel_safari || navigator.appName.indexOf("Microsoft") != -1){
		return window[id];
	}else{
		return document[id];
	}
}

そしてこんな↓感じでいつも通りswfを貼り付ける。

<div id="flashcontents"></div>
<script type="text/javascript">
<!--
var so = new SWFObject('swf/main.swf', 'main', '1000', '640', '9.0.45', '#ffffff');
so.write('flashcontents');
//-->

flash側は↓のinit_callbackを任意のタイミングで叩く。
叩くとブラウザリサイズ時にcall_from_jsメソッドが実行される。

function init_callback():void{
	ExternalInterface.call("init_callback");
	ExternalInterface.addCallback("windowResizeEvent", call_from_js);
}
function call_from_js():void{
	//実行される処理
}
[AS3]埋め込みフォントの盲点  @ FlashAS3 , FlashAS3 Tips 2009年4月13日

フォントを埋め込んで外部ファイル化するときに
ぶつかったちょっとした問題の原因がわかったのでメモ。
まず埋め込みフォントの外部ファイル化の仕方。

フォントを埋め込んだswf
・ライブラリで右クリック
・新しいフォント
・名前をアルファベットで入力
・フォントを選択してok押下
・ライブラリに出来た「A」を右クリックしてリンケージを選択
・「ActionScriptに書き出し」「最初のフレームに書き出し」をチェック
・クラス名、基本クラスはデフォのままok押下
・パブリッシュ

外部埋め込みフォントを使うswf
・上述したswfをloaderでload
・読み込むときのコードは↓こんな感じ。いつもとちょっと違う

var urlRequest:URLRequest=new URLRequest(url);
var loaderContext:LoaderContext=new LoaderContext();
loaderContext.applicationDomain=ApplicationDomain.currentDomain;
target_loader.load(urlRequest, loaderContext);

・ロードが終わったら今度は↓のコード実行してフォント名を取得

var class_name="フォントシンボルのリンケージ";
var loadedFont:Font = new Font();
var LoadFontClass:Class=ApplicationDomain.currentDomain.getDefinition(class_name) as Class;
Font.registerFont(LoadFontClass);
loadedFont = new LoadFontClass();
font_name=loadedFont.fontName;

・フォント名が取得できたら任意のテキストフィールドに適応させる

var tex:TextField=テキストフィールド;
var texf=tex.getTextFormat();
texf.font=font_name;
tex.setTextFormat(texf);
tex.embedFonts=true;
tex.antiAliasType=AntiAliasType.NORMAL;

以上の処理で外部埋め込みフォントを使用できる。
しかしさっき特定の文字しか表示されないという問題が起こってしまいました。
色々調べたらどうやらloadするswfに外部のフォントと同じフォントを埋め込んでおくと
外部のフォントが適応されないらしい。言ってる意味がわかるだろうか。。。

埋め込むフォント:ヒラギノ角ゴ
font.swf :フォントを埋め込んだ外部ファイル
main.swf :font.swfをロードするファイル
とするとmain.swfにヒラギノ角ゴのフォントを一文字でも埋め込んでおくと
main.swfに埋め込んだ文字しか表示されなくなるということみたいです。
こんなことで2時間ちかく使ってしまった。

追記
同じフォントの静止テキストも無いほうが良いようです。

[AIR]基本メモ  @ FlashAS3 , AIR , FlashAS3 Tips 2009年3月10日

AIRは作るたびに色々忘れているので
基本的なことをメモ

Adobe AIR HTML 開発者用リファレンスガイド
http://help.adobe.com/ja_JP/AIR/1.1/jslr/index.html

アプリケーションを終了する

NativeApplication.nativeApplication.exit();

ウィンドウが全て閉じられたら自動でアプリケーションを終了する

NativeApplication.nativeApplication.autoExit=true;

ウィンドウをドラッグする

var me:NativeWindow=stage.nativeWindow;
me.startMove();

新しいウィンドウを作成する

var news_win:NativeWindow=get_newwindow("none", true, false, false, false);
function get_newwindow(str:String, trans:Boolean=true, resize:Boolean=false, max:Boolean=false, min:Boolean=false):NativeWindow{
	return new NativeWindow(get_winoptions(str, (str=="standard")?false:trans, resize, max, min));
}
function get_winoptions(str:String, trans:Boolean=true, resize:Boolean=false, max:Boolean=false, min:Boolean=false):NativeWindowInitOptions{
	var options:NativeWindowInitOptions=new NativeWindowInitOptions;
	options.systemChrome=str;
	options.transparent=trans;
	options.resizable=resize;
	options.maximizable=max;
	options.minimizable=min;
	return options;
}

ファイルのドロップを受け付ける

bg_mc.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, when_drag_enter);
bg_mc.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, when_drop_item);
function when_drag_enter(e:NativeDragEvent=null):void{
	NativeDragManager.acceptDragDrop(bg_mc);
}
function when_drop_item(e:NativeDragEvent=null):void{
	var str=e.clipboard.formats;
	var filelist:Array=e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
	//filelistにドロップされたFileの配列が格納される
}

ファイルを保存するとき//文字列の場合

var docsDir:File;
if(save_dir!=""){
	try{
		docsDir=new File(save_dir);
	}catch(e){
		docsDir=File.desktopDirectory;
	}
}else{
	docsDir=File.desktopDirectory;
}
try{
	docsDir.browseForSave("(・∀・)ノ< 保存するよ!");
	docsDir.addEventListener(Event.SELECT, execute_saveData);
}catch(error){
	trace("Failed:", "(´・ω・`)失敗したです");
}
function execute_saveData(e):void{
	//文字列の場合
	var str:String="保存する文字列";
	var stream:FileStream=new FileStream();
	stream.open(newFile, FileMode.WRITE);
	stream.writeUTFBytes(str);
	stream.close();
}

アップデートするとき

var air_filename:String="AIRファイル名";
var latest_version:String="新しいAIRアプリのバージョン";//今のが1.0なら1.1とか
var update_filepath:String="AIRファイルパス";
var urlReq:URLRequest = new URLRequest(update_filepath);
fileData= new ByteArray();
urlStream.addEventListener(Event.COMPLETE, loaded);
urlStream.load(urlReq);
function loaded(event:Event):void{
	urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
	writeAirFile();
}
function writeAirFile():void{
	var file:File=File.desktopDirectory.resolvePath(air_filename);
	update_airfile=file;
	var fileStream:FileStream = new FileStream();
	fileStream.addEventListener(Event.CLOSE, fileClosed);
	fileStream.openAsync(file, FileMode.WRITE);
	fileStream.writeBytes(fileData, 0, fileData.length);
	fileStream.close();
}
function fileClosed(event:Event):void{
	var updater:Updater=new Updater();
	updater.update(update_airfile, latest_version);
}
[flv]メモ  @ FlashAS3 , FlashAS3 Tips 2009年2月26日

flvを扱う機会があったのでその時にわかったことをメモ
・扱いづらい
・擬似ストリーミング再生できる(15Mbyteぐらいなら大丈夫)
・flvplaybackのfullscreenTakeOverがtrueになっているとフルスクリーン再生時flvが全面に出る
・fullscreenTakeOverのデフォルト値はtrueなのでコンポーネントのflaを改造して
デフォルト値をfalseにすると安全
・フルスクリーンにしたあとflvplaybackをstageにaddし
fullscreenTakeOverをfalseにした場合、動作が不安定になる
・unloadが無い
・unloadが無いためいちいちnewでaddしてやる方法が安全
・シークはキーフレームにしかできない
・シークメソッドseek()は毎フレーム実行すると重いので
5フレーム毎ぐらいで使うとよい
・スキンを使うと自由度が皆無
・スキンは無しにしてflvplaybackをマネジメントするクラスを作るとよい
・stageのsoundTransformをいじっても音量を変えられない

ああ・・・めんどくさい

[アルファマスク]  @ FlashAS3 , FlashAS3 Tips 2009年2月6日

アルファマスクの新発見
アルファマスクをかけるとき、ブレンドを使ってマスクを「消去」、その親mcを「レイヤー」にしてやっていましたが
この方法だと親mcにマスクをかけたり、親mcを対象にbitmap.drawするとマスクが見えてしまうことになります。
そこで調べていたらもの凄く簡単な解決方法があったのでメモ。

target_mc:マスクをかけられるmc
mask_mc:マスクmc

target_mc.cacheAsBitmap=true;
mask_mc.cacheAsBitmap=true;
target_mc.mask=mask_mc;

いやー灯台もと暗しでした。

[Papervision3D]BitmapMaterialで一瞬カッ!てなる→解明  @ FlashAS3 , FlashAS3 Tips , Papervision3D 2008年12月19日

タイトル通りBitmapMaterialで一瞬カッ!てなる(ブラウザが一瞬止まる)原因を解明しました。
BitmapMaterial.asの135行目あたりのgraphics.beginBtimapFillメソッドの
手前に下記のコードを追加すれば回避できます。
テクスチャがおかしくなるときはlimitの値を大きくしてください。
これを使ってcharaがスムーズに動くようになりました。
どっちでも変わらないっていうPCには関係ないです。

chara(下記コードを適応したもの)
chara(下記コードを適応していないもの)

var limit:int=18000;
if(Math.abs(_localMatrix.tx)>limit)_localMatrix.tx=limit*((_localMatrix.tx==0)?0:((_localMatrix.tx>0)?1:-1));
if(Math.abs(_localMatrix.ty)>limit)_localMatrix.ty=limit*((_localMatrix.ty==0)?0:((_localMatrix.ty>0)?1:-1));
[3Dプロッタver2]  @ FlashAS3 , FlashAS3 Tips 2008年10月18日

Papervision3Dを使うほどではないが、3Dな表現をしたいなぁというときには3Dプロッタを使っています。
前回のコードはカメラが動かない条件下で使えるものだったのですが
カメラを動かす必要が出てきたので作ってみました。Papervision3Dと同じ演出をすることができます。
スクリーンショット1

3Dプロッタ2

焦点距離:camera.focus
拡大率:camera.zoom
対象オブジェクト:target_mc
対象オブジェクト3D座標:_x, _y, _z

scale=(camera.focus)/(camera.focus+(target_mc._z-camera.z-camera.focus)) * camera.zoom;
xpos=(target_mc._x-camera.x)*scale;
ypos=-(target_mc._y-camera.y)*scale;

target_mc.scaleX=target_mc.scaleY=scale;
target_mc.x=xpos;
target_mc.y=ypos;
[3Dプロッタ]  @ FlashAS3 , FlashAS3 Tips 2008年8月12日

Papervision3Dを使うほどではないが、3Dな表現をしたいなぁというときには3Dプロッタを使っています。
下記のコードは昔からある古典的3D計算だそうです。よく忘れるのでメモ

焦点距離:camera_f
対象オブジェクト:target_mc
3D座標:x3d, y3d, z3d

var scale=camera_f/(camera_f+target_mc.z3d);
var xpos=target_mc.x3d*scale;
var ypos=target_mc.y3d*scale;

target_mc.scaleX=target_mc.scaleY=scale;
target_mc.x=xpos;
target_mc.y=ypos;