Probleme bei Pong

Diskutiere Probleme bei Pong im Spiele- und Multimedia-Programmierung Forum; Hallo, Ich habe neulich ein Pong Spiel programmiert. Das Problem liegt beim Abprallen des Balls vom Schläger, der Ball prallt relativ häufig ab,...

  1. Java xyrse123
    Java xyrse123 Neues Mitglied
    Hallo,
    Ich habe neulich ein Pong Spiel programmiert. Das Problem liegt beim Abprallen des Balls vom Schläger, der Ball prallt relativ häufig ab, doch ab und zu geht er einfach durch den Schläger durch. Ich wäre für jede Hilfe dankbar.
     
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. mrBrown
    mrBrown Bekanntes Mitglied
    Das Problem liegt in Zeile 46 (grob geraten).
     
    JuKu, VfL_Freak und Robat gefällt das.
  4. Java xyrse123
    Java xyrse123 Neues Mitglied
    Hier der Code:
    Code (Java):
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;

    public class Pong extends JPanel {
        // {
        int x = 30, y = 300;// Schläger 1
        int Px = 200, Py = 200; // Ball
        int x2 = 770, y2 = 300; // Schläger 2
        int dPx = 10, dPy = 10; // Geschwindigkeiz Ball
        boolean Spieler1o = false; // oben
        boolean Spieler1u = false; // unten
        boolean Spieler2o = false;
        boolean Spieler2u = false;

        public Pong() {
            setPreferredSize(new Dimension(800, 600));

            Ball neu = new Ball();
            neu.start();
            Schläger s = new Schläger();
            s.start();
        }

        public void paint(Graphics gr) { // beiden Schläger und Ball
            Graphics2D g = (Graphics2D) gr; // werden gezeichnet
            g.setColor(Color.WHITE);
            g.fill(g.getClipBounds());
            g.setColor(Color.BLACK);
            g.fillRect(x, y, 10, 80);
            g.fillOval(Px, Py, 30, 30);
            g.fillRect(x2, y2, 10, 80);
        }

        public void PositionSchläger1() { // AnfangsPosition
            x = 30;
            y = 300;
            repaint();
        }

        public void PositionBall() { // AnfangsPosition
            Px = 200;
            Py = 200;
            repaint();

        }

        public void PositionSchläger2() {
            x2 = 760;
            y2 = 300;
            repaint();
        }

        class Ball extends Thread {
            void bewegen() {
                Px = Px + dPx; //
                Py = Py + dPy;

                if (Px < 0) { // 30
                    Px = 0;
                    dPx = -dPx;
                }
                if (Py < 0) { // 30
                    Py = 0;
                    dPy = -dPy;
                }
                if (Py > 570) {
                    Py = 570;
                    dPy = -dPy;
                }
                if (Px > 770) {
                    Px = 770;
                    dPx = -dPx;
                }

                if (Px == 40 && Py >= y && Py <= y + 80) { // getY //80 //Py
                    Px = 40;

                    dPx = -dPx;

                    dPy = -dPy;
                }

                if (Px == 740 && Py >= y2 && Py <= y2 + 80) {// && Px>=y2 && Px<=
                                                                // y2+80)
                    Px = 740;
                    dPx = -dPx;
                    dPy = -dPy;
                }
                repaint();
            }

            public void run() { // Thread für Ball

                while (!isInterrupted()) {

                    bewegen();
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        return;
                    }
                }
            }
        }

        class Schläger extends Thread implements KeyListener {
            Schläger() {
                addKeyListener(this);
            }

            public void run() {

                while (true) {
                    if (Spieler1o == true) {
                        y -= 12;
                    }
                    if (Spieler1u == true) {
                        y += 12;
                    }
                    if (Spieler2o == true) {
                        y2 -= 12;
                    }
                    if (Spieler2u == true) {
                        y2 += 12;
                    }
                    if (y2 > 520) { // 600-80 wegen Schlägerlänge
                        y2 = 520;
                    }
                    if (y2 < 0) {
                        y2 = 0;
                    }
                    if (y < 0) {
                        y = 0;
                    }
                    if (y > 520) {
                        y = 520;
                    }
                    repaint();
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

            public void keyPressed(KeyEvent e) { // Spieler 1
                if (e.getKeyCode() == KeyEvent.VK_W) {
                    Spieler1o = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_S) {
                    Spieler1u = true;
                }
                if (y > 520) { // 600-80 wegen Schlägerlänge
                    y = 520;
                }
                if (y < 0) {
                    y = 0;
                }
                if (e.getKeyCode() == KeyEvent.VK_UP) { // Spieler2
                    Spieler2o = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    Spieler2u = true;
                }
            }

            public void keyReleased(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_W) {
                    Spieler1o = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_S) {
                    Spieler1u = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_UP) {
                    Spieler2o = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    Spieler2u = false;
                }
            }

            public void keyTyped(KeyEvent e) {
            }
        }
    }
    und die Hauptklasse:
    Code (Java):
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;

    public class Fenster extends JFrame {
      private Pong pong = new Pong();

      public Fenster() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(pong);

        pong.PositionBall();
        pack();
        getRootPane();setVisible(true);

        pong.PositionSchläger2();
        pong.PositionSchläger1();
        pong.setFocusable(true);

      }

      public static void main(String[] args) {
        new Fenster();

      }
    }
     
    Zuletzt von einem Moderator bearbeitet: 13. Nov. 2017
  5. VfL_Freak
    VfL_Freak Bekanntes Mitglied
    Moin,

    (a) nutze bitte die Code-Tags - so bekommt man ja Augenkrebs !!
    (b) wie wäre es mit ein paar Kommentaren, in den Du an geeigenten Stellen beschreibst, was der Code tun soll ...

    VG Klaus
     
  6. Java xyrse123
    Java xyrse123 Neues Mitglied
    Hallo,
    Ich denke das manchmal die Koordinaten vom Schläger falsch bestimmt werden und deswegen der Ball manchmal durchgeht.
    Wie kann ich den noch Kommentare hinzuzufügen?
    VG Linus
     
  7. truesoul
    truesoul Aktives Mitglied
    Er meint in deinem Code.

    Code (Java):
    /**
    * Ein Kommentar
    */


    public void eineMethode(){...}
     
  8. Java xyrse123
    Java xyrse123 Neues Mitglied
    Hier noch einmal der Hauptteil mit mehr Kommentaren, hoffe es reicht so.

    Code (Java):

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;

    public class Pong extends JPanel {
       
         int x = 30, y = 300; // Anfangskoordinaten Schläger 1
         int Px = 200, Py = 200; //Anfangskoordinaten Ball
         int x2 = 770, y2 = 300; //Anfangskoordinaten Schläger 2
         int dPx = 10, dPy = 10; // Geschwindigkeit Ball
         boolean Spieler1o = false; // Pfeiltaste oben am Anfang Taste nicht gedrückt
         boolean Spieler1u = false; // Pfeiltast unten
         boolean Spieler2o = false;
         boolean Spieler2u = false;

         public Pong() {
             setPreferredSize(new Dimension(800, 600)); // Fenstergröße

             Ball neu = new Ball();
             neu.start(); // Thraed Ball wird gestartet
             Schläger s = new Schläger(); // Thread Schläger wird gestartet
             s.start();
         }

         public void paint(Graphics gr) { // beiden Schläger und Ball
             Graphics2D g = (Graphics2D) gr; // werden gezeichnet
             g.setColor(Color.WHITE);
             g.fill(g.getClipBounds()); // damit die Zeichnung überschrieben wird
             g.setColor(Color.BLACK);
             g.fillRect(x, y, 10, 80); // Ball und Schläger werden gezeichnet
             g.fillOval(Px, Py, 30, 30);
             g.fillRect(x2, y2, 10, 80);
         }

         public void PositionSchläger1() { // wird auf AnfangsPosition gesetzt
             x = 30;
             y = 300;
             repaint();
         }

         public void PositionBall() { // AnfangsPosition
             Px = 200;
             Py = 200;
             repaint();

         }

         public void PositionSchläger2() // Anfangsposition{
             x2 = 760;
             y2 = 300;
             repaint();
         }

         class Ball extends Thread { // thread für Ball
             void bewegen() {
                 Px = Px + dPx; //die Bewegung
                 Py = Py + dPy;

                 if (Px < 0) { // Ball prallt von der Wand ab
                     Px = 0;
                     dPx = -dPx;
                 }
                 if (Py < 0) {  // Ball prallt von der Wand ab
                     Py = 0;
                     dPy = -dPy;
                 }
                 if (Py > 570) { // Ball prallt von der Wand ab
                     Py = 570;
                     dPy = -dPy;
                 }
                 if (Px > 770) { // Ball prallt von der Wand ab
                     Px = 770;
                     dPx = -dPx;
                 }

                 if (Px == 40 && Py >= y && Py <= y + 80) { // Hier soll er vom Schläger1 abprallen
                     Px = 40;
                     dPx = -dPx;                
                 }

                 if (Px == 740 && Py >= y2 && Py <= y2 + 80) {//// Hier soll er vom Schläger2 abprallen
                                                               
                     Px = 740;
                     dPx = -dPx;
                     dPy = -dPy;
                 }
                 repaint();
             }

             public void run() { // Thread für Ball

                 while (!isInterrupted()) {

                     bewegen();
                     try {
                         Thread.sleep(50);
                     } catch (InterruptedException e) {
                         return;
                     }
                 }
             }
         }

         class Schläger extends Thread implements KeyListener {
             Schläger() {
                 addKeyListener(this); // KeyListenr wird hinzugefügt
             }

             public void run() {

                 while (true) { // solange Spieler Taste drückt
                                     //wird Schläger bewegt
                   if (Spieler1o == true) { // Bewegung Schläger1
                         y -= 12;
                     }
                     if (Spieler1u == true) {
                         y += 12;
                     }
                     if (Spieler2o == true) { // Bewegung Schläger2
                         y2 -= 12;
                     }
                     if (Spieler2u == true) {
                         y2 += 12;
                     }
                   
                       if (y2 > 520) { // 600-80 wegen Schlägerlänge
                         y2 = 520; // Damit die Schläger nicht aus dem Bild verschwinden
                     }
                     if (y2 < 0) {
                         y2 = 0;
                     }
                     if (y < 0) {
                         y = 0;
                     }
                     if (y > 520) {
                         y = 520;
                     }
                     repaint();
                     try {
                         Thread.sleep(50);
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }
             }

             public void keyPressed(KeyEvent e) { // Spieler 1 hier wird geguckt ob Taste gedrückt
                 if (e.getKeyCode() == KeyEvent.VK_W) {
                     Spieler1o = true;
                 }
                 if (e.getKeyCode() == KeyEvent.VK_S) {
                     Spieler1u = true;
                 }
               
                 if (e.getKeyCode() == KeyEvent.VK_UP) { // Spieler2 hier wird geguckt ob Taste gedrückt
                     Spieler2o = true;
                 }
                 if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                     Spieler2u = true;
                 }
             }

             public void keyReleased(KeyEvent e) { // Hier ob Taste wieder losgelassen
                 // wenn ja stoppt Schlägerbewegung
               if (e.getKeyCode() == KeyEvent.VK_W) {
                     Spieler1o = false;
                 }
                 if (e.getKeyCode() == KeyEvent.VK_S) {
                     Spieler1u = false;
                 }
                 if (e.getKeyCode() == KeyEvent.VK_UP) {
                     Spieler2o = false;
                 }
                 if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                     Spieler2u = false;
                 }
             }

             public void keyTyped(KeyEvent e) {
             }
         }
    }
    VG

    Linus
     
  9. Java xyrse123
    Java xyrse123 Neues Mitglied
    Kann allen nur die Entwickler -Ecke emfehlen dort bekommt wesentlich schneller Hilfe und gute Tipps.
     
  10. mrBrown
    mrBrown Bekanntes Mitglied
    Mit einer sinnvollen Frage bekommt man auch hier schnelle Hilfe und gute Tipps ;)

    Den relevanten Tipp hast du ja dort schon bekommen, der Ball kann "in deinem Schläger" bzw hinter deinem Schläger landen - wahrscheinlich ist das das Problem

    EDIT: hast du bedacht, das der gezeichnete Ball und der gezeichnete Schläger eine Größe haben, der Code diese aber nicht immer passend berücksichtigst?
     
    Zuletzt bearbeitet: 13. Nov. 2017
  11. JuKu
    JuKu Mitglied
    Was genau willst du uns damit sagen?
    Und wo finde ich denn diese Ecke? :D
     
Die Seite wird geladen...

Probleme bei Pong - Ähnliche Themen

Pong - Probleme mit übergreifenden Objekten && Graphics2D
Pong - Probleme mit übergreifenden Objekten && Graphics2D im Forum AWT, Swing, JavaFX & SWT
Java Pong Probleme
Java Pong Probleme im Forum Spiele- und Multimedia-Programmierung
Probleme Bei Pong Programmierung
Probleme Bei Pong Programmierung im Forum Spiele- und Multimedia-Programmierung
Pong - noch 2 kleinere Probleme
Pong - noch 2 kleinere Probleme im Forum Spiele- und Multimedia-Programmierung
ObjectInputStream ->ReadObject Probleme
ObjectInputStream ->ReadObject Probleme im Forum Java Basics - Anfänger-Themen
Thema: Probleme bei Pong