gpt4 book ai didi

java - GenericPool逻辑问题(AndEngine)

转载 作者:行者123 更新时间:2023-12-01 15:36:48 24 4
gpt4 key购买 nike

我创建这个池是为了回收和重用我添加到场景中的 Sprite

正如您将在我的代码中看到的,我创建了自己的获取方法,该方法随机化选择出现在场景中的 Sprite ,并随机化其 x 位置。问题是,它似乎出于某种原因选择了相同的位置,它在整个场景中出于某种原因选择了中间、左边和右边,当它应该随机化位置时,每次我重新启动场景时它都会随机选择3 个 Sprite 有 3 个位置,并且在整个场景中保持不变, Sprite 也不是随机的。这是我正在使用的内容

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

我可以做或改变什么来使这个逻辑更好?

编辑:

这是我到目前为止所想出的办法,现在我陷入困境,如何将一个项目拉出来,然后回收它以重新使用

公共(public)类 Sprite 扩展了 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();

如何回收元素?我这样做对吗?

最佳答案

onAllocatePoolItem() 在您的游戏中是否被频繁调用?如果是这样,那么它本身就不是一个对象池。事实上,在当前情况下,每次调用该方法时都会创建新对象。

I'll just point to an open source project by me 不是试图帮助您解决“问题”,而是,它向您展示了如何为您的游戏正确设置和使用对象池。该项目包括随机化功能。评论是瑞典语的,但无论如何你应该能够弄清楚那部分。

关于java - GenericPool逻辑问题(AndEngine),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8735179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com