// forked from kaikoga's 関数呼び出しは重く、入れ子の関数は更に重い // forked from tail_y's forked from: [最適化 Tips] Number, int, uint の計算による処理速度の違い // forked from muta244's [最適化 Tips] Number, int, uint の計算による処理速度の違い package { import flash.display.*; import flash.geom.*; import flash.events.*; import flash.text.*; import flash.utils.*; public class Main extends Sprite { private var i:int = 0; private function get _getter():int { return this.i; } private function _init():void { _debug("FlagCheckerクラスを使えばuint一個で32個のFlagを管理できるよ。たぶん。"); _debug(""); _debug("[使用例](コードを直接見ないと分らない。29行目以降。)"); var flags:FlagChecker = new FlagChecker(); //フラグを新しく作成(falseで初期化される) flags.makeFlag("test"); flags.setFlag("test",true); _debug("test" + " : " + String(flags.getFlag("test"))); flags.makeFlag("bangflash"); _debug("bangflash" + " : " +String(flags.getFlag("bangflash"))); _debug(""); //flagsの中身 _debug("Flagの中身" + " : " + String(flags.getFlags())); _debug("↑誰かuintを16進数のままの表記でStringに直す方法教えてー!") _debug(""); // _debug("getFlags()をSharedObjectにそのままぶち込めば32個使えるし32byteしか容量食わんし便利よ。"); _debug(""); _debug("ちなみにコンストラクタにSharedObjectで保存したuint入れればそのまま読み込めます。") } private var _field:TextField; private var _time:uint; public function Main():void { _setup(); _init(); } //TextFieldに文字を追加(?) private function _debug(log:String):void { _field.appendText(log + "\n"); } private function _setup():void { _field = new TextField(); _field.width = stage.stageWidth - 40; _field.height = stage.stageHeight - 50; _field.x = 20; _field.y = 20; _field.multiline = true; _field.wordWrap = true; var format:TextFormat = _field.defaultTextFormat; format.font = "_sans"; _field.defaultTextFormat = format; addChild(_field); // var button:Sprite = new Sprite(); // button.graphics.lineStyle(1, 0xBBBBBB); // button.graphics.beginFill(0xEEEEEE); // button.graphics.drawRoundRect(0, 0, 100, 20, 5, 5); // button.graphics.endFill(); //addChild(button); // button.x = 20; // button.y = 20; // button.mouseChildren = false; //button.buttonMode = true; var field:TextField = new TextField(); field.width = 100; field.height = 20; field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>"; //button.addChild(field); //button.addEventListener(MouseEvent.CLICK, function ():void //{ // _field.text = ""; //_init(); //}); } } } /*package net.bangflash.utils{*/ /** * 最大32個のフラグを管理できる。 */ /*public*/ class FlagChecker { private var count:uint = 0; //16進数のリスト private static var flagList:Vector.<uint>; // private var keyList:Vector.<String>; //フラグ32個分 private var flg:uint = 0; /** * コンストラクタ */ public function FlagChecker(flg:uint=0) { this.flg = flg; keyList = new Vector.<String>(); initFlagList(); } /** * 新しくフラグを作る * * @param key 作ったFlagを呼び出すときの名前 * @return 何個目のFlagか */ public function makeFlag(key:String):uint{ //32個以上は作れない if(count==32){ trace("Flagをこれ以上作ることはできません。"); return count; } count++; if(keyList.indexOf(key)==-1){ keyList.push(key); } else trace(key + "はすでに使われています。"); return count; } /** * Flagを立てるorつぶす * * @param key makeFlagで指定したFlagの名前 * @param bool Flagに代入したい値 */ public function setFlag(key:String,bool:Boolean):void{ if(bool){ //Flagを立てる flg |= keyToFlag(key); } else{ //Flagをつぶす flg &= ~keyToFlag(key); } } /** * keyで指定したFlagが立っているかどうか * * @param key 調べたいFlagの名前 * @return 立っているかどうか * */ public function getFlag(key:String):Boolean{ if(flg & keyToFlag(key)){ return true; } else{ return false; } } /** * flg自身を返す * * @return flgの中身 */ public function getFlags():uint{ return flg; } //keyを元に16進数を返す private function keyToFlag(key:String):uint{ return flagList[keyList.indexOf(key)]; } //初期化 private function initFlagList():void{ flagList = new Vector.<uint>(); flagList.push(0x00000001); flagList.push(0x00000002); flagList.push(0x00000004); flagList.push(0x00000008); flagList.push(0x00000010); flagList.push(0x00000020); flagList.push(0x00000040); flagList.push(0x00000080); flagList.push(0x00000100); flagList.push(0x00000200); flagList.push(0x00000400); flagList.push(0x00000800); flagList.push(0x00001000); flagList.push(0x00002000); flagList.push(0x00004000); flagList.push(0x00008000); flagList.push(0x00010000); flagList.push(0x00020000); flagList.push(0x00040000); flagList.push(0x00080000); flagList.push(0x00100000); flagList.push(0x00200000); flagList.push(0x00400000); flagList.push(0x00800000); flagList.push(0x01000000); flagList.push(0x02000000); flagList.push(0x04000000); flagList.push(0x08000000); flagList.push(0x10000000); flagList.push(0x20000000); flagList.push(0x40000000); flagList.push(0x80000000); } } //} uint一つで32個のフラグを管理する