以前に作っていたAS2版をAS3版に移行してみました。

package {
    import flash.xml.*;
    public class MyXPath {
        public static  function xmlToArr(_xml:XML):Array {
            var reArr:Array=new Array  ;
            var childXMLList:XMLList=_xml.children();
            for (var i=0; i < childXMLList.length(); i++) {
                reArr[i]=new Array  ;
                var childXML:XML=childXMLList[i];
                var grandchildXMLList:XMLList=childXML.children();
                for (var j=0; j < grandchildXMLList.length(); j++) {
                    var grandchildXML:XML=grandchildXMLList[j];
                    reArr[i][grandchildXML.name()]=grandchildXML.toString();
                }
            }
            return reArr;
        }
    }
}

AS3になってXMLドキュメントへのアクセスがわかりやすくなったらしいので
このクラス自体、あんまり使わないかもしれないですが。

オープニングムービーがあるコンテンツは
2度目以降のアクセスに対してそのオープニングを自動的にスキップする仕様を求められることがよくあります。

最も一般的なのはクッキーだと思うのですが、
今回は以前にやったSharedObjectを利用してFlashだけでやりました。

class AccessChecker {
    private static  var _lso:Object = SharedObject.getLocal("accessChecker");
    public static function chk(_num:Number):Boolean {
        var num:Number = (_num == undefined) ? 24 : _num;
        var lastTime:Number = _lso.data.lastTime;
        lastTime = (lastTime == undefined) ? 0 : lastTime;
        var dateObj:Date = new Date();
        var nowTime:Number = Math.ceil(dateObj.getTime()/1000/3600);
        var flag:Boolean;
        if (nowTime-lastTime

chk関数を実行し、2回目以降のアクセスには引数の時間が経過するまでfalseを返します。
ついでなんで、引数無しの時は24時間にしておきました。

タイムラインには

var openingPlay:Boolean=AccessChecker.chk(12);

とかで、あとはopeningPlayを適当に扱ってあげます。

UIコンポーネントでまたまたトラブルです。

コンボボックスを配置したものを制作中、
それだけで書き出したら普通に動作するのに
別のSWFから読み込ませると動かなくなりました。

var container:MovieClip = this.createEmptyMovieClip("container", this.getNextHighestDepth()); var mcLoader:MovieClipLoader = new MovieClipLoader(); mcLoader.loadClip("combo.swf",container);

色々、調べたら特にComboBoxに限ったことではなく
UIコンポーネントのいくつかにこういった症状があるそうです。

解決方法はロードするムービークリップの_lockroot プロパティをtrueに。

var container:MovieClip = this.createEmptyMovieClip("container", this.getNextHighestDepth()); container._lockroot = true; var mcLoader:MovieClipLoader = new MovieClipLoader(); mcLoader.loadClip("combo.swf",container);

動いてよかった。

コンポーネントはカスタマイズが面倒だったりするのであんまり好きではないんですが、<br/> 使用する理由としては結構便利なリスナーイベントが用意されてるところでしょうか。

今回、TextInputについて調べてみました。

フォーカスのオン・オフの設定の実験です。

コンポーネントのTextInputを2つ配置して、<br/> インスタンス名を「t0」「t1」とします。

var _ti:mx.controls.TextInput;
var _str:String;

function textInputFocusSetup(_ti, _str):Void {
    _ti.text = _str;
    _ti.borderStyle = "none";
    //
    var tiFocusOut:Object = new Object();
    tiFocusOut.focusOut = function() {
        if (_ti.text == "") {
            _ti.text = _str;
        }
    };
    _ti.addEventListener("focusOut",tiFocusOut);
    var tiFocusIn:Object = new Object();
    tiFocusIn.focusIn = function() {
        if (_ti.text == _str) {
            _ti.text = "";
        }
    };
    _ti.addEventListener("focusIn",tiFocusIn);
}

textInputFocusSetup(ti0, "入力してください");
textInputFocusSetup(ti1, "入力してね");

初期状態では引数に指定した文字列が表示され、フォーカスすると文字列が消える。
さらに、未入力のままフォーカスが外れたらもう一度最初の文字列が表示される。

HTMLのフォームでもよくあるんで、似たようにしたかったんですが、
もう少し作り込まないとだみたいですね。
とりあえずということで。

前回からの続きです。
ほんとはこっちがやりたかったんです。

argumentsには引数を管理する用途の他に、その関数そのものへの参照をしてくれるcalleeプロパティがあります。
これは、実行した関数を再度実行してくれるんですが、応用するといわゆる再帰呼出しをすることができます。

例えば、1から引数値までの乱整数を返す関数を作るとき、

function hoge(_num:Number):Number{
  return Math.ceil(Math.random()*_num);
}

とか、書くと思うんですが、
再度実行するときには前の戻り値と重複させたく無い場合などにとても便利。

var id:Number
function hoge(_num:Number):Number{
  var r:Number=Math.ceil(Math.random()*_num);
  if(id==r){
    return arguments.callee(_num);
  }else{
    return r;
  }
}
id=hoge(30);

戻り値は必ず、前の戻り値とは異なっているはずです。

3  4  5  6  7  8  9  10  11  12  13