さて、私は小さなジレンマに遭遇しました。
スプライトをリサイクルして再利用できる汎用プールがあります。問題は、プールにロードしたい 6 つのテクスチャがあり、それぞれがプールから引き出される可能性があることを確認することです。
現在起こっていることは、同じスプライトがリサイクルされ、何度も使用されていることです。これが私のプールコードです。
public class ObjectPool extends GenericPool<Sprite> {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private TextureRegion texture1;
private TextureRegion texture2;
private TextureRegion texture3;
private TextureRegion texture4;
private TextureRegion texture5;
private TextureRegion texture6;
private final Scene Gamescene;
private final VertexBufferObjectManager spriteVertexBuffer;
private Sprite fruit;
private final float CAMERA_WIDTH;
private final float CAMERA_HEIGHT;
public static boolean sprite_touched;
private final Camera camera;
// Variables
private final float minDuration = 3.1f;
private final float maxDuration = 5.1f;
private final TextureRegion blueParticleRegion;
private final Sound PersonTouchedSound;
private PointParticleEmitter particleEmitter;
private SpriteParticleSystem particleSystem;
private Random random = new Random();
// ===========================================================
// Constructors
// ===========================================================
public ObjectPool(final TextureRegion Region1,final TextureRegion Region2,final TextureRegion Region3,final TextureRegion Region4,final TextureRegion Region5, final TextureRegion Region6,
VertexBufferObjectManager spriteBufferObject, Camera camera,
Sound sound, Scene scene, TextureRegion particle) {
this.texture1 = Region1;
this.texture2 = Region2;
this.texture3 = Region3;
this.texture4 = Region4;
this.texture5 = Region5;
this.texture6 = Region6;
this.CAMERA_HEIGHT = camera.getHeight();
this.CAMERA_WIDTH = camera.getWidth();
this.camera = camera;
this.PersonTouchedSound = sound;
this.blueParticleRegion = particle;
Gamescene = scene;
initTrail(-70, -70);
this.spriteVertexBuffer = spriteBufferObject;
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
protected Sprite onAllocatePoolItem() {
int sprite = random.nextInt(1)+6;
switch(sprite){
case 1:
fruit = new Sprite(210, -10, 60, 100, this.texture1,
this.spriteVertexBuffer) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
// Detects if player is outside of bounds
final float width = this.getWidth();
final float height = this.getHeight();
float x = pSceneTouchEvent.getX() - width / 2;
float y = pSceneTouchEvent.getY() - height / 2;
if (x < 0)
x = 0;
if (y < 0)
y = 0;
if (x > (CAMERA_WIDTH - width))
x = CAMERA_WIDTH - width;
if (y > (CAMERA_HEIGHT - height))
y = (CAMERA_HEIGHT - height);
moveTrail(x, this.getY());
if (pSceneTouchEvent.isActionDown()) {
this.setScale(2f);
sprite_touched = true;
PersonTouchedSound.play();
}
if (pSceneTouchEvent.isActionUp()) {
this.setScale(1f);
particleEmitter.setCenter(-70, -70);
sprite_touched = false;
}
this.setPosition(x, this.getY());
return true;
}
};
break;
case 2:
fruit = new Sprite(210, -10, 60, 100, this.texture2,
this.spriteVertexBuffer) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
// Detects if player is outside of bounds
final float width = this.getWidth();
final float height = this.getHeight();
float x = pSceneTouchEvent.getX() - width / 2;
float y = pSceneTouchEvent.getY() - height / 2;
if (x < 0)
x = 0;
if (y < 0)
y = 0;
if (x > (CAMERA_WIDTH - width))
x = CAMERA_WIDTH - width;
if (y > (CAMERA_HEIGHT - height))
y = (CAMERA_HEIGHT - height);
moveTrail(x, this.getY());
if (pSceneTouchEvent.isActionDown()) {
this.setScale(2f);
sprite_touched = true;
PersonTouchedSound.play();
}
if (pSceneTouchEvent.isActionUp()) {
this.setScale(1f);
particleEmitter.setCenter(-70, -70);
sprite_touched = false;
}
this.setPosition(x, this.getY());
return true;
}
};
break;
case 3:
fruit = new Sprite(210, -10, 60, 100, this.texture3,
this.spriteVertexBuffer) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
// Detects if player is outside of bounds
final float width = this.getWidth();
final float height = this.getHeight();
float x = pSceneTouchEvent.getX() - width / 2;
float y = pSceneTouchEvent.getY() - height / 2;
if (x < 0)
x = 0;
if (y < 0)
y = 0;
if (x > (CAMERA_WIDTH - width))
x = CAMERA_WIDTH - width;
if (y > (CAMERA_HEIGHT - height))
y = (CAMERA_HEIGHT - height);
moveTrail(x, this.getY());
if (pSceneTouchEvent.isActionDown()) {
this.setScale(2f);
sprite_touched = true;
PersonTouchedSound.play();
}
if (pSceneTouchEvent.isActionUp()) {
this.setScale(1f);
particleEmitter.setCenter(-70, -70);
sprite_touched = false;
}
this.setPosition(x, this.getY());
return true;
}
};
break;
case 4:
fruit = new Sprite(210, -10, 60, 100, this.texture4,
this.spriteVertexBuffer) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
// Detects if player is outside of bounds
final float width = this.getWidth();
final float height = this.getHeight();
float x = pSceneTouchEvent.getX() - width / 2;
float y = pSceneTouchEvent.getY() - height / 2;
if (x < 0)
x = 0;
if (y < 0)
y = 0;
if (x > (CAMERA_WIDTH - width))
x = CAMERA_WIDTH - width;
if (y > (CAMERA_HEIGHT - height))
y = (CAMERA_HEIGHT - height);
moveTrail(x, this.getY());
if (pSceneTouchEvent.isActionDown()) {
this.setScale(2f);
sprite_touched = true;
PersonTouchedSound.play();
}
if (pSceneTouchEvent.isActionUp()) {
this.setScale(1f);
particleEmitter.setCenter(-70, -70);
sprite_touched = false;
}
this.setPosition(x, this.getY());
return true;
}
};
break;
case 5:
fruit = new Sprite(210, -10, 60, 100, this.texture5,
this.spriteVertexBuffer) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
// Detects if player is outside of bounds
final float width = this.getWidth();
final float height = this.getHeight();
float x = pSceneTouchEvent.getX() - width / 2;
float y = pSceneTouchEvent.getY() - height / 2;
if (x < 0)
x = 0;
if (y < 0)
y = 0;
if (x > (CAMERA_WIDTH - width))
x = CAMERA_WIDTH - width;
if (y > (CAMERA_HEIGHT - height))
y = (CAMERA_HEIGHT - height);
moveTrail(x, this.getY());
if (pSceneTouchEvent.isActionDown()) {
this.setScale(2f);
sprite_touched = true;
PersonTouchedSound.play();
}
if (pSceneTouchEvent.isActionUp()) {
this.setScale(1f);
particleEmitter.setCenter(-70, -70);
sprite_touched = false;
}
this.setPosition(x, this.getY());
return true;
}
};
break;
case 6:
fruit = new Sprite(210, -10, 60, 100, this.texture6,
this.spriteVertexBuffer) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
// Detects if player is outside of bounds
final float width = this.getWidth();
final float height = this.getHeight();
float x = pSceneTouchEvent.getX() - width / 2;
float y = pSceneTouchEvent.getY() - height / 2;
if (x < 0)
x = 0;
if (y < 0)
y = 0;
if (x > (CAMERA_WIDTH - width))
x = CAMERA_WIDTH - width;
if (y > (CAMERA_HEIGHT - height))
y = (CAMERA_HEIGHT - height);
moveTrail(x, this.getY());
if (pSceneTouchEvent.isActionDown()) {
this.setScale(2f);
sprite_touched = true;
PersonTouchedSound.play();
}
if (pSceneTouchEvent.isActionUp()) {
this.setScale(1f);
particleEmitter.setCenter(-70, -70);
sprite_touched = false;
}
this.setPosition(x, this.getY());
return true;
}
};
break;
}
return fruit;
}
@Override
protected void onHandleObtainItem(final Sprite pItem) {
pItem.reset();
}
@Override
protected void onHandleRecycleItem(final Sprite pItem) {
pItem.setVisible(false);
pItem.setPosition(210, -5);
pItem.setIgnoreUpdate(true);
particleEmitter.setCenter(-70, -70);
pItem.clearEntityModifiers();
}
private void initTrail(float x, float y) {
this.particleEmitter = new PointParticleEmitter(x, y);
this.particleSystem = new SpriteParticleSystem(particleEmitter, 100, 100,
360, this.blueParticleRegion, spriteVertexBuffer);
particleSystem.addParticleInitializer(new AlphaParticleInitializer<Sprite>(
1));
particleSystem
.addParticleInitializer(new BlendFunctionParticleInitializer<Sprite>(
GLES20.GL_BLEND_COLOR, GLES20.GL_ONE));
particleSystem
.addParticleInitializer(new VelocityParticleInitializer<Sprite>(0));
particleSystem
.addParticleInitializer(new ExpireParticleInitializer<Sprite>(.6f));
particleSystem.addParticleModifier(new ScaleParticleModifier<Sprite>(0, 1,
1, 0));
Gamescene.attachChild(particleSystem);
}
public void moveTrail(float x, float y) {
particleEmitter.setCenter(x, y);
}
private void fillPool(){
}
}