info

category : FlashAS3 Tips
[URLStream]  @ FlashAS3 , FlashAS3 Tips 2008年7月31日

Loaderクラスのインスタンスでloadすると画像やswfを読み込むことが出来ます。
しかし、ローディング中にunloadしてもストリームが止まらないという現象が起きます。
ダウンロードシミュレータ上で確認できます。
FlashPlayerのバグだという噂ですが
これを回避するのにURLStreamを使用するとよいです。

var myLoader=new Loader();
var myStream=new URLStream();
myStream.addEventListener(Event.COMPLETE, completeHandler);
myStream.load(new URLRequest("ファイル名"));
function completeHandler(event){
	var bArray=new ByteArray();
	myStream.readBytes(bArray);
	myStream.close();
	myLoader.loadBytes(bArray);
}

unload時

if(myStream.connected){
	myStream.close();
}else{
	myLoader.unload();
}
[IOError]  @ FlashAS3 , FlashAS3 Tips 2008年7月11日

Flashからファイルをロードするときパスが間違っていたりファイルが無かったときの処理の仕方。
よく忘れるのでメモ

var ns = new Namespace(url);
var xmlLoader = new URLLoader();
xmlLoader.dataFormat = URLLoaderDataFormat.TEXT;
xmlLoader.addEventListener(Event.COMPLETE, func);
xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, func2);
xmlLoader.load(new URLRequest(url));
[Flash+PHP]データをサーバへ送るには  @ FlashAS3 , FlashAS3 Tips 2008年7月6日

FlashからPHPへデータを送って返事をもらうという処理をするとき、
いつもコードを忘れてしまうのでメモ

Flash側
var variables=new URLVariables();
variables.step="送るデータ";

var urlreq=new URLRequest(php_path);
urlreq.method=URLRequestMethod.POST;
urlreq.data=variables;

var urlloader=new URLLoader(urlreq);
urlloader.dataFormat=URLLoaderDataFormat.VARIABLES;
urlloader.addEventListener(Event.COMPLETE, get_data_complete);
urlloader.load(urlreq);

function get_data_complete(e){
	var vars=new URLVariables(e.target.data);
	var str=vars["returndata"].toString();
	trace(str);
}
PHP側  パーミッションの設定を忘れずに
<?php
$step = $_POST['step'];
$ss="データ受け取りました";
echo "returndata=".$ss;
?>
[Flash+js+CSS]swfのサイズをダイナミックに変更する  @ FlashAS3 , FlashAS3 Tips 2008年7月6日

swfを貼り付けるときにサイズを指定しますが、
そのサイズをダイナミックに変更することに挑戦したら出来ました。
下記コードでFlashからjsをたたけば実行できます。
サンプルページ  サンプルページ2

html
<body bgcolor="#ffffff" onload="init_swfsize()">
<div id='flashcontent'></div>
<script type="text/javascript">
<!--
var installedVer=deconcept.SWFObjectUtil.getPlayerVersion();
var requiredver=9;
var requiredver2=45;
if(installedVer['major'] >=requiredver && installedVer['rev'] >=requiredver2
	|| installedVer['major'] >requiredver){
	var so = new SWFObject("swf/main.swf", "swf0", "100%", "100%", "9.0.45", "#000000");
	so.addParam("allowScriptAccess", "sameDomain");
	so.addParam("base", "swf/");
	so.write("flashcontent");
}else{
	//プラグインバージョンが低いときの処理
}
// -->
Javascript
function init_swfsize(){
	target_content=document.getElementById("flashcontent");
}
function set_swfsize_w(target_size){
	target_content.style.width=target_size;
}
function set_swfsize_h(target_size){
	target_content.style.height=target_size;
}
function set_swfsize(target_w, target_h){
	target_content.style.width=target_w;
	target_content.style.height=target_h;
}
CSS
#flashcontent{
	width:400px;
	height:400px;
}
[Flashからjpg]  @ FlashAS3 , Flash DEMO , FlashAS3 Tips 2008年7月2日

Flash上のBitmapで画像を生成してjpgで保存すること。AS2時代に一度作ったのですが
処理が重くて実用するのは難しいなぁと思っていました。しかし最近ふと思い出して
AS3でつくったら出来ました。
スクリーンショット1
flash2jpg

JPGEncoder.asがいります。
SVNリポジトリ:http://as3corelib.googlecode.com/svn/

