2016-05-22 4 views
-2

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

import javax.swing.Timer; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.Graphics; 
import java.awt.Color; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 

public class Game 
{ 
    public static void main(String args[]) throws Exception 
    { 
     JFrame f = new JFrame("Let's Play"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(1280, 720); 
     f.setLocation(300, 300); 
     f.setResizable(false); 

     //this part draws a ball that bounces around the screen 
     BallPanel ballPanel = new BallPanel() 
     { 
      // draw rectangles and arcs 

      public void paintComponent(Graphics g) 
      { 
      super.paintComponent(g); // call superclass's paintComponent 
      g.setColor(Color.red); 

      // check for boundaries 
      if (x < radius)   dx = Math.abs(dx); 
      if (x > getWidth() - radius) dx = -Math.abs(dx); 
      if (y < radius)   dy = Math.abs(dy); 
      if (y > getHeight() - radius) dy = -Math.abs(dy); 

      // adjust ball position 
      x += dx; 
      y += dy; 
      g.fillOval(x - radius, y - radius, radius*2, radius*2); 
      } 

     }; 
     ballPanel.setOpaque(false); 
     f.add(ballPanel); 

     //this part allows you to draw lines on the frame with your mouse 
     JPanel lineP = new JPanel() 
     { 
      Point pointStart = null; 
      Point pointEnd = null; 

      { 
       addMouseListener(new MouseAdapter() 
       { 
        public void mousePressed(MouseEvent me) 
        { 
         pointStart = me.getPoint(); 
        } 

        public void mouseReleased(MouseEvent me) 
        { 
         pointStart = null; 
        } 
       }); 
       addMouseMotionListener(new MouseMotionAdapter() 
       { 
        public void mouseMoved(MouseEvent me) 
        { 
         pointEnd = me.getPoint(); 
        } 

        public void mouseDragged(MouseEvent me) 
        { 
         pointEnd = me.getPoint(); 
         repaint(); 
        } 
       }); 
      } 
      public void paint(Graphics dline) 
      { 
       super.paint(dline); 
       if (pointStart != null) 
       { 
        dline.setColor(Color.RED); 
        dline.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y); 

       } 
      } 
     }; 
     lineP.setOpaque(false); //attempted to enable to see ball panel here 
     f.add(lineP); 
     f.setVisible(true); 
    } 
} 

class BallPanel extends JPanel implements ActionListener 
{ 
private int delay = 10; 
protected Timer timer; 

public int x = 30;  // x position 
public int y = 30;  // y position 
public int radius = 15; // ball radius 

public int dx = 10;  // increment amount (x coord) 
public int dy = 10;  // increment amount (y coord) 

public BallPanel() 
{ 
    timer = new Timer(delay, this); 
    timer.start();  // start the timer 
} 

public void actionPerformed(ActionEvent e) 
// will run when the timer fires 
{ 
    repaint(); 
    } 


} 
+0

Пожалуйста, проверьте этот [URL] (http://stackoverflow.com/help), будет полезно повысить качество контента –

ответ

2

У вас есть несколько вопросов, но главное в том, что вы используете компоненты GUI. У вас должен быть только один компонент JPanel, который делает чертеж, DrawingPanel, а не шаровую панель и линейную панель. Скорее Ball и Line должны быть логическими классами, а не классами GUI, и их отображение должно быть в одном единственном DrawingPanel.

Другие проблемы включают в себя:

  • Основной метод, который имеет слишком много кода. Большая часть этого кода должна быть загружена в мир ООП, где он принадлежит.
  • Классы компонентов GUI, которые также реализуют интерфейсы слушателя. Это дает классу слишком большую ответственность, что затрудняет отладку и обновление. Отделите эти проблемы.
  • Один из ваших классов переопределяет метод рисования, и этого следует избегать. Переопределить paintComponent.
  • Другой класс, который переопределяет paintComponent, имеет логику программы в paintComponent, и этого следует избегать, поскольку вы ограничены в управлении, когда или когда этот метод вызывается. Выведите логику из этого класса и в код прослушивания мыши или код цикла игры (Swing Timer).
Смежные вопросы