1

我的类中有一个静态数组和一个静态方法,通过这个方法我在数组中推送了一些函数。该方法是在时间轴上调用的,因此当我播放帧两次时,它将推动该函数两次,依此类推。

问题: 如何检查函数是否存在并防止重复?(就像 addeventlistener )

4

4 回答 4

2

简短版:不要在时间轴上编码。

长版:如果幸运的话,功能会相同,因此可以使用==运算符进行比较。但是当您在时间轴上编码时,可能有多个相同功能的实例,所以这不起作用。您可以保存一个静态布尔值,指示您是否已添加它。

但!开始在课堂上编码,从长远来看,它会为你省去很多麻烦,并在 Stack Overflow 上给你更好的答案——这有点像问五星级厨师为什么你只加水和摇晃—— togehter-cake 结果不是很好。

于 2012-09-22T13:22:15.340 回答
0

函数是一种动态类型,但编译器通常不允许在函数上创建随机属性,但是,如果你“欺骗”类型检查,你可以在函数上拥有一个属性,以后可以使用它来识别它 - 这种方式函数不必是完全相同的函数。

请注意,这是一件灾难性的事情 :) 但就像琐事知识一样,这可能会在以后有所帮助。

function foo():void { /* some code */ }
function bar():void { /* some code */ }
foo["baz"] = bar["baz"] = 42;

if (foo["baz"] && foo["baz"] == bar["baz"]) trace("equal");
else trace("distinct");
于 2012-09-23T13:26:37.137 回答
0

精简版:

var i = arr.indexOf(myFunc);
if(i != -1) arr.push(myFunc);

长版:

我不是时间线专家。我确实知道纯 AS3 中只有一个静态函数的实例,我想当您使用时间轴时它是一样的。

所以你能做的最快的事情就是使用

arrayName.indexOf(funcName);

如果该函数在数组中不存在,它将返回-1,否则它是正确的索引。

如果这不起作用,请告诉我们,我很好奇。

于 2012-09-22T16:35:31.733 回答
0

您可以使用 ByteArray 比较对象。对于您的情况,我可能会将函数调用推送到带有函数、参数和“thisObject”的数组中。这是一个粗略的想法。但我可能会创建一个新类,为该等待操作容器扩展 Array。

package  {

    import flash.display.MovieClip;
    import flash.utils.ByteArray;
    import flash.events.MouseEvent;

    public class Main extends MovieClip {

        private static var awaiting:Array = [];

        private function pushAction(func:Function,args:Array=null,thisArg:*=null):uint {
            var newObj:Object = {
                func    :func,
                args    :args,
                thisArg :thisArg
            }
            for (var i:int = 0; i < Main.awaiting.length; i++) {
                if (duplicates(Main.awaiting[i],newObj)) return i;
            }
            return Main.awaiting.push(newObj);
        }

        private function nextAction(extraArgs:Array=null):* {
            if (Main.awaiting.length == 0) return null;
            var o:Object = Main.awaiting.shift();
            var args:Array = o.args;
            if (extraArgs) args = args == null ? extraArgs : args.concat(extraArgs);
            var thisArg:* = o.thisArg;
            var func:Function = o.func;
            return func.apply(thisArg,args);
        }

        private static function duplicates(item1:Object,item2:Object):Boolean {
            var bArr1:ByteArray = new ByteArray();
            var bArr2:ByteArray = new ByteArray();
            bArr1.writeObject(item1);
            bArr2.writeObject(item2);
            bArr1.position = 0;
            bArr2.position = 0;
            var str1:String = bArr1.readUTFBytes(bArr1.length);
            var str2:String = bArr2.readUTFBytes(bArr2.length);
            return str1 == str2;
        }

        public function Main() {
            pushAction(function(){trace('the first item')});
            pushAction(traceMe,['the second item']);
            pushAction(traceMe,['the third item']);
            pushAction(sayHi,null,Main);
            pushAction(function(){trace('the first item')});
            pushAction(traceMe,['the second item']);
            pushAction(traceMe,['the third item']);
            pushAction(sayHi,null,Main);
            stage.addEventListener(MouseEvent.CLICK,clicked);
        }

        private function clicked(e:MouseEvent):void {
            this.nextAction();
        }

        public function traceMe(str:String):void {
            trace(str);
        }

        private static function sayHi():void {
            trace('hi');
        }

    }

}
于 2012-09-22T14:13:21.747 回答