Java-ArrayList对象未正确删除

Java-ArrayList对象未正确删除,java,nanotime,Java,Nanotime,我正在为我最后一年的项目制作一个2D平台游戏。 这个游戏基本上是关于一个球员来回走动,收集积分和达成目标。。。玩家可以发射子弹,当子弹击中一个街区时,它就会被摧毁。现在,我想使用所谓的“粒子”对象添加爆炸效果。我已经为它编写了manager类,它似乎第一次起作用了,但在拍摄了几次之后,我注意到粒子不再被删除,它们只是继续在屏幕外移动。寿命限制为500ns 我还注意到,如果我在游戏一开始就开枪,效果就会像预期的那样结束。但在等待几秒钟后,然后发射子弹,效果粒子的行为并不像它们应该的那样 下面是我一

我正在为我最后一年的项目制作一个2D平台游戏。 这个游戏基本上是关于一个球员来回走动,收集积分和达成目标。。。玩家可以发射子弹,当子弹击中一个街区时,它就会被摧毁。现在,我想使用所谓的“粒子”对象添加爆炸效果。我已经为它编写了manager类,它似乎第一次起作用了,但在拍摄了几次之后,我注意到粒子不再被删除,它们只是继续在屏幕外移动。寿命限制为500ns

我还注意到,如果我在游戏一开始就开枪,效果就会像预期的那样结束。但在等待几秒钟后,然后发射子弹,效果粒子的行为并不像它们应该的那样

下面是我一开始就开枪的样子(应该是什么样子):

这是它的样子,在射击前等待了几秒钟。

ParticleManager.java 我还没有弄清楚我做错了什么,我在谷歌上搜索了一些东西,有一次我发现了一个答案,提到一些参考文献由于某种原因没有被直接删除


我的问题是“我怎样才能使这些粒子在经过一定的时间后消失?”,如第一张GIF所示“

我认为问题在于你不断地覆盖
timePassed

// Updating particle object before 
// checking for time lapse
p.update();

// Append outdated particles to removeParticles
// if time limit has passed
if(System.nanoTime() - p.timePassed >= Config.particleLife) {
    removeParticles.add(p);
}
p.update()

我认为您确实希望在构造函数中设置
timePassed
(也许它的名称应该是
timeCreated


此外,只需提醒一下,您永远不会清除
removeParticles
,这样列表将永远增长,直到导致进程内存不足为止。

应该
this.timePassed=System.nanoTime()是否在
update()
方法中?它似乎更适合放在构造函数中,不是吗?我已经尝试在构造函数中分配
this.timePassed
,但是粒子根本没有绘制。
Config.particleLife
的值是不可变的吗?有没有可能某个东西在游戏中几秒钟内改变了它的值?或者更好,在构造器中创建的创建时间,经过的时间也会更新为差异,如果所有粒子都需要同时消失,为什么不通过将
timePassed
值移动到
ParticleManager
来简化您的设计,以便您只需要在一个位置跟踪每个粒子爆发的该值?(我猜也许你的“尾巴”爆裂会让每个粒子有自己的寿命,所以如果是这样的话,我的建议就行不通了。)当我在构造函数中只分配
timePassed
时,粒子永远不会被绘制并立即删除。我的第一个猜测是
particleLife
太短(可能为零)?您是否正确地将其转换为纳秒并进行了设置?@IdontReallywolf这可能是因为您正在查询纳秒。您配置的生命周期值是多少?试着把它增加几个数量级。我不确定是否必须转换它,但它被设置为500,我试着将它设置为500000,但也没有帮助。未绘制粒子,但立即删除的粒子表示第十亿次,因此如果需要半秒,则需要将其设置为
500000000
class Particle {

    private double px, py, x, y; 
    private int radius, angle;
    public long timePassed;
    String type;

    public Particle(String type, double x, double y, int angle) {
        this.x = x;
        this.y = y;
        this.radius = 0;
        this.angle = angle; 
        this.timePassed = 0;
        this.type = type; // explosion, tail

    }

    public void update() {
        px  =   x + radius * Math.cos(angle);
        py  =   y + radius * Math.sin(angle);
        radius += 2;

        this.timePassed = System.nanoTime();
    }

    public void render(Graphics2D g) {
        g.setColor(Color.WHITE);
        g.fillOval((int)px, (int)py, 5, 5); 
    }
}
// Updating particle object before 
// checking for time lapse
p.update();

// Append outdated particles to removeParticles
// if time limit has passed
if(System.nanoTime() - p.timePassed >= Config.particleLife) {
    removeParticles.add(p);
}