更新不相关的Poolable对象后,对象无法渲染

时间:2015-03-23 01:29:12

标签: java libgdx game-engine

代码相对自我解释。我正在做一个小动作游戏。游戏在屏幕上呈现Poolable blob敌人,它们渲染得很好,攻击我的玩家,在经过一定量的点击后死亡。出于某种原因,取消注释“updateEffects()”方法会导致blob敌人在被击中一次后停止渲染。

public void render() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// TODO Auto-generated method stub
tilesRavis.setView(cam);
tilesRavis.render();
sbatch = (SpriteBatch) tilesRavis.getBatch();

sbatch.begin();

playerbar.update(world.getp1().currentHP, world.getp1().maxHP);
manabar.update(world.getp1().currentMP, world.getp1().maxMP); 
drawBars();
sbatch.end(); 

drawNewPlayer(world.getp1());
//  updateEffects();

drawDemBlobs();

cam.position.set(world.getp1().getPosition().x, world.getp1().getPosition().y, 0);
cam.update();
guicam.update();
}

//carries out animation
private void drawBlob(Blob blob){
    TextureRegion temp2 = GameAssets.gooSprite.move.getKeyFrame(blob.getEnemyTime(), true);
    switch (blob.getBlobState()){
    case Patrol:
        temp2 = GameAssets.gooSprite.move.getKeyFrame(blob.getEnemyTime(), true);
        break;
    case Pursue:
        temp2 = GameAssets.gooSprite.move.getKeyFrame(blob.getEnemyTime(), true);
        break;
    case AtkDraw:
        temp2 = GameAssets.gooSprite.move.getKeyFrame(blob.getEnemyTime(), true);
        break;
    case AtkWindow:
        temp2 = GameAssets.gooSprite.move.getKeyFrame(blob.getEnemyTime(), true);
        break;
    case AtkRecovery:
        temp2 = GameAssets.gooSprite.move.getKeyFrame(blob.getEnemyTime(), true);
        break;

    }
    Batch batch = tilesRavis.getBatch();
    batch.begin();
    batch.draw(temp2, blob.getPosition().x, blob.getPosition().y, 1, 1);
    batch.end();
}

public void drawDemBlobs(){
    for(int i = 0; i < world.getaBlob().size; i++){
        Blob blob = world.getaBlob().get(i);        
        drawBlob(blob);

        if(blob.isEffectHit()){
            spawnEffect(blob.getPosition(), GameAssets.gooHit, 1, 500); //create effect
            blob.setEffectHit(false);
        }
    }
}


private void updateEffects(){
for(int b = 0;  b < effectArray.size; b++){
    Effect effect = effectArray.get(b);
            if(effect.getLife().hasCompleted()){ 
                effectArray.removeIndex(b);
                effectPool.free(effect);
            }           
        }
}

public void drawEffect(Effect effect){
    TextureRegion temp = new TextureRegion();
    temp = effect.animation.getKeyFrame(effect.getStateTime(), false);
    Batch batch = tilesRavis.getBatch();
    batch.begin();
    batch.draw(temp, effect.getPosition().x, effect.getPosition().y, effect.size, effect.size);
    batch.end();

}

public void spawnEffect(Vector2 position, Animation animation, float size, long life){
    Effect effect = effectPool.obtain();
    effect.init(position, animation, size, life);
    effectArray.add(effect);

}

绘制效果(一点blob血溅)似乎没有,呃,影响blob是否停止渲染。

1 个答案:

答案 0 :(得分:0)

从头开始遍历数组时调用removeIndex(b),这会导致不好的事情发生。

将updateEffects方法中的for循环更改为以下内容:

for(int b = effectArray.size - 1;  b >= 0; b--){
 // stuff
}