AS3の最近のブログ記事

ただ単純にオブジェクトにブラーをかける場合です。
importをちゃんと書かないとコンパイルエラーになります。


import flash.filters.BlurFilter;
//import flash.filters.BitmapFilterQuality; //任意

var targetObj = XXXXXXX;
var my_blur:BlurFilter = new BlurFilter();
my_blur.blurX = 10;
my_blur.blurY = 5;
//my_blur.quality = BitmapFilterQuality.HIGH;//任意
targetObj.filters = [my_blur];

画像更新が必要なコンテンツでは、今まではFlashを開かずに更新ができるように1枚1枚画像を追加し、それらを紐づけるXMLも持たせて・・・という作りを多用してきましたが、最近、画像の多さ=ファイルの多さはネットワークを介して読込みにいくという行為1つ1つにhtmlのヘッダやらなんやらのいろいろなトラフィックが発生するので、ファイルサイズ以上にストレスになる気がしています。
ということで、画像たちは1つの外部swf内に入れ、クラスとして書き出しておくことで、メインのflashからnewで使うようにしています。
その際に、同じ形状のものは1つのmovieclipとして、フレームで入れ込んで使っています。

言葉で書くといまいちわかりにくいですが、今後のコピペのために、ActionScriptを下に書いておきます。
※スクリプトに間違いがあったので、修正しました。(2010.12.2)

Actionscript3==========
var fileLoader:Loader;
var classA:Class;
var classB:Class;
       
function loadFiles (){
    fileLoader:Loader = new Loader();
    var my_file = "files.swf";
    var myRequest:URLRequest = new URLRequest(my_file);
    fileLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, drawFiles);
    fileLoader.load(myRequest);
}
       
function drawFiles(event:Event):void {
    classA = fileLoader.contentLoaderInfo.applicationDomain.getDefinition("movieclipA") as Class;
    classB = fileLoader.contentLoaderInfo.applicationDomain.getDefinition("movieclipB") as Class;
}

function checkTotalmobiles(){
    var a_mc = new classA();
    trace("totalFrames="+a_mc.totalFrames);
    //addchildは不要
}



XMLやプログラム内で動的にテキストを流し込んだ際の、文末に何かオブジェクトを配置したい場合に、どうしてもテキストエリアの幅と高さを知る必要があります。

その場合は、単純にtextWidthやtextHeightを使って取得します。
下のサンプルでは、txtでテキストエリアを引数で投げると主に、formatでTextFormatも一緒に指定する場合です。


Actionscript3==========
trace("幅は"+stringWidth(my_txt,my_format));

//文字列の幅の取得
private function stringWidth(txt,format):int {
    txt.setTextFormat(format);
    return txt.textWidth;
}

//文字列の高さの取得
private function stringHeight(txt,format):int {
    txt.setTextFormat(format);
    return txt.textHeight;
}

ActionScript3で制作する際に、読込時の負荷の分散化のため、いくつかのmovieclipを外部swfとして読込みたい時があります。
そんな別ファイルにしたswfの中にあるオブジェクトもメインのswf内でライブラリにあるムービークリップと同じくnewして使いたい場合です。
この方法を知ってから、ローディングの時点で必要ないオブジェクトは全て別swfとして必要なときに読み込んでClassとして使えるので、とても重宝しています。

下のサンプルでは、外部swfファイルのparts.swf内のライブラリを画像のように設定したmc_tmpを、メインのswf内でnewして配置する場合です。

Actionscript3==========
function setMainParts(){
    mainLoader = new Loader();
    var myRequest:URLRequest = new URLRequest("parts.swf");
    mainLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, drawParts);
    mainLoader.load(myRequest);           
}

var mc_tmp:Class;   
function drawParts(event:Event):void {
    mc_tmp = mainLoader.contentLoaderInfo.applicationDomain.getDefinition("mc_tmp") as Class;
    var tmp = new mc_tmp();   
    addChild(tmp);               
}           

※ライブラリの設定画面キャプチャは続きを参照

Flash内で更新が必要な部分は、外部のXMLやtxtファイルなどを使い、Flashを編集せずに更新できる仕組みにすることが更新の工数削減に重要なことかと思います。

けれども、単純に番号を変えるだけなど、ごくごく単純なものを規定するだけのためにXMLをパースさせたり、1ファイルを作るのも面倒です。

そんな場合には、html内のswfobjectでパラメーターをFlashに送るようにしています。
これならば、単純なHTMLの更新のみでFlashの更新ができます。

下のサンプルは、swfobject2と、Actionscript3を使ってパラメータ名season:Numberを送った場合です。
LoaderInfoを使ってパラメーター一式を取得しますが、うまく取得できない場合も考え、if文以下の一行を追加し、nullにならないようにしています。

Actionscript3==========
function getParams():void {
    var seasonEvent;
    var htmlParams:Object =  LoaderInfo(this.root.loaderInfo).parameters;
    if(htmlParams["season"]>=0){seasonEvent = htmlParams["season"]} else {seasonEvent = 0};
}


HTML内swfobject==========
<script type="text/javascript">
    swfobject.embedSWF('swf/index.swf', 'main', '100%', '780', '9','', {season:8}, {wmode: 'transparent', scale: 'noscale'});
</script>



