2016-05-22 14 views
-2

Ich mache ein Spiel, in dem ein Benutzer Linien zeichnen muss, damit ein Ball in ein Ziel springt. Ich habe Probleme, sowohl den Ball als auch die Linie gleichzeitig erscheinen zu lassen, und ich kann nur den einen oder den anderen erscheinen lassen. Mir scheint, dass sich die Paneele gegenseitig blockieren, obwohl ich sie transparent gemacht habe. Ich möchte, dass sie beide auf demselben Bild erscheinen. Ab diesem Post deckt das Linienfeld die Kugel ab.Transparente Panels

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

Bitte überprüfen Sie diese [URL] (http://StackOverflow.com/Help) es wird nützlich sein, um die Qualität Ihrer Inhalte zu erhöhen –

Antwort

2

Sie haben einige Probleme bekommen, aber das wichtigste ist, dass Sie übertriebene Verwendung von GUI-Komponenten. Sie sollten nur eine einzige Komponente JPanel haben, die die Zeichnung ausführt, ein DrawingPanel und kein Ball-Panel und ein Line-Panel. Stattdessen sollten Ball und Line logische Klassen und keine GUI-Klassen sein, und ihre Anzeige sollte sich im selben einzelnen DrawingPanel befinden.

Weitere Themen:

  • Ein Hauptmethode, die viel zu viel Code. Der meiste Code sollte in die OOP-Welt ausgelagert werden, wo er hingehört.
  • GUI-Komponentenklassen, die auch Listener-Schnittstellen implementieren. Dies gibt der Klasse zu viel Verantwortung, was das Debuggen und Upgraden erschwert. Trennen Sie diese Bedenken.
  • Eine Ihrer Klassen überschreibt die Malmethode, und dies sollte vermieden werden. Überschreiben Sie paintComponent.
  • Die andere Klasse, die paintComponent überschreibt, hat Programmlogik in paintComponent, und dies sollte vermieden werden, da Sie nur begrenzte Kontrolle darüber haben, wann oder ob diese Methode aufgerufen wird. Holen Sie die Logik aus dieser Klasse und entweder in den Maus-Listener-Code oder in den Game-Loop-Code (Swing-Timer).