2011-12-22 10 views
1

私はAndEngineを使ってゲームを作成しています。AndEngineのGenericPool処理6スプライト

私はランダムにスプライトを私のコードに追加しました。

Generic Poolを使用すると、ガベージコレクションが自分のケースで保存されるため、ゲームが特定の時間に遅れてしまうことが報告されました。

あなたたちは、IVEは私がにスプライトを追加することができるよプールを作成した参照ように、ここではそう

public class FruitPool extends GenericPool<Sprite> { 
private Sprite msprite; 


public FruitPool(Sprite sprite) { 
if (sprite == null) { 
// Need to be able to create a Sprite so the Pool needs to have a TextureRegion 
throw new IllegalArgumentException("The texture region must not be NULL"); 
} 
msprite = sprite; 
} 

/** 
* Called when a Bullet is required but there isn't one in the pool 
*/ 
@Override 
protected Sprite onAllocatePoolItem() { 
return msprite; 

} 

/** 
* Called when a Bullet is sent to the pool 
*/ 
@Override 
protected void onHandleRecycleItem(final Sprite sprite) { 
msprite = sprite; 
msprite.setIgnoreUpdate(true); 
msprite.setVisible(false); 
} 

/** 
* Called just before a Bullet is returned to the caller, this is where you write your initialize code 
* i.e. set location, rotation, etc. 
*/ 
@Override 
protected void onHandleObtainItem(final Sprite fruit) { 
fruit.reset(); 
} 
} 

..アイブは私GenericPoolのためを思い付くために管理するものです。

問題は、1から6の間の数字をランダムに選ぶ方法があることです。そして、私は、スイッチのステートメントを使ってシーンに追加するスプライトを選択しました。

GenericPoolでこれをどうすればできますか?それは6つの異なるスプライトを保持し、どれがシーンに追加されるかを選択できるようになっていますか?

私はゲーム内の各スプライトをプールに追加するメソッドを作成してから、スプライトがプールから選択されたものを選択する方法を見つけたところで止まってしまうかもしれません。スプライトを選択するのに必要なintを提供します。

アドバンスのお手伝いをありがとうございます!

答えて

2

まず、ではなく、プールの仕組みです。 プールでは、obtainを呼び出すたびにリサイクルされていないオブジェクトを取得する必要があります。それは意味:

FruitPool pool = new FruitPool(...); 
Sprite sprite1 = pool.obtain(); 
Sprite sprite2 = pool.obtain(); 

sprite1sprite2ないは、同じオブジェクトを参照する必要があります。しかし、あなたの実装では、となるので、2つの項目を同時に取得して使用する場合はにはなりません。

あなたはこのようにそれを実装する必要があります。

public class FruitPool extends GenericPool<Sprite> { 
// =========================================================== 
// Constants   
// =========================================================== 

// ===========================================================   
// Fields   
// =========================================================== 
private final TextureRegion mTextureRegion; 
// ===========================================================   
// Constructors   
// =========================================================== 
public FruitPool(final TextureRegion pFruitTextureRegion) { 
    this.mTextureRegion = pFruitTextureRegion; 
} 
// ===========================================================   
// Getter & Setter   
// =========================================================== 

// ===========================================================   
// Methods for/from SuperClass/Interfaces   
// =========================================================== 
@Override 
protected Sprite onAllocatePoolItem() { 
    return new Sprite(0, 0, this.mTextureRegion); 
} 
@Override 
protected void onHandleObtainItem(final Sprite pItem) { 
    pItem.reset(); 
} 
@Override 
protected void onHandleRecycleItem(final Sprite pItem) { 
    pItem.setVisible(false); 
    pItem.setIgnoreUpdate(true); 
} 
// ===========================================================   
// Methods   
// =========================================================== 

// ===========================================================   
// Inner and Anonymous Classes   
// =========================================================== 
} 

この方法では、複数のスプライトを同時にプールから要求することができ、そしてプールは実際にそれが目的だいっぱいになります。

あなたの質問については、スタックを使用してプールが実装されているため、特定の項目を取り出すことはできません。私は6つの異なるフルーツプールを作成することをお勧めします。

あなたはどの果物プールあなたが完了したら、それを送ったり、保存するためにsetUserDatagetUserDataメソッドを使用する必要があるために知っていると思いますので、あなたは、現在の果物の種類のために、Spriteを拡張し、フィールドtypeを含める必要がありますどちらか現在の果物の種類に関する情報。

+1

うわー、ありがとう!私はそれをもっと良く理解しています!だから私はプールにテクスチャ領域を供給し、私は最初の果実を得るためにpoolItem.obtainItem()を使うことができます。病気はそれぞれのために6つの異なるプールを作成する必要があります。そのうちの1人が画面から外れてしまった場合、どのように動作しますか?リサイクルはどのように行われますか?もう一度同じスプライトを使用しますか? –

+1

スプライトで終わったら(例えばスクリーンから消えます)、プールメソッド 'recyclePoolItem'と呼ばれます。今度はプールがそのスプライトを保持し、次回に 'obtainPoolItem'を呼び出すと、新しいプールを割り当てるのではなく戻ります。(それはプールの目的です) – Jong

+1

ありがとうございました。あなたが助けてくれた!ありがとう!! –

関連する問題