2012-01-04 10 views
0

私は私が表示されるように選択されているものをスプライトランダム私自身の入手方法を作成し、あなたが私のコードで表示されるように私は私のシーンにGenericPool論理的問題(AndEngine)

を追加し、リサイクルやリユーススプライトにこのプールを作成しましたそのシーンの位置をランダム化します。問題は何らかの理由で同じポジションを選んだようで、シーン全体を何らかの理由で中央、左、右に選んでいます。ポジションをランダム化すると仮定したとき、ランダムに選択したシーンを再起動するたびに3つのスプライトに対して3つのポジションを持ち、シーン全体に渡って同じ位置に留まると、スプライトはランダム化されません。ここには何を使っているのですか

private ITextureRegion texture1; 
private ITextureRegion texture2; 
private ITextureRegion texture3; 
private ITextureRegion texture4; 
private ITextureRegion texture5; 

private Scene mScene; 
private Context mContext; 
private Camera mCamera; 
private LinkedList<Sprite>pool1; 
// ===========================================================   
// Constructors   
// =========================================================== 
public FruitPool(final ITextureRegion pFruitTextureRegion, 
     ITextureRegion pFruitTextureRegion2,ITextureRegion pFruitTextureRegion3, ITextureRegion pFruitTextureRegion4, ITextureRegion pFruitTextureRegion5,Scene mScene2, Camera camera, LinkedList<Sprite>items) { 

    this.texture1 = pFruitTextureRegion; 
    this.texture2 =pFruitTextureRegion2; 
    this.texture3 = pFruitTextureRegion3; 
    this.texture4 = pFruitTextureRegion4; 
    this.texture5 = pFruitTextureRegion5; 
    this.mScene = mScene2; 
    this.pool1 = items; 

    this.mCamera = camera; 

} 
// ===========================================================   
// Getter & Setter   
// =========================================================== 

// ===========================================================   
// Methods for/from SuperClass/Interfaces   
// =========================================================== 
@Override 
protected Sprite onAllocatePoolItem() { 

    Random rand = new Random(); 
    Random randFruit = new Random(); 
    Sprite fruit = null; 
     float x = rand.nextInt((int) mCamera.getWidth() - texture3.getHeight()); 

    int textureNumber = randFruit.nextInt(5)+1; 

    switch(textureNumber){ 
    case 1: 
      fruit = new Sprite(x, 0, this.texture1); 
      break; 
    case 2: 
     fruit = new Sprite(x, 0, this.texture2); 
     break; 
    case 3: 
     fruit = new Sprite(x, 0, this.texture3); 
     break; 
    case 4: 
     fruit = new Sprite(x, 0, this.texture4); 
     break; 
    case 5: 
     fruit = new Sprite(x, 0, this.texture5); 
     break; 

    } 


    mScene.attachChild(fruit); 

    return fruit; 

} 
@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   
// =========================================================== 
} 

これのロジックを改善するために私がやりたいことや変えることは何ですか?

はEDIT:

ここ

IVEが

パブリッククラススプライトをresuedされるように私はアイテムを引っ張るんか今のところ、今で立ち往生イムを思い付くし、それをリサイクルするために管理するものであるがTObjectPoolを{拡張します

private CustomArrayList<Sprite> sprites; 

private ITextureRegion texture1; 
private ITextureRegion texture2; 
private ITextureRegion texture3; 
private ITextureRegion texture4; 
private ITextureRegion texture5; 


public sprites(int poolsize) { 
    super(poolsize); 

    sprites = new CustomArrayList<Sprite>(poolsize); 

    // TODO Auto-generated constructor stub 
} 

public void FruitPool(final ITextureRegion watermelonRegion, 
     ITextureRegion cherryRegion,ITextureRegion mBallTextureRegion, ITextureRegion grapeTextureRegion, ITextureRegion strawberryTextureRegion) { 

    texture1 = watermelonRegion; 
    texture2 = cherryRegion; 
    texture3 = mBallTextureRegion; 
    texture4 = grapeTextureRegion; 
    texture5 = strawberryTextureRegion; 






    } 




@Override 
public void fillPool() { 
    Sprite fruit1 = new Sprite(0, 0, this.texture1); 
    sprites.add(fruit1); 

    Sprite fruit2 = new Sprite(0, 0, this.texture2); 
    sprites.add(fruit2); 


    Sprite fruit3 = new Sprite(0, 0, this.texture3); 
    sprites.add(fruit3); 


    Sprite fruit4 = new Sprite(0, 0, this.texture4); 
    sprites.add(fruit4); 


    Sprite fruit5 = new Sprite(0, 0, this.texture5); 
    sprites.add(fruit5); 



     super.getAvailable().add(fruit1); 
     super.getAvailable().add(fruit2); 
     super.getAvailable().add(fruit3); 
     super.getAvailable().add(fruit4); 
     super.getAvailable().add(fruit5); 



} 

}

私はこのようなアイテムを引き出す..

sprites spritesClass = sprites(5); 
    Sprite item = spritesClass.allocate(); 

アイテムをリサイクルするにはどうすればよいですか?私はこれを正しくやっていますか?

答えて

1

ゲーム中にonAllocatePoolItem()が頻繁に呼び出されるのですか?もしそうなら、それはオブジェクトプールではありません。実際、現在のケースでは、メソッドを呼び出すたびに新しいオブジェクトを作成しています。

「問題」を解決するのを助ける代わりに、I'll just point to an open source project by meではゲーム用のオブジェクトプールを正しく設定して使用する方法が示されています。このプロジェクトにはランダム化機能が含まれています。コメントはスウェーデン語ですが、とにかくその部分を理解できるはずです。

+0

私はthis.fruitsPool.obtainPoolItem()を呼び出します。ちょうど約毎秒 –

+0

@coder:メソッドが呼び出されるたびに新しいオブジェクトを作成するので、それはオブジェクトプールではありません。 – Wroclai

+0

それは本当です!プールに入っていれば自動的にスプライトを再利用すると思っていました。私はそれを.obtainPoolItem()から.onAllocatePoolItem()に変更したときに問題を修正しましたが、あなたのプロジェクトをチェックアウトして、それを利用できるかどうかを確認しようとしています。 –