粒子行为非常快libgdx java

时间:2015-10-27 21:21:51

标签: java libgdx

我正在使用粒子效果,它会转到您点击的位置并且不会停止。当我点击某个地方时,粒子会相应地移动。然而,当我再次点击时,粒子开始越来越快地通过它的效果,我完全难以理解为什么。我假设它在SpellParent类中,因为它发生在所有法术中,并且现在所有法术通常与父级相同。这是父级法术课

   public SpellParent(Player player, float x, float y, float scalar){
    this.player = player;
    this.position = new Vector2(player.getHandPosition().x, player.getHandPosition().y);
    this.destination = new Vector2(x, y);
    this.isAlive = true;
    this.gridPosition = new Vector2();
    particle = new ParticleEffect();
    emitter = new ParticleEmitter();
    emitter.setName("asshole");

}
@Override
public void update() {
    particle.update(Gdx.graphics.getDeltaTime());
    if(particle.isComplete())
        particle.reset();
    particle.setPosition(position.x, position.y);
    //particle.getEmitters().first().setPosition(position.x, position.y);
    if(position.x >= destination.x - 1 && position.x <= destination.x + 1)
        reachedX = true;
    if(position.y >= destination.y - 1 && position.y <= destination.y + 1)
        reachedY = true;
    if(!reachedX){
        if(position.x < destination.x){
            velocity.x = 1f;
        }
        else if(position.x > destination.x){
            velocity.x = -1f;
        }

    }
    if(!reachedY){
        if(position.y < destination.y){
            velocity.y = 1f;
        }
        else if(position.y > destination.y){
            velocity.y = -1f;
        }
    }
    if(reachedX && reachedY){
        startBehavior();
    }else if(reachedY){
        velocity.y = 0;
    }else if(reachedX){
        velocity.x = 0;
    }
    position.x += velocity.x;
    position.y += velocity.y;

    gridPosition.x = position.x / MapGrid.CELL_SIZE;
    gridPosition.y = position.y / MapGrid.CELL_SIZE;
}

@Override
public void render(SpriteBatch batch) {
    //if(isAlive)
    //emitter.draw(batch);
        particle.draw(batch);
        batch.draw(TextureTuples.dirt, position.x, position.y, 10, 10);
}

这里是输入监听器,用于查看它的调用方式

    @Override
public boolean keyDown(int keycode) {
    if(keycode == Keys.NUM_1){
         referenceSpell = new FlameSpell(player, tmp.x, tmp.y, .2f);
    }
    if(keycode == Keys.NUM_2){
         referenceSpell = new HealthRingSpell(player, tmp.x, tmp.y, .2f);
    }
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    tmp.x = screenX;
    tmp.y = screenY;
    tmp.z = 0;
    cam.unproject(tmp);
    stage.addSpell(referenceSpell);
    stageSpells.add(referenceSpell);
    grid.checkAndDestroy(new Vector2(tmp.x, tmp.y));
    return false;
}

这里只是澄清一个例子。我的健康戒指是一个蓝色的戒指,从一个小戒指变成一个大戒指,因此它的大小是脉动的。但是,如果我再次点击它会开始更快,更快,更快地进行大小更改。随着射击的火焰法术,它的x速度将在多次点击时非常快。非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

好吧,不要使用旧粒子,而是创建一个新粒子。新FlameSpell/HelthRingSpell。最好使用pool(Take a look here)

此外,每次触摸都不要将法术添加到舞台上。 (2次添加=快2倍,因为它获得加倍的更新调用)所以确保如果你点击10次它会快10倍。如果您更新两个阶段,则法术会更新两次。因此,在这种情况下,一个新法术获得2x更新。再次推动其4倍更新是6倍更新等等。如果我做对了。

但我不确定Stage meight是否检查引用是否已经在舞台上。

但总的来说,如果你将referenceSpell添加到舞台上,如果你设置了对新法术的引用,则无需在调用新法术后再添加它。 所以一切都很好,只是不在touchDown上阅读。只需在启动时添加referenceSpell并在keyDown上设置对法术的引用。

@Override
public boolean keyDown(int keycode) {
    if (keycode == Keys.NUM_1) {
        referenceSpell = new FlameSpell(player, tmp.x, tmp.y, .2f);
    }
    if (keycode == Keys.NUM_2) {
        referenceSpell = new HealthRingSpell(player, tmp.x, tmp.y, .2f);
    }
}

public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    tmp.x = screenX;
    tmp.y = screenY;
    tmp.z = 0;
    cam.unproject(tmp);
    //stage.addSpell(referenceSpell); //already added in ctor
    //stageSpells.add(referenceSpell);
    grid.checkAndDestroy(new Vector2(tmp.x, tmp.y));
    return false;
}