GenericPool Логически проблемы (AndEngine) - PullRequest
0 голосов
/ 05 января 2012

Я создал этот пул для переработки и повторного использования спрайтов, которые я добавляю в свою сцену

Как вы увидите в моем коде, я создал свой собственный метод получения, который рандомизирует выбранный спрайт для отображения на сцене и рандомизирует его положение x. Проблема в том, что кажется, что он выбирает одну и ту же позицию по какой-то причине, он выбирает среднюю, левую и правую по какой-то причине в течение всей сцены, когда предполагается случайное расположение позиций, каждый раз, когда я перезапускаю сцену, он выбирает случайно 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:

Вот то, что мне удалось до сих пор придумать, теперь я застрял на том, как вытащить предмет и затем переработать его для возобновления

открытый класс спрайтов расширяет 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 Ответ

1 голос
/ 05 января 2012

Часто ли в вашей игре вызывается onAllocatePoolItem()? Если так, то это не пул объектов сам по себе. Фактически, в текущем случае вы создаете новые объекты каждый раз, когда вызываете метод.

Вместо того, чтобы пытаться помочь вам с вашей "проблемой", Я просто укажу на мой проект с открытым исходным кодом , который показывает, как правильно настроить и использовать пул объектов для вашей игры. Проект включает в себя функцию рандомизации. Комментарии на шведском, но вы все равно сможете разобраться с этой частью.

...