論理演算のXORを実現する


AS3ではビット単位でのXORはできるけど(^)、論理演算でのXORは用意されていないようなので、何とかできるように工夫してみた。

普通に

if(isA ^ isB){
//XORでtrueの処理
}

という感じで書くこともできるかと思ったら、数値型でないとパブリッシュできません。というわけで、

if(int(isA) ^ int(isB)){
//XORでtrueの処理
}

のような感じにしたらできました。一応traceさせると、

trace(Boolean(int(true) ^ int(true)));//false
trace(Boolean(int(true) ^ int(false)));//true
trace(Boolean(int(false) ^ int(true)));//true
trace(Boolean(int(false) ^ int(false)));//false

ということでXORが実現できました。まあビット単位の演算はできる以上当たり前ですし、遅くなったりしないのかという疑問も残りますが、条件文2つ書くよりはいいかなと。

計算もビット演算使った方が早い場合もあるようなので、ビット演算についてはもうちょっと使えるようにしたい。ビットシフトとか。

LoaderContext/ApplicationDomainの使い方を自分なりにメモ


未だによく分かってないのでメモ。

swfが親子になっていて、それらのクラスを共有させたい場合、これを使わないと、エラーが出て何が何だか分からなくなる。あと、音ファイルだけ別にしてgetDefinitionByNameする時とか。

基本は親と子で同じクラスを使いたいと思うので、親が子を読む際に自分と同じApplicationDomainに読み込む。

var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
loader.load(path, context);

通常はApplicationDomain.currentDomainを使っていれば問題ないみたいなんですが、子供同士でバッティングしてしまうクラスがあると面倒なことになる様子。

この場合は

context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);

として子供のcontextを逐次変更すれば、子供同士のクラスはバッティングしなくなりながらも、子供は親と共通のクラスを使える。はず。

何でもApplicationDomain.currentDomainにすればいいってもんでもないんですね。

loaderInfoからapplicationDomainを取る方法もあるみたいですが、勉強不足。

参考

そろそろTweensyを覚えたい。