Arrayの拡張
最近level0では拡張ネタが流行っているので僕も流れに乗ってみます。
trace()、Objectと来たので、Arrayクラスでも。
ASのArrayクラスはとっても貧弱です。
まぁそれでも昔の用にeval()でつなぐ疑似配列よりはマシになったと思います。
しかし、やっぱり足りない物は足りないので拡張してしまいましょうってことで、シャッフルを追加してみましょう。
配列をシャッフルの方法は色々ありますが、Fisher-Yatesという有名なアルゴリズム(?)があるのでコンバートしてみました。
そのままビルトインのArrayに入れてしまいたいので、prototypeで実装します。
/*
@description
Array拡張 shuffle
Fisher-Yates【http://www.bigbold.com/snippets/posts/show/849】をAS用にコンバート。
*/
Array.prototype.shuffle = function():Array {
var i = this.length;
while (i) {
var j = Math.floor(Math.random() * i);
var x = this[--i];
this[i] = this[j];
this[j] = x;
}
return this;
};
//
var arr=new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
//
trace("original : "+arr+"\nshuffle : "+arr.shuffle());
結果は、
normal : 0,1,2,3,4,5,6,7,8,9
shuffle : 4,8,2,3,7,9,6,0,5,1
これを応用して、等間隔で一列に1~6番のMovieClipをランダム配置なんてことも可能です。
var scope:Array=[hoge_mc1,hoge_mc2,hoge_mc3,hoge_mc4,hoge_mc5,hoge_mc6]
var pos:Array=[{_x:10,_y:0},{_x:20,_y:0},{_x:30,_y:0},{_x:40,_y:0},{_x:50,_y:0},{_x:60,_y:0}]
pos.shuffle()
for(var i=0;i<pos.length;i++){
scope[i]._x=pos[i]._x
scope[i]._y=pos[i]._y
}
常套手段ですが、なかなか便利な使い方ですよね。