2015-08-15 2 views
1

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

public class BounceThread implements Runnable { 
    JFrame frame; 
    int myX = 500/2; 
    int myY = 500/2;; 

    int X; 
    int Y; 

    Canvas canvas; 
    BufferStrategy bufferStrategy; 
    BufferStrategy bufferStrategy2; 
    boolean running = true; 
    Random rand = new Random(); 
    Random rand2 = new Random(); 

    int n = rand.nextInt(450) + 1; 
    int n2 = rand.nextInt(450) + 1; 

    public BounceThread() { 
    frame = new JFrame("Basic Game"); 
    JPanel panel = (JPanel) frame.getContentPane(); 
    panel.setPreferredSize(new Dimension(500, 500)); 
    panel.setLayout(null); 
    canvas = new Canvas(); 
    canvas.setBounds(0, 0, 500, 500); 
    canvas.setIgnoreRepaint(true); 
    panel.add(canvas); 
    canvas.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyPressed(KeyEvent evt) { 
     moveIt(evt); 
     } 
    }); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    canvas.createBufferStrategy(2); 
    bufferStrategy = canvas.getBufferStrategy(); 
    canvas.requestFocus(); 
    } 

    public void run() { 
    while (running = true) { 
     Paint(); 
     if ((myX == n || myX == n) && (myY == n2 || myY == n2)) { 

     n = rand.nextInt(450) + 1; 
     n2 = rand.nextInt(450) + 1; 
     n2 = 10 * (Math.round(n/10)); 
     n = 10 * (Math.round(n/10)); 
     Paint(); 

     } 
    } 
    } 

    public static void main(String[] args) { 
    BounceThread ex = new BounceThread(); 
    new Thread(ex).start(); 
    } 

    public void Paint() { 

    Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics(); 
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 
    g.clearRect(0, 0, 500, 500); 
    Graphics2D e = (Graphics2D) bufferStrategy.getDrawGraphics(); 
    e.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 
    e.clearRect(0, 0, 500, 500); 

    Paint(g, e); 

    bufferStrategy.show(); 
    } 

    protected void Paint(Graphics2D g, Graphics2D e) { 
    n2 = 10 * (Math.round(n/10)); 
    n = 10 * (Math.round(n/10)); 
    g.fillOval(myX, myY, 30, 30); 

    g.setColor(Color.red); 

    e.fillOval(n, n2, 30, 30); 

    e.setBackground(Color.white); 
    } 

    public void moveIt(KeyEvent evt) { 
    switch (evt.getKeyCode()) { 
    case KeyEvent.VK_DOWN: 
     if (myY >= 450) { 
     break; 
     } else { 
     myY += 10; 
     break; 
     } 
    case KeyEvent.VK_UP: 
     if (myY <= 30) { 
     break; 
     } else { 
     myY -= 10; 
     break; 
     } 
    case KeyEvent.VK_LEFT: 
     if (myX <= 30) { 
     break; 
     } else { 
     myX -= 10; 
     break; 
     } 
    case KeyEvent.VK_RIGHT: 
     if (myX >= 450) { 
     break; 
     } else { 
     myX += 10; 
     break; 
     } 
    } 
    } 
} 

ответ

1

Я бы простирался от компонента (например, JComponent) и позволил JFC/Swing сделать как можно большую часть подъема. Пожалуйста, не звоните canvas.setIgnoreRepaint(true); и не забывайте repaint(); после каждого хода. Затем вам понадобится ActionListener для событий Timer. Ваша логика switch может быть выражена с помощью break за пределами логики if-else. Что-то вроде

public class BounceThread extends JComponent implements ActionListener { 
    JFrame frame; 
    int myX = 500/2; 
    int myY = 500/2;; 

    int X; 
    int Y; 

    Canvas canvas; 
    BufferStrategy bufferStrategy; 
    boolean running = true; 
    Random rand = new Random(); 

    int n = rand.nextInt(450) + 1; 
    int n2 = rand.nextInt(450) + 1; 

    public BounceThread() { 
     frame = new JFrame("Basic Game"); 
     JPanel panel = (JPanel) frame.getContentPane(); 
     panel.setPreferredSize(new Dimension(500, 500)); 
     panel.setLayout(null); 
     canvas = new Canvas(); 
     canvas.setBounds(0, 0, 500, 500); 
     // canvas.setIgnoreRepaint(true); 
     panel.add(canvas); 
     canvas.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyPressed(KeyEvent evt) { 
       moveIt(evt); 
       repaint(); 
      } 
     }); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setVisible(true); 
     canvas.createBufferStrategy(2); 
     bufferStrategy = canvas.getBufferStrategy(); 
     canvas.requestFocus(); 
    } 

    public static void main(String[] args) { 
     BounceThread ex = new BounceThread(); 
     int delay = 5000; // milliseconds 
     new Timer(delay, ex).start(); 
    } 

    @Override 
    public void repaint() { 
     Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics(); 
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     Graphics2D e = (Graphics2D) bufferStrategy.getDrawGraphics(); 
     e.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g.clearRect(0, 0, 500, 500); 
     e.clearRect(0, 0, 500, 500); 
     Paint(g, e); 
     bufferStrategy.show(); 
     super.repaint(); 
    } 

    protected void Paint(Graphics2D g, Graphics2D e) { 
     g.fillOval(myX, myY, 30, 30); 
     g.setColor(Color.red); 
     e.fillOval(n, n2, 30, 30); 
     e.setBackground(Color.white); 
    } 

    public void moveIt(KeyEvent evt) { 
     switch (evt.getKeyCode()) { 
     case KeyEvent.VK_DOWN: 
      if (myY < 450) { 
       myY += 10; 
      } 
      break; 
     case KeyEvent.VK_UP: 
      if (myY > 30) { 
       myY -= 10; 
      } 
      break; 
     case KeyEvent.VK_LEFT: 
      if (myX > 30) { 
       myX -= 10; 
      } 
      break; 
     case KeyEvent.VK_RIGHT: 
      if (myX < 450) { 
       myX += 10; 
      } 
      break; 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     n = rand.nextInt(450) + 1; 
     n2 = rand.nextInt(450) + 1; 
     repaint(); 
    } 
} 
+0

Почему вы переопределяете 'repaint()' вместо 'paintComponent()'? – durron597

+0

@ durron597 Потому что таким образом я мог бы повторно использовать большинство кода OP. –

-1

Добавление следующих строк в начале вашего метода run(), на первой линии до цикла в то время, вероятно, делает то, что вы ищете:

TimerTask task = new TimerTask() {@ 
     Override 
     public void run() { 
      n = rand.nextInt(450) + 1; 
      n = 10 * (Math.round(n/10)); 
     } 
    }; 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(task, 0, 5 * 1000); 

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

+1

Извините, но это не очень хорошая идея. Вы не должны рекомендовать использовать java.util.Timer с Swing GUI, так как это создает риск создания кода, который * будет * запускать правила Swing для потоковой передачи. –

+1

См. Ответ Эллиотта Фриша, чтобы узнать, как использовать более подходящий таймер поворота. 1+ к нему. –

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