Я работаю над 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»