おいしいAS3 -40ページ目

数値をループさせる

こんな書き方もあるよ、という程度のこと


addEventListener(Event.ENTER_FRAME,frameTick)

var i:int=0
var n:int=10



iをnでループさせたいとする

普通の書き方


function frameTick(e) {
i++;
if (i>n) {
i=0;
}
}


剰余を使ったやり方


function frameTick(e) {
i=(i+1)%n;
}

あとがき初期値設定で値0に備える

引数をオブジェクトで受けて
フィールドに何にも入ってなかった時の
初期値を代入するとき"||"を使って


function someFunc(paramObj:Object){
paramObj.xxx= paramObj.xxx||180
}


とかやったとします

すると、xxxが代入値ないときだけじゃなく
値0のときも180が代入されてしまいます

0にしたいのに………

面倒くさいですが簡易分岐を使って


function someFunc(paramObj:Object){
paramObj.xxx= paramObj.xxx||((paramObj.xxx==0)?0:180)
}


何にもはいってないのは0とはちがうのでそれでなんとか

なんかもうちょっと賢い書き方がある気がします

知らないと損する?コーディング小技

■その1 論理演算子を使う

RGBの値を分解する時、例えばGの値をとりたい時

G=Math.floor((0x888888%0x10000)/0x100)

とかやってませんか?
論理積"&"を使いましょう

G=(0x888888&0xFF00)/0x100



■その2 プリミティブな型じゃない引数に初期値を設定する

なにかのクラスのインスタンスとかを引数に求める時は
初期値が設定できないと思ってませんか?

"||"を使えば前者の値が0,null,undefinedなどであれば
後者の値を代入します、これで数値とか文字列じゃない
引数にも初期値を設定できます

function hoge(arg:MyClass=null)
arg= arg ||new MyClass(xxx,xxx,xxx)
}


■その3 簡易分岐

if(frg){
trace("オッケー")
}else{
trace("ダメダメ")
}

こんな程度の分岐なら"~?~:~"を使えばコンパクト

trace(frg?"オッケー":"ダメダメ")



■その4 排他的論理和を使って二つの変数の値を入れ替える

a=a^b
b=a^b
a=a^b

[1,1,0]^[0,1,1]=[1,0,1]
[1,0,1]^[0,1,1]=[1,1,0]
[1,0,1]^[1,1,0]=[0,1,1]
ってことです

ただ、同じ変数同士でやると全部消えます
数値にしか使えません


■その5 フィールド名に値を格納して、同じ値の処理をしないようにする

var tempObj=new Object()
for each(var n in myArr){
if(n in tempObj)return;
tempObj[n]=true
 someFunc(n)
}

数値か文字列にしか使えません
インスタンスとかの時は
おとなしくtemp配列つくってindexOfで

配列が希薄(飛び番OK)な言語なら
uint型なら配列のインデックスでもできます
これを利用すれば超高速sortが可能・・・らしい