Я в настоящее время создаю игру для подключения к четырем для удовольствия и почти закончил, когда решил, что было бы здорово добавить падающую анимацию. Я знаю пару разных способов сделать это, но я не уверен, что было бы «лучше».Connect Four Falling Animation
Поскольку мой графический интерфейс состоит из JComponents, я решил, что должен использовать javax.swing.Timer
для обеспечения безопасности потоков.
ActionListener update = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
};
};
Timer timer = new Timer(10, update);
timer.start();
Мой реальный вопрос - что мне делать, чтобы обновить игровое поле? Было бы лучше позвонить repaint()
(возможно, даже repaint(Rectangle rec)
) и обработать все в paint()
или создать еще один класс для подключения четырех частей и добавить этот компонент в мой графический интерфейс.
Другой класс для моего соединения четыре части в настоящее время этот ...
public class Piece extends JLabel{
private Color color;
private Ellipse2D circle;
public Piece(Color color, int radius) {
this.color = color;
circle = new Ellipse2D.Float(0, 0, radius, radius);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
super.paintComponent(g2);
g2.setColor(color);
g2.fill(circle);
}
}
Если добавить компонент в GUI, я должен был бы назвать invalidate()
и validate()
довольно часто, так как таймер у меня в настоящее время быстро, и я не уверен, что это лучше или хуже, чем позвонить repaint()
.
Я пробовал оба из этих способов, и оба кажутся хорошо работающими, я просто не уверен, что является более эффективным? Я бы предпочел, чтобы это не было больше налогов, что это должно быть - для учебных целей.
Также, если есть лучший способ, чем то, о чем я думал, пожалуйста, дайте мне знать. Я открыт для всех предложений
Помните, что 25 кадров в секунду = 40 миллисекунд, даже 60 кадров в секунду - всего 16 миллисекунд, возможно, 10 миллисекунд. Если вы используете обычную роспись, тогда «repaint» должно быть более чем достаточно. Если вы не полагаетесь на диспетчер компоновки, вам не нужно действительно делать недействительным контейнер – MadProgrammer
@MadProgrammer, спасибо. Я просто сделал 10 миллисекунд, чтобы увидеть, могу ли я визуально увидеть разницу, т. Е. Мерцание или что не между двумя подходами. – Pent