2015-03-10 3 views
3

Я пытаюсь создать игру типа змеи, и у меня возникают проблемы с тем, что «гранулы» появляются в случайных местах с фиксированными интервалами (я хочу сделать это 10 секунд). Когда я запускаю программу после короткой задержки, которую я дал ей (1000 миллисекунд), гранулы начинают очень быстро мигать на экране в разных местах. То, что я хочу сделать, это заставить гранулы появляться по очереди в случайных местах каждые 10 секунд, а не быстро мигать. Любая помощь будет оценена по достоинству.Проблемы с задержкой таймера Java

P.S. Я никогда не делал ничего подобного, поэтому, извини, если код может показаться немного грубым. Любые советы с кодированием в целом также очень ценятся.

Редактировать: Я знаю, что это все еще некорректно, но я просто хочу знать, насколько я по крайней мере на правильном пути. Теперь «таблетка» просто сидит в верхнем правом углу рамки. Есть ли проблема сейчас с моим таймером или списком или просто вообще. Кстати, если обновление моего кода только для того, чтобы показать новые проблемы, на него нахмурилось, дайте мне знать, и я просто попрошу о помощи в разделе комментариев и остановись с изменениями.

package snake; 

import java.awt.* ; 
import java.awt.event.*; 
import java.util.* ; 
import javax.swing.*; 
import javax.swing.Timer; 
/** 
* 
* @author Carlos 
*/ 
public class Pellet extends JPanel 
{ 
    Random randomNumber = new Random() ; 
    int x = 0 ; 
    int y = 0 ; 
    private Game game ; 
    private Timer timer ; 
    private final int DELAY = 100 ; 
    private ArrayList<Pellet> al = new ArrayList<>() ; 

    public Pellet(Game game) 
    {   
     this.game = game ;   
    } 

    @Override 
    public void paint(Graphics g) 
    { 
     super.paintComponent(g); 
     g.fillOval(x, y, 10, 10); 

     for(int i = 0 ; i < al.size() ; i++) 
     { 
      Pellet p = al.get(i) ; 
      p.paintComponent(g); 
     } 

    } 

    public void pelletTimer() 
    { 
     timer = new Timer(DELAY, new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       x = randomNumber.nextInt(game.getWidth()) ; 
       y = randomNumber.nextInt(game.getHeight()) ; 
       Pellet p = new Pellet(game) ; 
       al.add(p) ; 
       repaint() ; 
      } 
     }) ;  
     timer.start(); 
    } 


} 

ответ

5

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

  • Во-первых, это программа Свинг и поэтому вы должны позаботиться, чтобы не топать на резьбе Качели событий, то, что java.util.Timer будет делать.
  • Вы также создаете свой java.util.Timer в методе рисования, что никогда не должно выполняться, так как этот метод предназначен только для рисования и рисования, и его не следует замещать или использовать с некрасивым кодом.
  • Ваш метод рисования не является истинным методом рисования компонента Swing, поскольку он имеет неправильную подпись (он использует параметр Graphics2D, а не ожидаемый параметр Graphics), и ваш класс не расширяет компонент Swing, поэтому этот метод будет выполнять ничего не для вас.

Предложения:

  • Розыгрыш в методе paintComponent переопределить в классе, который расширяет JPanel.
  • Сначала вызовите метод super.paintComponent.
  • Используйте анимацию javax.swing.Timer или "Swing" Timer.
  • В своем таймере создайте новый гранулу, добавьте его в ArrayList из гранул и вызовите repaint(), который сообщит JVM о том, чтобы перерисовать ваш графический интерфейс и, таким образом, он автоматически вызовет ваш метод paintComponent для вас.
  • В вашем методе paintComponent, вызвав метод супер, проведите по грануле ArrayList, рисуя каждый отдельный гранулят, как и вы.
  • Ознакомьтесь с учебниками Swing, особенно с графическим разделением. Вы можете найти ссылку на них здесь: swing info.
  • И посмотрите этот сайт для примеров анимации Swing, написанных мною. Результаты можно найти с помощью this search.
+0

Я исправил его! Он работает так, как предполагалось сейчас, и я хочу поблагодарить вас за это судно на воздушной подушке, полное из-за угрей, спасибо за вашу помощь! – Saliva

+0

@ Saliva: рад, что у вас все работает! –

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