Pong Java Kollisionsabfrage Wie ?

sheel

I love Asm
Hi

Kommt ganz auf dein Programm drauf an :)

Machst du zB. was mit Swing irgendwie timerbasiert oder mit einer "echten"
Gameloop aufgebaut) oder irgendeinem spielespezifischen Framework?

Ist der Ball ein einzelner Pixelpunkt, Kreis... (oder genug in Klassen und Interfaces abstrahiert für "beliebig")?

Das selbe für die Schläger, einfache vertikale Linien oder...?
 

Lehni

Grünschnabel
Hier mal mein Code für besseres Verständnis

Das ist die Main:

Code:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;

public class PongMain {
   Timer tw = new Timer();
   Timer ts = new Timer();
   Timer tup = new Timer();
   Timer tdown = new Timer();
   Timer repaint = new Timer();
   public JFrame frmTheGameOf;
   public Integer wtiming = 0;
   public PongPanel panel = new PongPanel();
   Integer Ballrichtung = 0;
   Timer ball = new Timer();

   /**
    * Launch the application.
    */
   public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
       public void run() {
         try {
           PongMain window = new PongMain();
           window.frmTheGameOf.setVisible(true);
         } catch (Exception e) {
           e.printStackTrace();
         }
       }
     });
   }

   /**
    * Create the application.
    */
   public PongMain() {
     initialize();
   }

   /**
    * Initialize the contents of the frame.
    */
   private void initialize() {
     frmTheGameOf = new JFrame();
     frmTheGameOf.setTitle("The Game of Fucking PONG");
     frmTheGameOf.setResizable(false);
     frmTheGameOf.setBounds(100, 100, 806, 429);
     frmTheGameOf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frmTheGameOf.getContentPane().setLayout(null);
     frmTheGameOf.setFocusable(true);

     panel.setBounds(0, 0, 800, 400);
     frmTheGameOf.getContentPane().add(panel);

     KeyListener l = new KeyListener() {

       @Override
       public void keyTyped(KeyEvent e) {

       }

       @Override
       public void keyReleased(KeyEvent e) {
         if (e.getKeyChar() == 'w') {
           tw.cancel();
           tw = new Timer();
         }

         if (e.getKeyChar() == 's') {
           ts.cancel();
           ts = new Timer();
         }

         if (e.getKeyCode() == KeyEvent.VK_UP) {
           tup.cancel();
           tup = new Timer();
         }
         if (e.getKeyCode() == KeyEvent.VK_DOWN) {
           tdown.cancel();
           tdown = new Timer();
         }
       }

       @Override
       // Keyevents für die Panel
       public void keyPressed(KeyEvent e) {
         if (e.getKeyChar() == 'w') {
           tw.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {

               panel.Schlägerlup();

             };

           }, 0, 5);
         }

         if (e.getKeyChar() == 's') {
           ts.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {

               panel.Schlägerldown();

             };

           }, 0, 5);
         }

         if (e.getKeyCode() == KeyEvent.VK_UP) {
           tup.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {

               panel.Schlägerrup();

             };

           }, 0, 5);
         }
         if (e.getKeyCode() == KeyEvent.VK_DOWN) {
           tdown.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {

               panel.Schlägerrdown();

             };

           }, 0, 5);
         }

       }

     };
     frmTheGameOf.addKeyListener(l);
     // Timer für den repaint des Feldes
     repaint.scheduleAtFixedRate(new TimerTask() {

       @Override
       public void run() {

         panel.repaint();
         win();
       };

     }, 0, 10);
     // Timer für die Ballbewegung
     ball.scheduleAtFixedRate(new TimerTask() {

       @Override
       public void run() {
         if (panel.Bally >= panel.Schly && panel.Bally <= (panel.Schly + 50) && panel.Ballx < 30 || panel.Bally+20 >= panel.Schly && panel.Bally+20 <= (panel.Schly + 50) && panel.Ballx < 30) {
           Ballrichtung = 1;
           panel.Pingpongcounter++;
         }
         if (panel.Bally >= panel.Schry && panel.Bally <= (panel.Schry + 50) && panel.Ballx > 750 ||panel.Bally+20 >= panel.Schry && panel.Bally+20 <= (panel.Schry + 50) && panel.Ballx > 750) {
           Ballrichtung = 0;
           panel.Pingpongcounter++;
         }
         if (Ballrichtung == 0)
           panel.ballleft();
         if (Ballrichtung == 1)
           panel.ballright();

       };

     }, 0, 1);

   }

   // Methode um das Spielfeld zu reseten
   private void win() {
     if (panel.P1Punktestand == 9) {
       JOptionPane.showMessageDialog(frmTheGameOf, "Spieler 1 gewinnt");
       panel.P1Punktestand = 0;
       panel.P2Punktestand = 0;
       panel.Schly = 170;
       panel.Schry = 170;
       panel.Ballx = 390;
       panel.Bally = 170;
       panel.Pingpongcounter = 0;
     }
     if (panel.P2Punktestand == 9) {
       JOptionPane.showMessageDialog(frmTheGameOf, "Spieler 2 gewinnt");
       panel.P1Punktestand = 0;
       panel.P2Punktestand = 0;
       panel.Schly = 170;
       panel.Schry = 170;
       panel.Ballx = 390;
       panel.Bally = 170;
       panel.Pingpongcounter = 0;
     }
   }
}
Das ist die Panelklasse die von JPanel erbt , auf dem wird gezeichnet
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public class PongPanel extends JPanel {
   private Graphics2D g2;
   Integer P1Punktestand = 0, P2Punktestand = 0;
   Integer Schly = 170, Schry = 170;
   Integer wtiming = 0;
   Integer Ballx = 390;
   Integer Bally = 170;
   Integer Pingpongcounter = 0;

   /**
    * Generated serialVersionUID
    */
   private static final long serialVersionUID = -9192687157944784869L;

   // Erstellt das Jpanel zum zeichnen
   public PongPanel() {
     JPanel panel = new JPanel();
     panel.setBounds(0, 0, 800, 400);
     panel.setFocusable(true);
     panel.setBackground(Color.cyan);
   }

   // paint-Methode zum zeichnen der Komponenten
   protected void paintComponent(Graphics g) {

     g2 = (Graphics2D) g;

     neuzeichl();
     neuzeichr();
     neuzeichball();
     ballcheckout();
     PaintOUT();
     paintSchlägerR();
     paintSchlägerL();
     countpong();
     paintBall();
     midLine();
     PaintPunktStand();

   }

   // Methode um den Counter zu zeichnen
   private void countpong() {

     g2.setPaintMode();
     g2.setColor(Color.blue);
     g2.drawString("Pong`s: " + Pingpongcounter, 375, 395);
   }

   // Methode um den rechten Schläger zu zeichnen
   private void paintSchlägerR() {

     g2.setPaintMode();
     g2.setColor(Color.BLACK);
     g2.fillRect(770, Schry, 15, 50);
   }

   // Methode um den Ball zu zeichnen
   private void paintBall() {
     g2.setPaintMode();
     g2.setColor(Color.BLACK);
     g2.fillOval(Ballx, Bally, 20, 20);

   }

   // Methode um den linken Schläger zu zeichnen
   private void paintSchlägerL() {

     g2.setPaintMode();
     g2.setColor(Color.BLACK);
     g2.fillRect(15, Schly, 15, 50);

   }

   // Methode um das Outfield zu zeichnen
   private void PaintOUT() {
     g2.setPaintMode();
     g2.setColor(Color.GRAY);
     g2.fillRect(0, 0, 15, 400);
     g2.fillRect(785, 0, 15, 400);
     g2.setColor(Color.lightGray);
     g2.fillRect(15, 0, 15, 400);
     g2.fillRect(770, 0, 15, 400);
   }

   // Methode um die Mittellinie zu zeichnen
   private void midLine() {
     g2.setPaintMode();
     g2.setColor(Color.ORANGE);
     g2.drawLine(400, 0, 400, 400);

   }

   // Methode um den Punktestand zu zeichnen
   private void PaintPunktStand() {
     g2.setPaintMode();
     g2.setColor(Color.red);
     g2.drawString(P1Punktestand + ":" + P2Punktestand, 392, 20);
   }

   // Methode um den linken Schläger zu neutralisieren
   public void neuzeichl() {
     g2.setPaintMode();
     g2.setColor(this.getBackground());
     g2.fillRect(15, 0, 15, 400);
   }

   // Methode um den rechten Schläger zu neutralisieren

   public void neuzeichr() {
     g2.setPaintMode();
     g2.setColor(this.getBackground());
     g2.fillRect(770, 0, 15, 400);
   }

   // Methode um den Ball zu neutralisieren

   public void neuzeichball() {
     g2.setPaintMode();
     g2.setColor(this.getBackground());
     g2.fillRect(30, 0, 740, 400);
   }

   // Methode um den linken Schläger nach oben zu verschieben
   public void Schlägerlup() {

     if (Schly > 0) {
       Schly--;
       Schly--;
       Schly--;
       Schly--;
       Schly--;
     }

   }

   // Methode um den linken Schläger nach unten zu verschieben
   public void Schlägerldown() {

     if (Schly < 350) {
       Schly++;
       Schly++;
       Schly++;
       Schly++;
       Schly++;
     }

   }

   // Methode um den rechten Schläger nach unten zu verschieben
   public void Schlägerrdown() {

     if (Schry < 350) {
       Schry++;
       Schry++;
       Schry++;
       Schry++;
       Schry++;
     }

   }

   // Methode um den rechten Schläger nach oben zu verschieben
   public void Schlägerrup() {

     if (Schry > 0) {
       Schry--;
       Schry--;
       Schry--;
       Schry--;
       Schry--;
     }
   }

   // Methode um den Ball nach links zu verschieben
   public void ballleft() {
     Ballx--;

   }

   // Methode um den Ball nach rechts zu verschieben
   public void ballright() {
     Ballx++;

   }

   // Methode um zu checken ob ein Punkt fällt
   public void ballcheckout() {
     if ((Ballx < 29) || (Ballx > 771)) {
       if (Ballx > 400) {
         Pingpongcounter = 0;
         P1Punktestand++;
       }

       if (Ballx < 400) {
         Pingpongcounter = 0;
         P2Punktestand++;
       }
       Ballx = 390;
       Bally = 170;
     }
   }

}
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

