gpt4 book ai didi

java - 粒子 Action 非常快 libgdx java

转载 作者:行者123 更新时间:2023-12-01 11:00:24 25 4
gpt4 key购买 nike

我正在使用粒子效果,它会到达您单击的位置并且不会停止。当我点击某个地方时,粒子就会相应地移动。然而,当我再次单击时,粒子开始越来越快地发挥其效果,我完全不明白为什么。我假设它在 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 速度会变得非常快。非常感谢任何帮助

最佳答案

好吧,您创建了一个新粒子,而不是使用旧粒子。新的FlameSpell/HelthRingSpell。最好使用来实现这一点。 (Take a look here)

此外,不要在每次触摸时都将咒语添加到舞台上。 (添加 2 次 = 快 2 倍,因为更新调用加倍)所以可以肯定,如果您点击 10 次,速度就会快 10 倍。如果您更新两个阶段,则该咒语会更新两次。所以在这种情况下,一个新咒语会更新 2 倍。再次推其 4 倍更新,再次更新 6 倍,依此类推。如果我猜对了。

但我不确定舞台是否可以检查引用是否已在舞台中。

但一般来说,如果您将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;
}

关于java - 粒子 Action 非常快 libgdx java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33378717/

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