Java - объекты ArrayList не удалены должным образом - PullRequest
0 голосов
/ 08 сентября 2018

Я работаю над 2D-платформерной игрой для моего последнего проекта HS Year. Игра в основном о том, что игрок идет вперед и назад, набирает очки и достигает целей ... Игрок может стрелять пулями, а когда пули попадают в блок, он уничтожается. Теперь я хотел добавить эффект взрыва, используя так называемые «частицы» объектов. Я написал для него класс менеджера, и он, кажется, сработал в первый раз, но после съемки несколько раз я заметил, что частицы перестали удаляться, они просто продолжаются и выходят за пределы экрана. Срок службы составляет 500 нс.

Я также заметил, что если я стреляю пулями, как только игра начинается, эффект заканчивается, как и должно быть. но после ожидания еще нескольких секунд и последующего выстрела пули частицы эффекта не ведут себя должным образом.

Вот как это выглядит, когда я стреляю пулями, как только я запускаю игру ( Как это должно выглядеть ):
enter image description here

и вот как это выглядит, подождав несколько секунд, прежде чем выстрелить пулями. enter image description here

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 Ответ

0 голосов
/ 08 сентября 2018

Мне кажется, проблема в том, что вы постоянно перезаписываете 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, так что список будет расти вечно, пока процесс не исчерпает память.

...