Rectangle Namen geben? Alternativen auch gerne gesehen.

Torquemada

Mitglied
Hallo ich habe einen Code für das Uraltgame Pong geschrieben und möchte nun, dass man anzeigen lassen kann, wie viele Punkte jeder hat. Wie kann ich also einen Text in ein Rectangle bringen? oder kann ich doch noch irgendwie eine JPanel o.ä. hier "reinschreiben"? Denn ich habe es versucht hab es aber nicht geschafft, da ein JPanel einzufügen.

Der Code:
Java:
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import javax.swing.*;

public final class Example extends JPanel implements Runnable, KeyListener, ActionListener{

   private static final long serialVersionUID = 1L;
   private static int SPEED = 125;
   
   JFrame frame;        //das Fenster
   Rectangle bat1;      //Spieler 1
   Rectangle bat2;      // Spieler 2
   Rectangle ball;      // der Ball
   
   int dx = SPEED; //Bewegungsänderung in x
   int dy = SPEED; //Bewegungsänderung in y
   long time = 0;
   
   public static void main(String[] args) throws IOException{

      new Example();
}
   
   public Example() throws IOException{
      
      frame = new JFrame("Flying Ball");
      frame.setSize(800,578);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(this);       
      
      bat1 = new Rectangle(370,30,60,10);
      bat2 = new Rectangle(370,511,60,10);
      ball = new Rectangle(200,200,10,10);
      
      bat1.toString();
      
      setBackground(Color.black);
      frame.addKeyListener(this);
      
      frame.setVisible(true);       
      time = System.nanoTime();
      
      Thread t = new Thread(this); 
      t.run();
    }

   public void run() {
   
      while(frame.isVisible()){ 
         
         moveBall();       
         checkCollision(); 
         
         try {
            Thread.sleep(26);  
         } catch (InterruptedException e) {}
         
         repaint();  //Repaint
      }
      
   }
   
   
   private void checkCollision(){
      
      if(bat1.intersects(ball)){  
         dy *= -1;                
      }
      if(bat2.intersects(ball)){  
         dy *= -1;                
      }
   }
   
   private void moveBall(){
       
      if(ball.x<0){
         dx = SPEED;
      }

      if(ball.x+ball.width >getWidth()){
         dx = -SPEED;
      }

      if(ball.y<0){
         dy = SPEED;
      }
      
      if(ball.y+ball.height>getHeight()){
         dy = -SPEED;
      }
      
          if(ball.y < 25) {
          System.out.println("Spieler 1 hat verloren!");
          System.out.println("Spieler 2 hat gewonnen! Glückwunsch!");
          ball.y = 300;
          ball.x = 400;
          dx = 0;
          dy = 0;
          bat1.setLocation(370, 30);
          bat2.setLocation(370, 511);
          System.out.println("Drücke 'r' um erneut zu spielen.");  
   }
          
          if(ball.y > 516) {
          System.out.println("Spieler 2 hat verloren!");
          System.out.println("Spieler 1 hat gewonnen! Glückwunsch!");
          ball.y = 300;
          ball.x = 400;
          dx = 0;
          dy = 0;
          bat1.setLocation(370, 30);
          bat2.setLocation(370, 511);
          System.out.println("Drücke 'e' um erneut zu spielen.");  
   }

      long delta = System.nanoTime() - time;  
      time = System.nanoTime();  
  		 
      ball.x += dx*(delta/1e9);
      ball.y += dy*(delta/1e9);


   }


   @Override
   protected void paintComponent(Graphics g) {
       
      super.paintComponent(g);
      
      g.setColor(Color.green);
      g.fillRect(bat1.x, bat1.y, bat1.width, bat1.height);
      
      g.setColor(Color.red);
      g.fillRect(bat2.x, bat2.y, bat2.width, bat2.height);
      
      g.setColor(Color.blue);
      g.fillOval(ball.x, ball.y, ball.width, ball.height);
      
   }


    @Override
    public void keyTyped(KeyEvent e) {
        
           if (e. getKeyChar()== 'd') {
           bat1.getLocation().getX();
           int a = (int) bat1.getLocation().getX();
           int b = a+10;
           if (a +30 > 750) {}
           else {
           bat1.setLocation(b, 30);
           } 
      } 
           
           if (e. getKeyChar()== 'a') {
           bat1.getLocation().getX();
           int a = (int) bat1.getLocation().getX();
           int b = a-10;
           if (a-10  < 0) {}
           else {
           bat1.setLocation(b, 30);
           }
        } 
           
           if (e. getKeyChar()== '4') {
           bat2.getLocation().getX();
           int a = (int) bat2.getLocation().getX();
           int b = a-10;
           if (a - 10 < 0) {}
           else {
           bat2.setLocation(b, 511);
           }
        } 
                      
           if (e. getKeyChar()== '6') {
           bat2.getLocation().getX();
           int a = (int) bat2.getLocation().getX();
           int b = a+10;
           if (a +30 > 750) {}
           else {
           bat2.setLocation(b, 511);   
           }
        } 
    }



    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyPressed(KeyEvent e) {
        
        if (e. getKeyChar() == 'r'){
          dx = 125;
          dy = 125;
        }
        if (e. getKeyChar() == 'e'){
          dx = -125;
          dy = -125;
        }
    }



}
 
eigenes Zeichnen + J-Komponenten besser nicht mischen in einem Panel,
du kannst natürlich oben einen Bereich strukturiert lassen und nur unten ein JPanel haben in welchem gezeichnet wird oder ähnliches

ansonsten ist das bisschen unverständlich, was genau verstehst du unter deinen 'Rectangle'?
du willst anscheinend Rahmen malen, aber diese brauchen doch keine Namen,
auch wenn Text darin erscheinen soll, ist das erstens wiederum was anderes als ein Name für Rectangle
und im einfachen Falle komplett unabhängig von diesen, male Text mit drawString an passender Position,
sicherlich abhängig von den Rectangles, aber komplett anderer Befehlt, mit drawString kannst du wie mit allen Befehlen malen wo du willst

gewiss bietet es sich an, etwas zu strukturieren, z.B. eine eigene Klasse für Rectangle + Text mit eigener paint-Methode,
so dass dort festgelegt wird wie die Befehle relativ zueinander auszuführen sind

statt
Java:
g.fillRect(bat1.x, bat1.y, bat1.width, bat1.height);
g.drawString(bat1.x+.., bat1.y+.., textB1);
dann etwa
Java:
ba1.maleAllesAnDuWeisstSchonWo(g);
 
Panel in das Frame packen:
Java:
import javax.swing.*;
import java.awt.*;

public class Test {
    private JFrame frame;
    private JPanel panel;
    private JLabel label;
    
    public Test() {
        frame = new JFrame();
        panel = new JPanel();
        label = new JLabel();
        
        panel.setBackground(Color.green);
        
        label.setText("Information");
        label.setSize(100, 35);
        panel.add(label, BorderLayout.CENTER);
        // Dein JFrame:
        frame.getContentPane().add(panel);
        panel.setBounds(50,300,100,35);
    }
}

Natürlich müssen die Position noch angepasst werden. Außerdem musst du den Text des Labels in deinem Listener entsprechend ändern. Zudem wäre es auch möglich das JLabel ohne einem JPanel dem JFrame hinzuzufügen.
 

Neue Themen


Zurück
Oben