Универсальный счетчик против нескольких счетчиков событий

#java #2d-games

#java #2d-игры

Вопрос:

Я создаю игру с использованием Java, где многие события в этой игре основаны на времени. В игровом движке есть метод act для всех объектов, где я могу все обновить. На данный момент у каждого объекта, имеющего события, основанные на времени, есть целочисленный счетчик, который вызывается каждый раз, когда вызывается действие. Мой вопрос в том, что если у меня будут объекты в сотнях, стоит ли добавлять глобальный счетчик к одноэлементному элементу и позволять каждому объекту использовать это или увеличивать целые числа, а затем постоянно возвращать их к нулю, не будет такой большой проблемой? Также есть ли лучший способ подсчета времени, чем увеличение целых чисел?

Комментарии:

1. Используйте таймер или класс Swing Timer .

2. @PM77-1 Ага. что? Использовать таймер реального времени для игры ? Я не согласен. Он должен использовать игровые циклы.

Ответ №1:

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

 class Game{
    List<Entity> entities;

    //your "act" method
    public void update(){
        for(Entity e : entities){
            e.update();
        }
    }
    public void draw(Graphics2D g){
        for(Entity e : entities){
            e.draw(g);
        }
    }
}
  

Но чтобы ответить на ваш вопрос, поскольку вы используете события, основанные на времени, возможно, вы могли бы сделать это вместо этого:

 class Game{
    private List<Entity> entities;
    private int time = 0;        

    //your "act" method
    public void update(){
        for(Entity e : entities){
            e.update(time);
        }
        time  ;
    }
    public void draw(Graphics2D g){
        for(Entity e : entities){
            e.draw(g);
        }
    }
}
  

И для каждого объекта просто используйте прошедшее время. Вам не нужно его сбрасывать. Например, если вы хотите, чтобы объект делал что-то каждые 300 кадров, вы могли бы сделать это:

 class Dog{
    public void update(int time){
        if(time % 300 == 0){
             bark();
        }
    }
    public void draw(Graphics2D g){}
    public void bark(){}
}
  

Комментарии:

1. Спасибо! На самом деле я уже настроил его так, я не знаю, почему я раньше не думал об использовании modulo!

2. Теоретически вы можете переполниться time, .