Java - объекты ArrayList не удалены должным образом
Я работаю над 2D-платформерной игрой для моего последнего проекта HS Year. Игра в основном о том, что игрок идет назад и вперед, набирает очки и достигает целей... Игрок может стрелять пулями, а когда пули попадают в блок, он уничтожается. Теперь я хотел добавить эффект взрыва, используя так называемые "частицы" объектов. Я написал для него класс менеджера, и он, кажется, сработал в первый раз, но после съемки несколько раз я заметил, что частицы перестали удаляться, они просто продолжаются и выходят за пределы экрана. Срок службы составляет 500 нс.
Я также заметил, что если я стреляю пулями, как только игра начинается, эффект заканчивается, как и должно быть. но после ожидания еще нескольких секунд и последующего выстрела пули частицы эффекта не ведут себя должным образом.
Вот как это выглядит, когда я стреляю пулями, как только я запускаю игру (как это должно выглядеть):
и вот как это выглядит, подождав несколько секунд, прежде чем выстрелить пулями.
ParticleManager.java
public class ParticleManager {
private ArrayList<Particle> particles;
private ArrayList<Particle> removeParticles;
public ParticleManager() {
particles = new ArrayList<Particle>();
removeParticles = new ArrayList<Particle>();
}
public int getListSize() {
return particles.size();
}
/*
Generate particles
*/
public void genParticle(int x, int y, int amount) {
for(int i = 0; i < amount; i++) {
particles.add(new Particle("explosion" , x,y, i));
}
}
public void update() {
// Iterate trough particle objects
// update them & check for lifeTime
for(Particle p: particles) {
// 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);
}
}
// finally, delete all "remove-marked" objects
particles.removeAll(removeParticles);
}
public void render(Graphics2D g) {
for(Particle p: particles) {
p.render(g);
}
}
}
Particle.java
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);
}
}
Я не понял, что я делаю здесь неправильно, я погуглил о некоторых вещах, и в какой-то момент я наткнулся на ответ, в котором говорилось, что некоторые ссылки не удаляются напрямую по какой-то причине...
и мой вопрос: "Как я могу заставить эти частицы исчезать через определенное количество времени? - как показано в первом GIF"
1 ответ
Я думаю, что проблема в том, что вы постоянно перезаписываете 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
сейчас и потом проверка if проверяет, прошло ли время далеко от настоящего времени (никогда не будет, поскольку оно было установлено).
Я думаю, что вы хотите установить timePassed
в конструкторе (может быть, лучше назвать timeCreated
).
Кроме того, просто один на один, вы никогда не очистите removeParticles
так что этот список будет расти вечно, пока он не заставит процесс исчерпать память.