PHPを使ってのURLパラメーターの扱いはこちら
URLパラメーターの値を_GETする//PHP
https://www.bute-studio.com/lab/2008/03/url-getphp.html


Loaderを使って画像などを読み込む際に、読込完了とともにサイズを変更など、アクションを起こさなければならないときに、どうしても引数を渡したくなります。
今まではprivateの変数に入れたり、そのほか無理くりやっていましたが、こちらのサイトを参考に、ちゃんと引数を渡すことができるのに気がつきました!
(というか、よく今まで知らずにやってこれたと感心します)


var files:Array = ["test.jpg","test.jpg","test.jpg"];

private function loadFiles(){
for(var i=0;i<files.length;i++){
    var my_file = files[i];
    var urlReq:URLRequest=new URLRequest(my_file);
var myLoader = new Loader();
    myLoader.load(urlReq);
    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeScene(i));
}
}

function completeScene(num:int):Function{
    return function(e:Event):void{
        trace(num);
    }
}



参考サイト(atsuhiko.net)
Flash内で使えるCSSはあまり多くはありませんが、基本的なテキストの装飾などは簡単につけることが出来ます。
下の例では、test_txtの<a>にcolorとマウスオーバー時のtext-decorationを設定します。
CSSではtext-decorationですが、ActionScriptで書くときはtextDecorationなので気をつけます。(他にもActionscriptで使う場合に普通のCSSと異なるものがあります)


import flash.text.StyleSheet;

function setStyleSheet(txt){
    var style:StyleSheet = new StyleSheet();
        var main_a:Object = new Object();
        main_a.color = "#ff0000";
     var main_a_hover:Object = new Object();
        main_a_hover.textDecoration = "underline";
        style.setStyle("a", main_a);
        style.setStyle("a:hover", main_a_hover);            
    txt.styleSheet = style;
}

//上の関数setStyleSheetでスタイルを規定し、あとは引数でtest_txtを投げるだけで反映されます。
setStyleSheet(test_txt);


ダイナミックテキスト(textfield)は、そのままではalphaやrotationなどが変えることが出来ません。
というよりも、変えると、パッと消えてくれます。

そこで、TextをBitmapにdrawしてしまい、textfield自体は消しておけば、あたかもそれらのalphaやrotationが変えられたような表現が出来ます。


//BitmapDataを新規生成して、bitmapにdrawする
//今回はtest_txtをBitmapにします
var myBitmap:BitmapData = new BitmapData(600, 150,true,0x333333);
myBitmap.draw(test_txt);
var bmp:Bitmap = new Bitmap(myBitmap);
bmp.x = 100;
tmp_mc.addChild(bmp);
tmp_mc.alpha = 0;
test_txt.visible = false;

traceで出力させて、見やすいように出力ウィンドウで改行させる(空白1行を入れる)場合、AS2までなら、
trace(newline);
と打っていましたが、AS3.0だとnewlineが怒られることに今日知りました。
代わりに、
trace('');
と入力して改行させます。
いろいろなムービークリップの中から、ランダムで配置する場合、ひとまずリンゲージで指定したクラス名を配列に入れ、それらの中から、乱数により抽出したものを new Class();のように配置させます。

今回は、その配列からnewで実行するまでです。
今回の肝は、getDefinitionByNameを使うことです。

var myShape:Array = ["class1","class2","class3"];
var ShapeNo:Number = 1;//本来は乱数などですが、今回は割愛
var class_str:String=myShape[ShapeNo];
var myClass:Class=Class(getDefinitionByName(class_str));
mc = new myClass();


AIRのアプリを書き出す際に、「AIR-アプリケーションとインストーラーの設定」で「ウィンドウスタイル」をカスタムクローム(透明)を選ぶと制作したもののみで、余計なウィンドウにくるまれなくなります。
と同時に、そのままの場合はドラッグして移動させることもままならなくなるので、下のように記述します。
基本ですが、コピペのために記録しておきます。

btn.addEventListener(MouseEvent.MOUSE_DOWN, windowMove);
btn.buttonMode = true;

function windowMove(Evt:MouseEvent):void {
    stage.nativeWindow.startMove();
}


AIRに関する他の記事はコチラ
Flash内からHTML内の背景色を変更したい場合に、ActionScript3.0とJavaScript、CSSの連係プレーで実装します。
FlashからJavaScriptへは、AS2でもよく使ったExternalInterfaceを使い、JavaScriptからCSSへは、document.getElementByIdを使ってdivのID名を探し、.className="クラス名"でクラス名を設定します。

下のサンプルでは、#idname内のbackgroundを3色の中から変更できる仕様です。

//Flash内AS3.0
import flash.external.ExternalInterface;

colorID = no;   
var result:uint = ExternalInterface.call("callJS", no);


//JavaScript
function callJS(str) {      
   switch(str){
        case 1: document.getElementById("idname").className = "color1";break;
        case 2:    document.getElementById("idname").className = "color2";break;
        case 3:    document.getElementById("idname").className = "color3";break;
   }  
    return str;
}


//CSS
.color1{
    width:100px;
    height:200px;
    background:#ff6600;
}

.color2{
    width:100px;
    height:200px;
    background:#ffffff;
}

.color3{
    width:100px;
    height:200px;
    background:#333333;
}

最近忙しさのせいにして、ブログのアップを怠っています。反省して、来月からまた頑張ります。
価格.com ブロードバンド