2016-12-13 8 views
1

То, что я пытаюсь сделатьНевозможно использовать MouseEvents в главном

Создание игры Pong, где ось Y получает значение от моего курсора в соответствии с приложением

Что я пытался

private void pallet() { 
    ycur=(int)MouseInfo.getPointerInfo().getLocation().getY(); 
} 

Таким образом, я получаю значение Y в соответствии с моим монитором вместо приложения.

Я также пытался использовать MouseEvent.getY(), но получаю ошибку при попытке вызвать этот метод из основного.

private void pallet() { 
    ycur=(int)MouseInfo.getPointerInfo().getLocation().getY(); 
} 

Это как мой код выглядит следующим образом, я думаю, что проблема заключается в том, как я использую мои основные и методы, но я не уверен.

public class MyFirst extends JPanel { 

    public int x = 500, y = 300, border = 30; 
    public boolean goingDown = true; 
    public int ycur, cursor; 


    public void moveBall() { 
     x++; 
     if (goingDown == true) { 
      y++; 
     } else if (goingDown == false) { 
      y--; 
     } 

     if (y == getHeight() - border) { 
      goingDown = false; 
     } else if (y == 0) { 
      goingDown = true; 
     } 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.fillOval(x, y, 30, 30); 
     g.fillRect(30, ycur, 15, 100); 
    } 

    public static void main(String[] args) throws InterruptedException  { 
     JFrame frame = new JFrame("Pong"); 
     frame.pack(); 
     frame.setSize(1000, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 

     MyFirst game = new MyFirst(); 
     frame.add(game); 
     while (true) { 
      game.pallet(e); 
      game.moveBall(); 
      game.repaint(); 
      Thread.sleep(10); 
     } 
    } 

    public void pallet(MouseEvent e) { 
     ycur=e.getY(); 
    } 

} 
+0

При использовании им MouseEvent, я получаю сообщение об ошибке на game.pallet (е); в основном, говоря, что он не распознает «e». – creativename

+0

Правильно, поэтому ваша ошибка указана в этой строке: 'game.pallet (e);' потому что 'e' не определен нигде. – user123

+1

Swing управляется событиями, поэтому вместо этого уродливого бесконечного цикла используйте «MouseListener». – Paul

ответ

2

Проблемы с кодом:

  • Как уже упоминалось, вы сражаетесь против архитектуры, управляемой событиями Свинг. Вместо медленного цикла используйте прослушиватели, в том числе MouseMotionListener, и отслеживайте изменения в местоположении мыши, а ActionListener привязан к таймеру Swing для перемещения мяча.
  • Избегайте использования Thread.sleep(...) в Swing GUI, кроме как с большой осторожностью, так как это может привести ко всему приложению.
  • Избегайте излишней логики в основном методе. Этот метод должен быть коротким, должен создавать ключевые объекты, подключать их, устанавливать программу в движение и все.
  • Краска с методом paintComponent, а не метод окраски. Это приводит к более плавной анимации с двойной буферизацией.

Например:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class MoveBallTest extends JPanel{ 
    private static final int PREF_W = 1000; 
    private static final int PREF_H = 600; 
    private static final int TIMER_DELAY = 12; 
    private static final int SPRITE_WIDTH = 30; 
    private static final Color OVAL_SPRITE_COLOR = Color.RED; 
    private static final Color RECT_SPRITE_COLOR = Color.BLUE; 
    private static final int DELTAY_Y = 1; 
    private boolean goingDown = true; 
    private Timer timer = new Timer(TIMER_DELAY, this::timerActionPerformed); 
    private int ovalSpriteY; 
    private int rectSpriteY; 

    public MoveBallTest() { 
     timer.start(); 
     MyMouse myMouse = new MyMouse(); 
     addMouseMotionListener(myMouse); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(OVAL_SPRITE_COLOR); 
     g.fillOval(SPRITE_WIDTH, ovalSpriteY, SPRITE_WIDTH, SPRITE_WIDTH); 
     g.setColor(RECT_SPRITE_COLOR); 
     g.fillRect(SPRITE_WIDTH, rectSpriteY, SPRITE_WIDTH/2, SPRITE_WIDTH * 3); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    public void timerActionPerformed(ActionEvent e) { 
     if (ovalSpriteY <= 0) { 
      goingDown = true; 
     } else if (ovalSpriteY >= getHeight() - SPRITE_WIDTH) { 
      goingDown = false; 
     } 

     ovalSpriteY += goingDown ? DELTAY_Y : -DELTAY_Y; 
     repaint(); 
    } 

    private class MyMouse extends MouseAdapter { 
     @Override 
     public void mouseMoved(MouseEvent e) { 
      rectSpriteY = e.getY(); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("MoveBallTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new MoveBallTest()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

@creativename: http://stackoverflow.com/questions/798545/ то, что-это-заместитель ява-оператора востребованный и-что-делает-это делать –