0

さて、ユーザーがランダムに生成された花を選ぶ小さなゲームを作成しています。花を摘むと消え、ユーザーはポイントを獲得します。

これが私のコードの一部です:

import flash.events.MouseEvent;

function makeFlower() {

    var flower:Flower = new Flower();

    addChild(flower);
    flower.x = Math.random() * 500;
    flower.y = Math.random() * 400;
}

function removeFlower(event:MouseEvent):void {
    flower.pick();
}


setInterval(makeFlower, 2500);
addEventListener(MouseEvent.CLICK, removeFlower);

したがって、上記のコードでflower.pick()は、スコープ外であるため機能しません (ちなみに、どうすればスコープ内に入れることができますか?)...これが 1 つの問題です。しかし、この問題により、花の作成をどこで行うべきかという疑問が生じました。addChild()私のコンストラクタメソッドを入れたほうがいいでしょうか?

そして、破壊部分...花がクリックされたことを検出するイベントリスナー...これは別のものにする必要がありますか(私が持っているように)、それともFlowerクラスに入れる必要がありますか? 私は ActionScript を初めて使用するので、どこに置くべきか知りたいです。

ありがとう!

4

2 に答える 2

3

試す:

import flash.events.MouseEvent;

var flower:Flower;

function makeFlower() {
    flower = new Flower();
    addChild(flower);
    flower.x = Math.random() * 500;
    flower.y = Math.random() * 400;

    flower.addEventListener(MouseEvent.CLICK, removeFlower);
}

function removeFlower(event:MouseEvent):void {
    event.target.pick();
    //removeChild(event.target); // active this to remove the clicked flower
}

setInterval(makeFlower, 2500);
于 2012-06-12T23:00:45.057 に答える
2

どこで処理する必要があるかは、かなりの数の要因によって異なります。私のリストの 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 投稿にはすでに長すぎます。

于 2012-06-12T23:05:35.543 に答える