GenericPool Логически проблемы(AndEngine)

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

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

Что-нибудь, что я могу сделать или изменить, чтобы улучшить логику этого?

РЕДАКТИРОВАТЬ:

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

спрайты открытого класса расширяют 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();

Как перерабатывать предметы? Я делаю это правильно?


person coder_For_Life22    schedule 04.01.2012    source источник


Ответы (1)


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

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

person Wroclai    schedule 04.01.2012
comment
Да, я называю this.fruitsPool.obtainPoolItem(); почти каждую секунду - person coder_For_Life22; 05.01.2012
comment
@coder: тогда это не пул объектов, поскольку он создает новые объекты каждый раз, когда вызывается метод. - person Wroclai; 05.01.2012
comment
Это правда! Я думал, что он автоматически повторно использует спрайты, если они уже находятся в пуле. Когда я изменил его с .obtainPoolItem() на .onAllocatePoolItem(), это устранило проблему, но я собираюсь проверить ваш проект и посмотреть, смогу ли я его использовать. - person coder_For_Life22; 05.01.2012
comment
Итак, каковы особенности вашего пула объектов? Вы можете обновить его в своем ответе, это может помочь кому-то еще. - person coder_For_Life22; 05.01.2012
comment
Также было бы здорово получить некоторые инструкции о том, как его использовать, так как я не могу понять комментарии. LOL =) - person coder_For_Life22; 05.01.2012
comment
Я пытался изменить ваш код, чтобы он работал для моего проекта, я немного запутался в том, что мне нужно сделать, чтобы изменить его, чтобы он работал для того, что я пытаюсь сделать. Возможно, вы могли бы предоставить более подробное руководство в своем ответе. Я уверен, что парням здесь тоже понравится. - person coder_For_Life22; 05.01.2012
comment
@coder: это проще, чем вы думаете. Поскольку все сделано правильно, единственное, что вам нужно сделать, это создать класс, расширяющий TObjectPool<SpecificTypeHere>. Отсюда вы должны понять, что соответствующий код — это код из LinesPool, поскольку все остальные классы (CustomArrayList, ObjectPool, TObjectPool) являются общими. - person Wroclai; 05.01.2012