AS3の最近のブログ記事

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;
}

最近忙しさのせいにして、ブログのアップを怠っています。反省して、来月からまた頑張ります。
Flash内で何らかのボタンアクションによって、ユーザーのクリップボードにテキストをコピーする場合です。
Flashでは単純に1行で実装できます。
下のサンプルはsample_txtに書かれている文字列をコピーする場合です。

System.setClipboard(sample_txt.text);
普通のHTMLのように、単純にダイナミックテキストに入力されているテキストを、ロールオーバー時は色が変わったり、下線が付いたりします。
CSSではtext-decorationやcolorを使いますが、ActionScriptではTextFormatを使います。

下のサンプルでは、単純にtxtを白で下線付きにするように
TxtFormat(txt,true);
が実行されますが、
TxtFormat(txt,false);
を実行すると下線なし灰色になります。
これとMouseEventを組み合わせてロールオーバー時のアクションにも使えます。

import flash.text.*;
var txt = main_mc.sample_txt;
TxtFormat(txt,true);

function TxtFormat(txt,action){
    var textFormat:TextFormat = new TextFormat();
           
    if(action){
        textFormat.color = 0xffffff;
        textFormat.underline = true;
    } else {
        textFormat.color = 0x333333;
        textFormat.underline = false;
    }           
    txt.setTextFormat(textFormat);
}

ActionScript2.0まではページ遷移にgetURLを使いますが、ActionScript3.0では「new URLRequest()とnavigateToURL()」をセットで使います。
その際に、下の2つをimportします。

超基本のASですが、記録用に残しておきます。

下のサンプルでは、linkXml:Arrayに3つのURLが入っていて、配列からこのURLを取り出しています。
XMLからURLを取得する際にも下をベースにXMLから読込んで配列にpushするとできます。

import flash.net.URLRequest;
import flash.net.navigateToURL;

var linkXml:Array = ["http://www.bute-studio.com/lab/","http://www.bute-studio.com/lab/as3","http://www.bute-studio.com/lab/flash"];

var No = 1;
var my_url:URLRequest = new URLRequest(updateXml[No]);
navigateToURL(my_url, "_blank");

左上を基準点にしてあるオブジェクトを単純にrotationを使って角度をつけると、左上の基準点を中心に角度が付きます。
しかし、今回は左上基準点なのは、画像読込み上変更できないので、基準点を守ったままrotationで角度がつけられるよう、X座標、Y座標も動くようにします。

下のサンプルでは、30度回転させる場合です。
オブジェクトの基準点と回転の中心点との座標の差を三角関数のsinを使って補正します。
三角関数のsinは、ActionScriptでは、次のように使います。
Math.sin(Math.PI/180*角度);
※Math.PIは、円周率です(3.1415926535.....)

その他、回転の中心点を右下などにする場合も三角関数を使って出すことができます。


var Rot:Number = 30;
mc.x += mc.height * Math.sin(Math.PI/180 * Rot)/2;
mc.y -= mc.width * Math.sin(Math.PI/180 * Rot)/2;
mc.rotation = Rot;

ライブラリ内のムービークリップの中から、乱数を生成する感覚で、ランダムに配置される仕組みです。
事前にライブラリ内のムービークリップにクラス名を指定します。
ライブラリ内のムービークリップのプロパティで、『ActionScript用に書き出し』にチェックを入れ、クラスを入れます。下のサンプルでは、mc_test1〜mc_test4の名前で作りました。

続いて、配列内(ここではmyMc:Array)に今指定したクラス名を入れます。

あとはいつものMath.randomを使って乱数を生成し、配列から取得した文字列を
Class(getDefinitionByName());
を使ってクラス名として代入します。

var myMc:Array = ["mc_test1","mc_test2","mc_test3","mc_test4"];

var No = Math.floor(Math.random()* myMc.length);
var class_str:String = myMc[No];
var myClass:Class = Class(getDefinitionByName(class_str));
mc = new myClass();
addChild(mc);

ActionScriptで、乱数表を作ります。
今回はAS3.0で使いましたが、AS2.0でも同じ考え方で使えます。
下のサンプルでは、1から10までの数字を格納した配列をランダムに並び替えた1-10までの乱数表にします。
function makeRand内では、for文の中で、配列のrNo番目の要素と0番目の要素を入れ替える動作を100回行います。
下の程度の長さの配列を想定する場合は100回でも十分かと思いますが、配列によっては、もっと多い回数が必要かもしれません。
ただし、処理の負荷との関係を考える必要があります。



var rdmArray:Array = [1,2,3,4,5,6,7,8,9,10];
makeRand(rdmArray);

//乱数表の作成
function makeRand(myArray:Array):Number{
    for (i=0; i<100; i++) {
       rNo = Math.floor(Math.random() * myArray.length );
       tmp = myArray[0];
       myArray[0] = myArray[rNo];
       myArray[rNo] = tmp;
    }
    trace("makeRand = "+myArray);
}


価格.com ブロードバンド


スポンサーサイト

  • ※このエリアの広告収益は、各種ボランティア団体へ寄付します。