发新话题
打印

flash8的name分配类

flash8的name分配类

为了在函数内部设置不重复的影片 就必须确定其名称是否被占用
我的第一种做法是递归文件名查询,这种方法不适合重复使用超过256次,即递归的极限次数,但是是最简单的方法,这种方法是对名称进行检测,如果其名称有重复就在名称后加一个字符,依次叠加
//重名查询
        static function name(path:MovieClip, nam:String) {
                if (path[nam] == undefined) {
                        return nam;
                }
                return name(path, nam+"_dup");
        }

但是我发现当运用大型的构造的时候 256可能已经不能达到满意的要求 还有因为递归重名检测造成的文件名的长度剧增 也对脚本调试造成一定阻碍
所以我又设计了另一种方式,当然这种方式复杂了一些 但是相对于第一种有了少许优化
//重名查询
        static function getName(path:MovieClip, nam:String) {
                if (path[nam] == undefined) {
                        return nam;
                }
                var str = string.reverse(nam);
                str = (parseInt(str)).toString();
                if (str == "NaN") {
                        return getName(path, nam+"1");
                } else {
                        str = string.reverse(str);
                        var str2 = strx.slice(0, strx.length-str.length);
                        return getName(path, str2+(parseInt(str)+1));
                }
        }
这是字符串进行倒置所需要的函数,原理就是将字符串转变为数组,将数组倒置,再转变回字符串
static function reverse(str:String):String {
                var ary=str.split("")
                ary.reverse()
                return (ary.join(""));
        }

在上面的运算中我将字符串进行两次倒置得到的数字就是正确地值,再用递归检测一下就可以了,这种方法的递归基本为1左右[除非你把mc1以后的命名全部占用]

也许我这种方法也有不足的地方,以后学习再继续优化吧
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

感觉应该结合深度来进行name比较好
寻觅终生伴侣!

my blog

TOP

一般情况,是不会出现重名的,只要程序写得好
不过对于一些程序来说或许好用
不过这样会不会多耗一点性能呢?

TOP

用do...while看看,避开递归
class :
复制内容到剪贴板
代码:
class NameManager {
        private static var _fNameManager:NameManager;
        private static var _path:MovieClip;
        private static var _nameList:Array;
        public static function initialize(path:MovieClip):Void {
                _path = path;
                _nameList = [];
                if (_fNameManager == undefined) {
                        _fNameManager = new NameManager();
                }
                path.getName = _fNameManager.getName;
                path.getNameList = _fNameManager.getNameList;
        }
        private function getName(name:String):String {
                var __name:String = name;
                if (_path[__name] != undefined) {
                        do {
                                __name += "_dup";
                        } while (_path[__name] != undefined);
                }
                _nameList.push(__name);
                return __name;
        }
        private function getNameList():Array {
                return _nameList;
        }
}
fla:
复制内容到剪贴板
代码:
NameManager.initialize(this);
createEmptyMovieClip(getName("a"), getNextHighestDepth());
createEmptyMovieClip(getName("a"), getNextHighestDepth());
createEmptyMovieClip(getName("a"), getNextHighestDepth());
createEmptyMovieClip(getName("a_dup_dup"), getNextHighestDepth());
createEmptyMovieClip(getName("b"), getNextHighestDepth());
createEmptyMovieClip(getName("b_dup_dup"), getNextHighestDepth());
createEmptyMovieClip(getName("a_dup_dup_dup"), getNextHighestDepth());
createEmptyMovieClip(getName("a"), getNextHighestDepth());
createEmptyMovieClip(getName("a"), getNextHighestDepth());
createEmptyMovieClip(getName("a"), getNextHighestDepth());
createEmptyMovieClip(getName("a_dup_dup"), getNextHighestDepth());
createEmptyMovieClip(getName("a"), getNextHighestDepth());
var list:Array = getNameList();
trace("名称列表:"+newline+list+newline+"总个数:"+list.length);
//这样不知道是不是好点
寻觅终生伴侣!

my blog

TOP

AS3专门加了一个UIDUtil工具用来解决这类问题的~

TOP

发新话题