我的类中有静态数组和静态方法,通过这个方法我可以在数组中推送一些函数。该方法在时间轴上调用,因此当我播放两次帧时,它将推动该函数两次,依此类推。
问题: 如何检查功能是否存在并防止重复? (就像addeventlistener一样)
答案 0 :(得分:1)
简短版本:不要在时间轴上编码。
长版本:如果您很幸运,功能将相同,因此可以使用==
运算符对它们进行比较。但是当你在时间轴上编码时,可能会有几个相同功能的实例,所以这不起作用。您可以保存一个静态布尔值,指示您是否已添加它。
BUT!在课堂上开始编码,从长远来看,它将为您节省很多麻烦,并在Stack Overflow上为您提供更好的答案 - 这有点像向五星级厨师询问为什么您只需添加水和摇动 - togehter-cake的结果并不是很好。
答案 1 :(得分: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');
}
}
}
答案 2 :(得分:0)
简短版本:
var i = arr.indexOf(myFunc);
if(i != -1) arr.push(myFunc);
长版:
我不是时间轴上的专家。我知道在纯AS3中只有一个静态函数实例,我想在使用时间轴时它是一样的。
所以你能做的最快的事就是使用
arrayName.indexOf(了funcName);
如果函数在数组中不存在则返回-1,否则返回正确的索引。
如果这不起作用,请告诉我们,我很好奇。
答案 3 :(得分: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");