我在我的類中有一個靜態數組和一個靜態方法,並通過此方法推送數組中的一些函數。該方法在時間線上調用,所以當我播放該幀兩次時,它將推動該功能兩次,等等。AS3比較兩個函數
問題: 如何檢查函數是否存在並防止重複? (很喜歡的addEventListener)
我在我的類中有一個靜態數組和一個靜態方法,並通過此方法推送數組中的一些函數。該方法在時間線上調用,所以當我播放該幀兩次時,它將推動該功能兩次,等等。AS3比較兩個函數
問題: 如何檢查函數是否存在並防止重複? (很喜歡的addEventListener)
短版:不時間軸上的代碼。
長版:如果你是幸運的功能是相同的,因此它可能使用==
運營商對它們進行比較。但是當你在時間線上編碼時,可能會有幾個相同功能的實例,所以這是行不通的。你可以保存一個靜態布爾值,指出你是否已經添加了它。
但是!開始在類中編碼,從長遠來看它將爲您節省很多麻煩,並且在堆棧溢出時給您更好的答案 - 這就像詢問一位五星級廚師爲什麼您唯一的 - 添加水和震動 - togehter-cake沒有變得非常好。
非常多。切勿在時間線上編寫代碼。 – Artless
您可以使用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');
}
}
}
短版:
var i = arr.indexOf(myFunc);
if(i != -1) arr.push(myFunc);
龍版本:
我不是在時間軸上的專家。我知道在純AS3中只有一個靜態函數的實例,我想在使用時間軸時它是一樣的。
所以你能做的事情最快的是剛剛使用
arrayName.indexOf(了funcName);
如果該函數不存在於數組中,則返回-1,否則返回正確的索引。
如果這不起作用,讓我們知道了,我很好奇。
功能是一個動態的類型,但是編譯器通常不允許在函數創建隨機的屬性,但是,如果您的「絕招」的類型檢查,你可以對你以後可以用它來識別功能的特性它 - 這樣就不需要功能完全相同的功能。
請注意,這是一個災難性的事情:)但正如瑣事知識,這可能以後幫助。
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");
你在說什麼功能?匿名? –