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