function save_jpg(bmd){
	var jpg_enc=new JPGEncoder(50);
	var byte_array=jpg_enc.encode(bmd);
	url_request=new url_request(phpPath);
	url_loader=new url_loader();
	url_request.contentType="application/octet-stream";
	url_request.method=URLRequestMethod.POST;
	url_request.data=byte_array;
	url_loader.load(url_request);
	url_loader.addEventListener(Event.COMPLETE,when_save_done);
}
function when_save_done(e){
	file_name=url_loader.data;
	tex_in.text=file_name;
}

PHP側はこう

<?php
$t=time()+72000;
$fileName=date("Ymd")."_".date("His")."_".$t.".jpg";
$fp = fopen("../image/".$fileName, 'wb');
fwrite($fp, $GLOBALS['HTTP_RAW_POST_DATA']);
fclose($fp);
print $fileName;
?>
[TextField]リンククリック→関数実行  @ FlashAS3 , FlashAS3 Tips 2008年6月26日

TextField.htmlTextにhtmlを入れてやればhtml表現ができます。
「href」でハイパーリンクを設定することが可能です。そしてハイパーリンクをクリックしたときに
関数を実行できることを知ったのでメモ サンプルページ

tex_in : テキストフィールドインスタンス名
tex_in.htmlText="<a href="event:">クリックすると関数実行</a>";
tex_in.addEventListener(TextEvent.LINK, when_text_release);
function when_text_release(e){
	trace("(・∀・∀・)あ、いま押した?");
}
[SWFObject1.5]htmlへflashを貼り付ける  @ FlashAS3 , FlashAS3 Tips 2008年6月25日

すでに2.0もリリースされている便利なJavascriptですが2.0を使わず1.5を使っています。
理由は特に無いです。そして、使うときいつも書き方を忘れるのでメモ

<script language="JavaScript" type="text/javascript">
<!--
var installedVer=deconcept.SWFObjectUtil.getPlayerVersion();
var requiredver=9;
var requiredver2=45;

if(installedVer['major']==requiredver&&installedVer['rev']>=requiredver2
|| installedVer['major']>requiredver){
	var so=new SWFObject('swf/main.swf','main','1010','640','9.0.45.0','#ffffff');
	so.addParam('wmode','opaque');
	so.addParam('base','swf/');
	so.addParam('menu','false');
	so.write('flashcontent');
}else{
	プラグインのバージョンが低いときの処理
}
// -->
[wmode][ExternalInterface]wmode:opaqueでポップアップブロック  @ FlashAS3 , FlashAS3 Tips 2008年6月1日

swfファイルをhtmlへ貼り付けるとき、
wmodeを設定しないと(デフォルト値だと)ブラウザ上で再生速度が遅くなります。
これを解決する方法としてwmodeをopaqueにするとよいですが、
IEで「navigateToURL」を使って新規ウィンドウに
リンクを開くとポップアップブロックにかかります。サンプルページ
そこで「ExternalInterface」を使用すればこの問題を解決することができます。
FlashCS3のヘルプには

ExternalInterface クラスは外部 API であり、ActionScript と Flash Player のコンテナとの間で
直接通信できるようにするアプリケーションプログラミングインターフェイスです。

と書かれています。よくわかりませんが、JavaScriptの関数とか実行できるということみたいです。
これをリンクを開くときに使うには下記のようなasファイルを用意して
ボタンがクリックされたときに「getURLex」にURLを渡して実行してやればよいです。
wmodeには他にも問題がありますがそれはまた次の機会に。

ファイル名 : getURL.as
package {
	import flash.net.navigateToURL;
	import flash.net.URLRequest;
	public function getURL(url, window="_blank"){
		navigateToURL(new URLRequest(url), window);
	}
}

ファイル名 : getURLex.as
package{
import flash.external.ExternalInterface;
public function getURLex(url, window="_blank"){
	if(ExternalInterface.available){
	var str="";
	try{
		str=ExternalInterface.call("function(){return navigator.userAgent;}").toString();
	}catch(e){
		str="failed";
	}
	if(str=="failed" || str.indexOf("Safari")>-1 || str.indexOf("Opera")>-1){
		getURL(url);
	}else{
		try{
			ExternalInterface.call("function(){window.open('"+url+"', '"+window+"'); void(0);}");
		}catch(e){
			getURL(url);
		}
	}
	}else{
		getURL(url);
	}
}
}
「_global」はどこへいった  @ FlashAS3 , FlashAS3 Tips 2008年5月18日

無くなったようです。
グローバルメソッドを作るときはasファイルで定義してやればいいみたいです。
こんな感じで
ファイル名:set_release.as

package{
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.display.SimpleButton;
	public function set_release(mc, func){
		mc.addEventListener(MouseEvent.MOUSE_UP, func);
	}
}