Я хочу избавиться от объекта, когда он попадает в определенную точку - PullRequest
2 голосов
/ 30 апреля 2019

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

AnimationTimer timer = new AnimationTimer() {       
    ArrayList<GameObject>DeadFlowers = new ArrayList<GameObject>();
    @Override
    public void handle(long now) {
        // TODO Auto-generated method stub  
        gc.drawImage(img1, 0, 0, canvas.getWidth(), canvas.getHeight());

        if(count++>60) {
            flowers.add(new SpawnFlowers(gc, rnd.nextInt(600), rnd.nextInt(550)));
            count = 1;
        }

        for(GameObject obj : Hive) {
            obj.update();
        }

        for(GameObject obj : flowers) { 
            ((SpawnFlowers)obj).grow();

        }

        for(GameObject obj : DeadFlowers) {
            ((SpawnFlowers)obj).removeFlowers();
            DeadFlowers.remove(obj);
        }

        for(GameObject obj : characterList) {
            obj.update();
        }
    }
};

Класс моих цветов:

class SpawnFlowers extends GameObject implements FlowerIF {

  FlowerIF delegate;
  int age= 0;

  public SpawnFlowers(GraphicsContext gc, double x, double y) {
    super(gc, x, y);
    img = new Image("/res/rose.png");
    update();
    delegate = this;
    // TODO Auto-generated constructor stub
  }

public void grow() {
    age+=1;
    if(age == 300)
        delegate = new DeadFlower(gc, x, y);
    delegate.update();
}

public void removeFlowers() {
    if (age == 400) {
        delegate.update();
    }
}
}

Ответы [ 3 ]

2 голосов
/ 30 апреля 2019

У вас есть список DeadFlowers, но вы никогда не add() что-то.

Поэтому твой цикл

for(GameObject obj : DeadFlowers) {
    ((SpawnFlowers)obj).removeFlowers();
    DeadFlowers.remove(obj);
}

никогда не побежит.

Вы могли бы, например, сделать

public void grow() {
    age+=1;
    if(age == 300) {
        delegate = new DeadFlower(gc, x, y);
        DeadFlowers.add(delegate);
    }
    delegate.update();
}

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

public void removeFlowers() {
    if (age == 400) {
        delegate.update();
    }
}
1 голос
/ 30 апреля 2019

Скорее всего, ваша настоящая проблема здесь:

 for(GameObject obj : DeadFlowers) {
   ((SpawnFlowers)obj).removeFlowers();
   DeadFlowers.remove(obj);
 } 

Вы превратили свои цветы в DeadFlower, когда ему 300 лет. Я предполагаю , что вы также добавили этот новый объект DeadFlowerк вашему списку мертвых цветов.В следующем игровом цикле приведенный выше код вызывает проверки: - это возраст 400, если так ... ничего не делать .Затем ваш код удалит этот мертвый цветок из списка мертвых цветов!

Другими словами: когда цветок достигает 300, вы превращаете его в мертвый цветок.Сразу после этого вы удаляете этот мертвый цветок из списка мертвых цветов.Таким образом, этот список всегда будет немедленно очищен.

Короче говоря: вся ваша логика совершенно испорчена.Вы должны сделать шаг назад и четко обозначить (для себя в первую очередь), какие у вас есть корзины и как вы хотите их обработать.Как в:

if (age == 400) {
    delegate.update();
}

Этот код не делает ничего специфичным для этого случая 400.Сравните это с делом 300.Там вы создаете как минимум новый объект.Что-то меняется.Но в случае 400, ну, вы обновляете.Что это должно делать?!

Помимо этого: кажется, что вы неявно добавляете свои мертвые цветы в этот список в конструкторе этого класса.Супер плохая идея.Класс, который содержит , этот список мертвых цветов должен быть только местом, где новые цветы добавляются или удаляются в этот список.Я предполагаю, что ваш класс DeadFlowers знает этот список и добавляет новые экземпляры в этот список.Это мертвых неправильно.

И еще одна второстепенная вещь: ArrayList<GameObject>DeadFlowers = new ArrayList<GameObject>(); должно быть лучше List<GameObject> deadFlowers = new ArrayList<>();.Нет необходимости выражать конкретный тип (ArrayList) с левой стороны, нет необходимости использовать универсальный тип с правой стороны.И, конечно же, DeadFlowers нарушает соглашения об именах Java (должен начинаться со строчной буквы).

0 голосов
/ 30 апреля 2019

Если я не ошибаюсь, после того, как ваши цветы мертвы, не похоже, что вы меняете там возраст. Так зачем же возраст 400?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...