Лучший способ оживить в Java? - PullRequest
2 голосов
/ 22 декабря 2011

В настоящее время я использую созданный мной движок анимации, который берет объекты типа Drawable и добавляет их в список. Drawable - это интерфейс, который имеет один метод:

public void draw(Graphics2D g2d);

Расширяющийся менеджер анимации просматривает этот список и вызывает метод draw () для каждого объекта, передавая объект Graphics2D, полученный из компонента Swing.

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

Зарегистрированные всего два Drawables, оба рисуют изображения на экране, через 30-60 секунд начинают мигать.

Есть ли способ оптимизировать этот метод? В настоящее время он обращается к потоку AWT (invokeLater) для обработки всех задач. Параллельное рисование на самом деле не вариант, так как это почти всегда вызывает проблемы в Swing / AWT, в значительной степени из-за того, что Graphics не синхронизируется.

Если это просто плохой способ анимации, то какой метод лучше, когда у вас есть несколько объектов, для которых все вещи должны отображаться с их собственными конкретными переменными кашель игра кашель ?

Любая помощь будет принята с благодарностью. Спасибо!

EDIT:

Я не могу использовать repaint (), потому что мой движок уже вызывает поток AWT для рисования. Если я вызываю invokeLater из потока AWT, изображение по какой-то причине никогда не окрашивается.

Я должен также добавить, что я использую систему тиков и фпс. 60 тиков при 120 кадрах в секунду.

Каждый тик обновляет игровую логику, в то время как вызовы рендеринга каждого фрейма рисуют на менеджере фреймов.

Это плохая идея? Должен ли я просто использовать FPS, а не тики?

1 Ответ

5 голосов
/ 22 декабря 2011

Я думаю, что было бы более уместно переопределить paintComponent (Graphics g) и регулярно вызывать метод перекраски в JPanel или что-либо, что вы рисуете с помощью Timer.Ваши проблемы могут быть связаны с тем, что вы пытаетесь сделать ничью, а затем Swing делает свою собственную ничью.

public class Main {
public static void main(String[] args) {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel() {
        public void paintComponent(Graphics g) {
            //draw here
        }
    };
    panel.setPreferredSize(800, 600);
    frame.add(panel);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true)

    new Timer(16, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            panel.repaint();
        }
    }).start();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...