どこで処理する必要があるかは、かなりの数の要因によって異なります。私のリストの 1 番目は、Flex フレームワークを使用しているかどうか、2 番目は、特定のアプリケーションに最適なものです。あなたの場合、Flash IDE を使用しているようです。
表示ツリーに追加する花のオブジェクトのコレクションが必要になります。次にクリックすると、任意に花を削除するのではなく、クリックのターゲットを使用して、どの「花」を選択したかを知ることができます。
花のコレクションを持つことのもう 1 つの良い点は、実際に可視性を切り替えることができることです (これにより、タッチ/クリックでオブジェクトを操作する機能も切り替えられます)。次に、ガベージ コレクションを行ってさらに多くのオブジェクトを作成する代わりに、すべての Flower オブジェクトを一度に作成するか、少なくとも再利用することができます (用語の下で Daniel が指摘したように、オブジェクト プーリングです)。
import flash.events.MouseEvent;
var allFlowers:Array = [];
var oldFlowers:Array = [];
function makeFlower() {
var flower:Flower;
if(oldFlowers.length>0) //if there's stale ones, already created but since picked
{
flower = oldFlowers.pop();//grab the last one from the list
flower.visible=true;//show it, update to position below should happen fast enough so you won't see it move
}
else
flower = new Flower();
allFlowers.push(flower);
addChild(flower);
flower.addEventListener(MouseEvent.CLICK, removeFlower); //Adding the listener directly to the Flower object, assuming it's a Sprite/MovieClip/InteractiveObject of some sort
flower.x = Math.random() * 500;
flower.y = Math.random() * 400;
}
function removeFlower(event:MouseEvent):void {
var clickedFlower:Flower = (event.target as Flower); //this is a local reference
clickedFlower.pick(); //assuming this toggles the visibility
oldFlowers.push(allFlowers.splice(clickedFlower,1)); //removing it from the "active array" putting it in the "stale array"
}
setInterval(makeFlower, 2500);
理想的には、これはすべてクラスにまとめられます。クラスのコンテキストでは、どこかのコード ブロックにぶら下がるよりも、変数のスコープの方がはるかに理にかなっています。
元のコードでは、 flower が var であると宣言し、その var (Flower) に格納されているオブジェクトのタイプを指定したため、スコープはその関数の開き中かっこと閉じ中かっこに限定されます。私が定義した変数の場合、コードを含むオブジェクトが利用可能である限り、それらは利用可能でなければなりません。
AS3 のクラスで変数または関数を宣言するときに使用できる主な「スコープ修飾子」が 3 つあります (つまり、public、protected、または private)。public を使用すると、プロパティ/メソッド (メンバー) がクラス定義 (通常はファイル、something.as) 内だけでなく、他のものからもアクセスできることを意味します。変数を public にすると、コードを使用するものによって変更できます。外部からの変更が意図しない場合、アプリケーションの予期しない動作につながる可能性があります。protected を使用すると、クラスを継承または拡張するものはすべて保護されたメンバーにアクセス/使用できますが、オブジェクトのインスタンスだけを持つものはこれらのメンバーにアクセスできません (したがって、アクセス修飾子という用語)。3 番目のレベルはプライベートです。つまり、そのクラス内の (すべてのメソッドにわたって) コードのみがメンバーにアクセスできますが、クラスの継承/サブクラスはメンバーにアクセスできません。これは本質的に、コンピューター サイエンスで一般的にカプセル化と呼ばれる概念の実装です。詳細はまだたくさんありますが、まともな SO 投稿にはすでに長すぎます。