nein, nicht wirklich ..... :mad::(

Java-Tags sehen so aus (jeweils ohen die Blanks vor und nach den Klammern !) :
[ code=JAVA ] test [ /code ]

Gruß Klaus
 

Lehni

Grünschnabel
Main
Java:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;

public class PongMain {
   Timer tw = new Timer();
   Timer ts = new Timer();
   Timer tup = new Timer();
   Timer tdown = new Timer();
   Timer repaint = new Timer();
   public JFrame frmTheGameOf;
   public Integer wtiming = 0;
   public PongPanel panel = new PongPanel();
   Integer Ballrichtung = 0;
   Timer ball = new Timer();

   /**
    * Launch the application.
    */
   public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
       public void run() {
         try {
           PongMain window = new PongMain();
           window.frmTheGameOf.setVisible(true);
         } catch (Exception e) {
           e.printStackTrace();
         }
       }
     });
   }

   /**
    * Create the application.
    */
   public PongMain() {
     initialize();
   }

   /**
    * Initialize the contents of the frame.
    */
   private void initialize() {
     frmTheGameOf = new JFrame();
     frmTheGameOf.setTitle("The Game of Fucking PONG");
     frmTheGameOf.setResizable(false);
     frmTheGameOf.setBounds(100, 100, 806, 429);
     frmTheGameOf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frmTheGameOf.getContentPane().setLayout(null);
     frmTheGameOf.setFocusable(true);

     panel.setBounds(0, 0, 800, 400);
     frmTheGameOf.getContentPane().add(panel);

     KeyListener l = new KeyListener() {

       @Override
       public void keyTyped(KeyEvent e) {

       }

       @Override
       public void keyReleased(KeyEvent e) {
         if (e.getKeyChar() == 'w') {
           tw.cancel();
           tw = new Timer();
         }

         if (e.getKeyChar() == 's') {
           ts.cancel();
           ts = new Timer();
         }

         if (e.getKeyCode() == KeyEvent.VK_UP) {
           tup.cancel();
           tup = new Timer();
         }
         if (e.getKeyCode() == KeyEvent.VK_DOWN) {
           tdown.cancel();
           tdown = new Timer();
         }
       }

       @Override
       // Keyevents für die Panel
       public void keyPressed(KeyEvent e) {
         if (e.getKeyChar() == 'w') {
           tw.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {

               panel.Schlägerlup();

             };

           }, 0, 5);
         }

         if (e.getKeyChar() == 's') {
           ts.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {

               panel.Schlägerldown();

             };

           }, 0, 5);
         }

         if (e.getKeyCode() == KeyEvent.VK_UP) {
           tup.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {

               panel.Schlägerrup();

             };

           }, 0, 5);
         }
         if (e.getKeyCode() == KeyEvent.VK_DOWN) {
           tdown.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {

               panel.Schlägerrdown();

             };

           }, 0, 5);
         }

       }

     };
     frmTheGameOf.addKeyListener(l);
     // Timer für den repaint des Feldes
     repaint.scheduleAtFixedRate(new TimerTask() {

       @Override
       public void run() {

         panel.repaint();
         win();
       };

     }, 0, 10);
     // Timer für die Ballbewegung
     ball.scheduleAtFixedRate(new TimerTask() {

       @Override
       public void run() {
         if (panel.Bally >= panel.Schly && panel.Bally <= (panel.Schly + 50) && panel.Ballx < 30 || panel.Bally+20 >= panel.Schly && panel.Bally+20 <= (panel.Schly + 50) && panel.Ballx < 30) {
           Ballrichtung = 1;
           panel.Pingpongcounter++;
         }
         if (panel.Bally >= panel.Schry && panel.Bally <= (panel.Schry + 50) && panel.Ballx > 750 ||panel.Bally+20 >= panel.Schry && panel.Bally+20 <= (panel.Schry + 50) && panel.Ballx > 750) {
           Ballrichtung = 0;
           panel.Pingpongcounter++;
         }
         if (Ballrichtung == 0)
           
           panel.ballright();
         if (Ballrichtung == 1)
           panel.ballright();

       };

     }, 0, 1);

   }

   // Methode um das Spielfeld zu reseten
   private void win() {
     if (panel.P1Punktestand == 9) {
       JOptionPane.showMessageDialog(frmTheGameOf, "Spieler 1 gewinnt");
       panel.P1Punktestand = 0;
       panel.P2Punktestand = 0;
       panel.Schly = 170;
       panel.Schry = 170;
       panel.Ballx = 390;
       panel.Bally = 170;
       panel.Pingpongcounter = 0;
     }
     if (panel.P2Punktestand == 9) {
       JOptionPane.showMessageDialog(frmTheGameOf, "Spieler 2 gewinnt");
       panel.P1Punktestand = 0;
       panel.P2Punktestand = 0;
       panel.Schly = 170;
       panel.Schry = 170;
       panel.Ballx = 390;
       panel.Bally = 170;
       panel.Pingpongcounter = 0;
     }
   }
}
PongPanel
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public class PongPanel extends JPanel {
   private Graphics2D g2;
   Integer P1Punktestand = 0, P2Punktestand = 0;
   Integer Schly = 170, Schry = 170;
   Integer wtiming = 0;
   Integer Ballx = 390;
   Integer Bally = 170;
   Integer Pingpongcounter = 0;
   Integer Ballwinkel = 30;

   /**
    * Generated serialVersionUID
    */
   private static final long serialVersionUID = -9192687157944784869L;

   // Erstellt das Jpanel zum zeichnen
   public PongPanel() {
     JPanel panel = new JPanel();
     panel.setBounds(0, 0, 800, 400);
     panel.setFocusable(true);
     panel.setBackground(Color.cyan);
   }

   // paint-Methode zum zeichnen der Komponenten
   protected void paintComponent(Graphics g) {

     g2 = (Graphics2D) g;

     neuzeichl();
     neuzeichr();
     neuzeichball();
     ballcheckout();
     PaintOUT();
     paintSchlägerR();
     paintSchlägerL();
     countpong();
     paintBall();
     midLine();
     PaintPunktStand();

   }

   // Methode um den Counter zu zeichnen
   private void countpong() {

     g2.setPaintMode();
     g2.setColor(Color.blue);
     g2.drawString("Pong`s: " + Pingpongcounter, 375, 395);
   }

   // Methode um den rechten Schläger zu zeichnen
   private void paintSchlägerR() {

     g2.setPaintMode();
     g2.setColor(Color.BLACK);
     g2.fillRect(770, Schry, 15, 50);
   }

   // Methode um den Ball zu zeichnen
   private void paintBall() {
     g2.setPaintMode();
     g2.setColor(Color.BLACK);
     g2.fillOval(Ballx, Bally, 20, 20);

   }

   // Methode um den linken Schläger zu zeichnen
   private void paintSchlägerL() {

     g2.setPaintMode();
     g2.setColor(Color.BLACK);
     g2.fillRect(15, Schly, 15, 50);

   }

   // Methode um das Outfield zu zeichnen
   private void PaintOUT() {
     g2.setPaintMode();
     g2.setColor(Color.GRAY);
     g2.fillRect(0, 0, 15, 400);
     g2.fillRect(785, 0, 15, 400);
     g2.setColor(Color.lightGray);
     g2.fillRect(15, 0, 15, 400);
     g2.fillRect(770, 0, 15, 400);
   }

   // Methode um die Mittellinie zu zeichnen
   private void midLine() {
     g2.setPaintMode();
     g2.setColor(Color.ORANGE);
     g2.drawLine(400, 0, 400, 400);

   }

   // Methode um den Punktestand zu zeichnen
   private void PaintPunktStand() {
     g2.setPaintMode();
     g2.setColor(Color.red);
     g2.drawString(P1Punktestand + ":" + P2Punktestand, 392, 20);
   }

   // Methode um den linken Schläger zu neutralisieren
   public void neuzeichl() {
     g2.setPaintMode();
     g2.setColor(this.getBackground());
     g2.fillRect(15, 0, 15, 400);
   }

   // Methode um den rechten Schläger zu neutralisieren

   public void neuzeichr() {
     g2.setPaintMode();
     g2.setColor(this.getBackground());
     g2.fillRect(770, 0, 15, 400);
   }

   // Methode um den Ball zu neutralisieren

   public void neuzeichball() {
     g2.setPaintMode();
     g2.setColor(this.getBackground());
     g2.fillRect(30, 0, 740, 400);
   }

   // Methode um den linken Schläger nach oben zu verschieben
   public void Schlägerlup() {

     if (Schly > 0) {
       Schly--;
       Schly--;
       Schly--;
       Schly--;
       Schly--;
     }

   }

   // Methode um den linken Schläger nach unten zu verschieben
   public void Schlägerldown() {

     if (Schly < 350) {
       Schly++;
       Schly++;
       Schly++;
       Schly++;
       Schly++;
     }

   }

   // Methode um den rechten Schläger nach unten zu verschieben
   public void Schlägerrdown() {

     if (Schry < 350) {
       Schry++;
       Schry++;
       Schry++;
       Schry++;
       Schry++;
     }

   }

   // Methode um den rechten Schläger nach oben zu verschieben
   public void Schlägerrup() {

     
     if (Schry > 0) {
       Schry--;
       Schry--;
       Schry--;
       Schry--;
       Schry--;
     }
   }

   // Methode um den Ball nach links zu verschieben
   public void ballleft() {
     Ballx--;

   }

   // Methode um den Ball nach rechts zu verschieben
   public void ballright() {
     Ballx++;

   }

   // Methode um zu checken ob ein Punkt fällt
   public void ballcheckout() {
     if ((Ballx < 29) || (Ballx > 771)) {
       if (Ballx > 400) {
         Pingpongcounter = 0;
         P1Punktestand++;
       }

       if (Ballx < 400) {
         Pingpongcounter = 0;
         P2Punktestand++;
       }
       Ballx = 390;
       Bally = 170;
     }
   }

}
 

sheel

I love Asm
Was ist eigentlich noch einmal das Problem?
Ich seh nämlich schon Kollisionsabfragen (für den Ball gegen Schläger)

Sonstiges:
Push-Beitrag gelöscht.
Und ist es denn so schwer, drei Fragen in je einem kurzen Satz zu beantworten,
ohne dass wir uns durch ca. 430 umständlich geschriebene Codezeilen durcharbeiten müssen?
 
Zuletzt bearbeitet: