AS1の最近のブログ記事

ActionScriptの基礎中の基礎ですが、今まで使ったことがなく、恥ずかしながら調べました。
割り算のあまりを求めるには、"%"を使います。例えば、5÷2のあまりは、trace(5%2);で出力されます。

今回は、アクセス回数が5の倍数の時のみ特別なアクションを起こすために使いました。
アクセス回数の取得は、SharedObjectなどと組み合わせて行ってください。


//アクセス数をSharedObjectから取得する
share = SharedObject.getLocal("accessed");   
var accessNm:Number = share.data.accessed;

if(accessNm%5 == 0){
    EventSpecial = true;//アクセス数を5で割って余りが0のときのみEventSpecialフラグをtrueにする。
}

accessNm ++;
share.data.accessed = accessNm;
share.flush();



Shared Objectの使い方は下の記事を参照してください。
Shared Objectを使って、何度目のアクセスかを検知する // AS2.0
https://www.bute-studio.com/lab/2009/07/shared-object-as20.html
単純なActionScriptですが、今日はまってしまったこと。
メインのタイムラインに
trace("bg = "+_root.main_mc.make_mc.down_mc.bg);
と書くと、"undefined"と出力されますが、
down_mc内に
trace("bg = "+this.bg);
と書くと、
"down_mc = _level0.main_mc.make_mc.down_mc.bg"
とちゃんと出力されます。

rootからとれる階層の深さによって、出力されるかどうかが決まるようです。
今日はMovieClipの作り方をシンプルにして解決してしまいましたが、いくつまで入れ子にしてもコントロール出来るのかはちょっと時間のある時に調べてみようと思います。

そもそもそんなごちゃごちゃした入れ子にするな!
とか
全てステージ上に配置せずにASで管理しろ!
というのは実践してるつもりでしたが。
以後気をつけようと思います。

テキストフィールドの境界線は、Flashのプロパティからもつけられますが、[テキスト入力エリアの1pxの枠を消す//AS1.0]のように、ActionScriptでつけることもできます。

さらに、どうせつけるなら、色も指定したくなった時は、下のように入れるだけです。

//sample_txt.の境界線をFF3300の色にする場合
sample_txt.border = true;
sample_txt.borderColor = 0xff3300;


テキスト入力エリアの1pxの枠を消すためにはこちらの記事参照
テキスト入力エリアの1pxの枠を消す//AS1.0
Flashで扱う変数をHTMLに記述する //HTML&ActionScript (addvariable)と同様に、配列にしたい変数をHTMl内に記述して、それをFlash内で使用します。
更新が必要な変数をHTML内に変数を書くことで、更新作業の手間が大きく削減できます。

「,」で区切られた文字列をFlash内で配列にするには、splitを使います。

//HTML内//////////////////////////////////////////////////////////////////
※FlashをSWFObject v1.5 で読込む場合の読込み該当部分に記述。

var so = new SWFObject("swf/test.swf", "devdev", "300", "200", "8");
so.addVariable("hensu", "100,111,154");
so.write("devdev");

//ActionScript//////////////////////////////////////////////////////////////////

var myAry = _root.hensu.split(",");
trace(myAry);

上をパブリッシュすると、myAryが配列としてtraceされます。

Flashのコンテンツ内で右クリックすることで、Adobe Flash Playerの設定画面は表示させることができますが、これをActionScriptで強制的に表示させます。

Webカメラを使ったコンテンツでは、ActionScriptで設定画面を呼ぶことで、カメラの切替などの際に、コンテンツ内から操作へとつなげることもできそうです。

swf内には、上からbtn1〜btn4の順でmcを配置してあります。
System.showSettings(X);
の引数:Xを変えることで、表示させる設定画面のタブを指定することができます。

記憶領域設定
System.showSettings(1);
マイク設定

System.showSettings(2);
カメラ設定

System.showSettings(3);
以前の設定画面の継承

System.showSettings();

//ActionScript//////////////////////////////////////////////////////////////////

btn1.onRelease = function() {
 System.showSettings(1);
 };
btn2.onRelease = function() {
 System.showSettings(2);
 };
btn3.onRelease = function() {
 System.showSettings(3);
 };
btn4.onRelease = function() {
 System.showSettings();
 };
Flash内で使う変数をHTMLに記述して使う場面がよくあります。
例えば、1つのswfをいろいろなページで使う場合や、更新が多々あるものの、変数の変更のみの場合、変数をHTML側に書いてあれば、Flashを扱えない人にも更新をお願いすることができます。
もちろんXMLで管理することもできますが、大した量でない場合などは、HTML内に書くと便利です。

下の例は、『moviefile = movie75.flv』と『"picfile", "images/movie18.jpg"』という変数をHTML内に記述した場合の例です。FLVのプレーヤswfをサイト内で使い回し、プレーヤー内で使うFLVファイルと、サムネールなどを変数として投げる設定です。
addVariableを使って変数を設定します。


//HTML内//////////////////////////////////////////////////////////////////
※FlashをSWFObject v1.5 で読込む場合の読込み該当部分に記述。

var so = new SWFObject("swf/movie.swf", "movie", "300", "200", "8");
so.addVariable("moviefile", "movie75.flv");
so.addVariable("picfile", "images/movie18.jpg");
so.write("movie");



//ActionScript//////////////////////////////////////////////////////////////////

trace(_root.picfile);
trace(_root.moviefile);
のように、これでActionscript内でJSから投げた変数が取得できます。
1つのswfをいくつかのページで使い回す際などにとても便利です。
Flashで、FuseKitやTweenクラスなどでは、動作終了後に指定関数を呼び出すCallbackができますが、一般的に指定秒数経過後に関数を実行したい場面が出てきます。

そのような時は、setTimeOut()関数が重宝します。
最近結構お世話になっています。

下の例は、1000ミリ秒(=1秒)後にsample()関数を実行する場合です。

//ActionScript//////////////////////////////////////////////////////////////////

var setIDName:Number = setTimeout(sample, 1000);

function sample():Void {        
    sample_mc.gotoAndPlay("sample");        
}



FuseKitでの関数の実行についてはこちら
bute-lab.内のFuseKit関連記事
ダイナミックテキストに読込んだ文字列の文字間隔(字間)を制御したいと思い調べてみました。

文字間隔で使うのは、
TextFormat.kerning
TextFormat.letterSpacing
です。

結論は、以下を満たせばできます。
・WindowsのFlashでパブリッシュする
・フォントを埋込んだテキストである

残念ながら普段使っているFlashはMachintosh版のFlashCS3なので、実際に使えませんでしたが、せっかくなので参考のために使い方を記録しておきます。

//ActionScript//////////////////////////////////////////////////////////////////

private function setTextarea(object:MovieClip){
        var fmt:TextFormat = createTextFormat();
        object.setTextFormat(fmt);
        object. = true;
        object.antiAliasType = "advanced";
    }

private function createTextFormat() :TextFormat {
        var fmt:TextFormat = new TextFormat();
        fmt.font  ="common_font";
        fmt.kerning  = true;
        fnt.letterSpacing = 10;
        return fmt;
    }

setTextarea(sample_txt);


で、sample_txtに対してフォント埋込みと、文字間調整ができる(はず)。
でも、なぜMac版Flashではできないのかが納得いきません。

    
 
FuseKitで、透明度=_alphaの値を変化させることができるalphaToはとっても便利ですが、_alphaの変化+_visibleの変更をあわせたとっても便利ツールがZigoEngineを利用して扱えるfadeInとfadeOutです。

とっても便利ではありますが、fadeInとfadeOutを使うだけでは、場合によってはうまい具合にきれいに見えないので、メモしておきます。

//ActionScript//////////////////////////////////////////////////////////////////

sample_mc.fadeIn(1,"linear");
sample_mc.fadeOut(1,"linear");

上のように書いた場合、
fadeOutは、sample_mcの_alphaを指定時間で0にした後、_visibleをfalseにしてくれます。
fadeInは、sample_mcの_visbleをtrueにして、指定時間で_alphaを100にしてくれます。

しかし、sample_mc._visibleとだけ指定して見えないようにしてあるところにfadeInをさせると、fadeInを開始した瞬間に_visible=trueになることで、_alphaは既に100のままなので、「パッ」と見えてしまうことになります。

そこで、下のように

//ActionScript//////////////////////////////////////////////////////////////////
sample_mc._alpha = 0;
sample_mc.fadeIn(1,"linear");

と書くことで、これを防げます。

Flashで何かを作る時、更新性も考えて文字や画像パス、リンクなど、外部XMLから引っ張って使うこと多数ですが、そんなときにいつも利用するのがXpathです。
Xpathがなかったら発狂して死んでしまうかもってくらい便利です。

Xpathの利用に当たっての準備はxpathを使う//AS2.0を参照してください。

下のサンプルでは、XMLからprivate変数の配列に値を読込みます。
読み込みが完了して、trace(self.dataitems);を実行すると、"はれ","ゆき","吹雪"が出力されます。

いや〜本当にxpath様のおかげでFlashとXMLが仲良くできることを日々痛感しています。

//ActionScript//////////////////////////////////////////////////////////////////

import com.xfactorstudio.xml.xpath.*;

private var dataitems:Array;
private function itemXML(no){
    var self:Controller = this;//Controller.as内で使う場合
    var myXML:XML = new XML();
    myXML.ignoreWhite = true; //空白文字をパスする呪文
    myXML.onLoad = function() {
        self.dataitems = XPath.selectNodesAsString(this,"data/item/")
        trace(self.dataitems);
    }
    myXML.load("src/test.xml");   
}

//XML//////////////////////////////////////////////////////////////////

<?xml version="1.0" encoding="UTF-8"?>
<data>
 <item>はれ</item>
 <item>ゆき</item>
 <item>吹雪</item>
</data>

フルフラッシュの場合に背景をグラデにするときに、グラデ画像をPhotoShopからスライスを切って持ってくると、どうしても拡大した時の若干の汚さが気になってしまいます。
また、コンテンツによってグラでの色を変える時、その枚数分の画像を用意しなければならなくなります。

なので、グラデーション自体をFlash内で生成することにより、作業時間の短縮、ファイルサイズの削減、動的にグラデを作れる可能性を考えて、サンプルのようなグラデをActionScriptで作ってみました。

下のActionScriptを使ったサンプルはこちら

//ActionScript//////////////////////////////////////////////////////////////////

var colors = [0xaabbcc,0xeeeeee];//2つの色を指定
var alphas = [100, 100];
var ratios = [0, 0x8f];
var matrix = {matrixType:"box", x:0, y:0, w:Stage.width, h:Stage.height, r:Math.PI/180*90};//(rの変更でグラデの角度を変える)
var bg_mc = _root.createEmptyMovieClip("bg_mc", 1);
var grade_bg = bg_mc.beginGradientFill("linear", colors, alphas, ratios, matrix);// 引数の順に("タイプ, 色, 透明度, 色分布の比率, 変換マトリックス")
grade_bg = bg_mc.moveTo(0, 0);
grade_bg = bg_mc.lineTo(0, Stage.height);
grade_bg = bg_mc.lineTo(Stage.width, Stage.height);
grade_bg = bg_mc.lineTo(Stage.width, 0);
grade_bg = bg_mc.lineTo(0, 0);
grade_bg = bg_mc.endFill();   
Flashでのテキスト入力エリアの背景色はテキスト入力エリアのプロパティの
”テキストの周囲にボーダーを表示”から入れることができます。
が、合わせて1pxの枠が入ってしまいます。
この枠だけを消したい時、テキスト入力エリアの裏側に色のオブジェクトをおいてもいいですが、
簡単にやるために、ActionScriptでこの1pxの枠を消しました。

//ActionScript//////////////////////////////////////////////////////////////////

//sample_txt.の枠を消すとき

sample_txt.border = false;



テキストフィールドの境界線の色を指定するにはこちらの記事参照
テキストフィールドの境界線の色を指定する // AS1.0
価格.com ブロードバンド