クラスに静的配列と静的メソッドがあり、このメソッドを介して配列にいくつかの関数をプッシュします。このメソッドはタイムラインで呼び出されるため、フレームを 2 回再生すると関数が 2 回プッシュされます。
質問 : 関数が存在するかどうかを確認し、重複を防ぐにはどうすればよいですか? ( addeventlistener のようなものです)
クラスに静的配列と静的メソッドがあり、このメソッドを介して配列にいくつかの関数をプッシュします。このメソッドはタイムラインで呼び出されるため、フレームを 2 回再生すると関数が 2 回プッシュされます。
質問 : 関数が存在するかどうかを確認し、重複を防ぐにはどうすればよいですか? ( addeventlistener のようなものです)
短いバージョン:タイムラインにコーディングしないでください。
長いバージョン:運が良ければ関数は同じになるので、==
演算子を使用してそれらを比較することができます。ただし、タイムラインでコーディングしているため、同じ関数のインスタンスが複数存在する可能性があるため、これは機能しません。すでに追加しているかどうかを示す静的ブール値を保存できます。
しかし!クラスでコーディングを開始すると、長期的には多くの問題を回避でき、StackOverflowではるかに優れた回答が得られます。5つ星のシェフになぜ水を加えて振るだけなのかを尋ねるようなものです。 togehter-cakeはあまり素晴らしいものではありませんでした。
短縮版:
var i = arr.indexOf(myFunc);
if(i != -1) arr.push(myFunc);
長いバージョン:
私はタイムラインの専門家ではありません。純粋な AS3 には静的関数のインスタンスが 1 つしかないことは知っていますが、タイムラインを使用する場合も同じことだと思います。
だからあなたができる最も速いことはただ使うことです
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");
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');
}
}
}