2013-04-24 2 views
1

Я в настоящее время создаю игру для подключения к четырем для удовольствия и почти закончил, когда решил, что было бы здорово добавить падающую анимацию. Я знаю пару разных способов сделать это, но я не уверен, что было бы «лучше».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().

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

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

+0

Помните, что 25 кадров в секунду = 40 миллисекунд, даже 60 кадров в секунду - всего 16 миллисекунд, возможно, 10 миллисекунд. Если вы используете обычную роспись, тогда «repaint» должно быть более чем достаточно. Если вы не полагаетесь на диспетчер компоновки, вам не нужно действительно делать недействительным контейнер – MadProgrammer

+0

@MadProgrammer, спасибо. Я просто сделал 10 миллисекунд, чтобы увидеть, могу ли я визуально увидеть разницу, т. Е. Мерцание или что не между двумя подходами. – Pent

ответ

1

Ваш Кусок является компонентом. Все, что вам нужно сделать, это вызов setLocation (. ..), и компонент автоматически перекрашивается автоматически. Нет необходимости в какой-либо индивидуальной покраске.

Если добавить компонент в GUI, я должен был бы назвать Invalidate() и проверки()

Просто установите раскладку на NULL. Вам нужно будет установить размер компонента, но не нужно вызывать invalidate() или validate(), поскольку эти методы используются менеджером макета.

+0

+1 и +1 для doc ... listener на другом форуме – mKorbel

+0

Не знаю, почему я об этом не думал. Спасибо. Я использую комбинацию 'setLocation()' и 'repaint()' now, чтобы дать кусочку динамическое и статическое местоположение, соответственно. – Pent

+0

Вам не нужно перерисовывать().Функция setLocation() автоматически перекрасит компонент в новое место. – camickr

1

Это будет зависеть. Самое простое решение (с моей точки зрения) - использовать пользовательскую картину (используйте repaint и обрабатывайте все в paintComponent, так как это позволит вам лучше контролировать слои графики (IHMO).

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

в основном, это потребует от вас, чтобы управлять (прямо или косвенно) свой собственный менеджер компоновки для частей и доски.

+0

Спасибо. Я делаю их комбинацию, используя 'setLocation()' и 'repaint()' – Pent

Смежные вопросы