2017-12-05 7 views
-3

Ich kodiere ein primitives Pong-Spiel und habe es so programmiert, dass der Ball von der linken Seite des Bildschirms zur Mitte geht des Bildschirms und bewegt sich in einem zufälligen directton. Jedoch nach dem Ball beginnen bleibt immer in der Mitte und bewegt sich nie (trotz der Tatsache, X-Koordinate des Balls ist nicht weniger als 0 beim Start.)Mein Ball bewegt sich nicht und bleibt in der Mitte, obwohl er sich bewegen sollte.

import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.awt.Color; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Pong extends JPanel 
{ 
    private static final int FRAME_WIDTH = 400; 
    private static final Color BACKGROUND = new Color(204, 204, 204); 
    private static final Color BALL_COLOR = Color.BLACK; 
    private static final Color PRIZE_COLOR = Color.BLACK; 
    private static final int BALL_DIAM = 50; 
    private static final int PRIZE_DIAM = 25; 
    private static final int PRIZE_SHIFT = 10; 
    private BufferedImage myImage; 
    private Graphics myBuffer; 
    private Ball ball; 
    private int score1; 
    private int score2; 
    private Polkadot prize; 
    private Bumper bumper; 
    private Bumper bumper2; 
    private Timer t; 
    private int hits; 

    public Pong() 
    { 
    myImage = new BufferedImage(400, 400, 1); 
    myBuffer = this.myImage.getGraphics(); 
    myBuffer.setColor(BACKGROUND); 
    myBuffer.fillRect(0, 0, 400, 400); 

    ball = new Ball(0, 0, 35, BALL_COLOR); 
    ball.jump(400, 400); 

    prize = new Polkadot(0, 0, 25, PRIZE_COLOR); 
    prize.jump(400, 400); 
    bumper = new Bumper(380,70,50,100,Color.RED); 

    bumper2 = new Bumper(30,70,50,100,Color.BLUE); 

    hits = 0; 

    t = new Timer(5, new Listener()); 
    t.start(); 

    addMouseListener(new Mouse()); 

    addKeyListener(new Key()); 
    setFocusable(true); 
    } 

    public void paintComponent(Graphics g) 
    { 
    g.drawImage(myImage, 0, 0, getWidth(), getHeight(), null); 
    } 

    private class Mouse extends MouseAdapter 
    { 
    private Mouse() {} 

    public void mousePressed(MouseEvent e) 
    { 
     if (e.isMetaDown()) 
     { 
     ball.setX(e.getX()); 
     ball.setY(e.getY()); 
     } 
     else if (e.isShiftDown()) 
     { 
     ball.setdx((int)(Math.random() * 11.0D - 6.0D)); 
     ball.setdy((int)(Math.random() * 11.0D - 6.0D)); 
     } 
     else 
     { 
     prize.setX(e.getX()); 
     prize.setY(e.getY()); 
     } 
    } 
    } 

    private class Key extends KeyAdapter 
    { 
    private Key() {} 

    public void keyPressed(KeyEvent e) 
    { 
     if ((e.getKeyCode() == 38) && (bumper.getY() > 0)) { 
     bumper.setY(bumper.getY() - 10); 
     } else if ((e.getKeyCode() == 40) && (bumper.getY() < 438)) { 
     bumper.setY(bumper.getY() + 10); 
     } else if ((e.getKeyCode() == 87) && (bumper2.getY() > 0)) { 
     bumper2.setY(bumper2.getY() - 10); 
     } else if ((e.getKeyCode() == 83) && (bumper2.getY() < 438)) { 
     bumper2.setY(bumper2.getY() + 10); 
     } 
    } 
    } 

    private class Listener implements ActionListener 
    { 
    private Listener() {} 

    public void actionPerformed(ActionEvent e) 
    { 
     myBuffer.setColor(BACKGROUND); 
     myBuffer.fillRect(0, 0, 400, 400); 

     ball.move(400, 400); 
     collide(ball, prize); 
     BumperCollision.collide(bumper,ball); 
     BumperCollision.collide(bumper2,ball); 

     ball.draw(myBuffer); 
     prize.draw(myBuffer); 
     bumper.draw(myBuffer); 
     bumper2.draw(myBuffer); 
     myBuffer.setColor(Color.red); 
     myBuffer.setFont(new Font("Comic Sans MS", 1, 24)); 
     myBuffer.drawString("Count: " + score1, 100, 25); 
     if(score1 >= 10) 
     myBuffer.drawString("This man is the Legend27", 50, 102); 
     if(score2 >= 10) 
     myBuffer.drawString("The other man might be the legend27", 160, 102); 
     if(ball.getX() < -100) 
     score1++; 
     ball.setX(208); 
     ball.setY(50); 
     ball.setdx(20); 

     repaint(); 
    } 
    } 

    public void collide(Ball b, Polkadot p) 
    { 
    double dist = distance(b.getX(), b.getY(), p.getX(), p.getY()); 
    if (dist < 37.0D) 
    { 
     hits += 1; 

     p.jump(400, 400); 
    } 
    } 

    private double distance(double x1, double y1, double x2, double y2) 
    { 
    return Math.sqrt(Math.pow(x1 - x2, 2.0D) + Math.pow(y1 - y2, 2.0D)); 
    } 
} 

Ball:

//Name:    Date: 
    import java.awt.*; 
    public class Ball extends Polkadot 
    { 
     private double dx;  // pixels to move each time step() is called. 
     private double dy; 
    // constructors 
     public Ball()   //default constructor 
     { 
     super(200, 200, 50, Color.BLACK); 
     dx = Math.random() * 12 - 6;   // to move vertically 
     dy = Math.random() * 12 - 6;   // to move sideways 
     } 
     public Ball(double x, double y, double dia, Color c) 
     { 
     super(x, y, dia, c); 
     dx = Math.random()* 12 - 6; 
     dy = Math.random() * 12 - 6; 
     } 

    //modifier methods 
     public void setdx(double x)   
     { 
     dx = x; 
     } 
     public void setdy(double y) 
     { 
     dy = y; 
     } 

     //accessor methods 
     public double getdx()    
     { 
     return dx; 
     } 
     public double getdy() 
     { 
     return dy; 
     } 

    //instance methods 
     public void move(double rightEdge, double bottomEdge) 
     { 
     setX(getX()+ dx);  // move vert. 
     setY(getY()+ dy);  

     if(getX() >= rightEdge - getRadius()) 
     { 
      setX(rightEdge - getRadius()); 
      dx = dx * -1; 
     } 
     else if(getX() <= getRadius()) 
     { 
      setX(getRadius()); 
      dx = dx * -1; 
     } 
     if(getY() >= bottomEdge - getRadius()) 
     { 
      setY(bottomEdge - getRadius()); 
      dy = dy * -1; 
     } 
     else if (getY() <= getRadius()) 
     { 
      setY(getRadius()); 
      dy = dy * -1; 
     } 
    } 
    } 
+0

was genau haben bisher versucht, den Code zu debuggen? –

+1

Es wird viel einfacher sein, Ihre Frage zu beantworten, wenn Sie minimal vollständigen Code zur Verfügung stellen - gerade genug, um uns den Fehler zu verstehen und zu reproduzieren, aber nicht mehr. https://stackoverflow.com/help/mcve – Keara

+0

@MarcinOrlowski Ich habe -100 zu 0 geändert, ändern Sie score1 to score2, und ich habe

Antwort

0

Sie scheinen zu habe zwei verschiedene Werte für die Position des Balls, zuerst hast du x, y, die von deiner Elternklasse sind, deren Name ich nicht kenne. Dann haben Sie die Position Delta-Member-Variablen der Klasse Ball namens dx und dy. Da Ihr Konstruktor rufen Sie den übergeordneten Konstruktor

super(x, y, dia, c); 

Wo x, y bzw. 200 sind und dann werden sie nie nach berührt. Meine Vermutung ist, dass diese die wahre Position Ihres Balles halten und deshalb müssen diese Werte festgelegt werden. Verwenden Sie die Setter, nachdem Sie die Zufall Delta Positionen in Ihrem Kugel Konstruktor wie so

public Ball(double x, double y, double dia, Color c) 
{ 
    super(x, y, dia, c); 
    dx = Math.random()* 12 - 6; 
    dy = Math.random() * 12 - 6; 
    setX(getX() + dx); //add your x difference 
    setY(getY() + dy); //add your y difference 
} 

Dies soll jetzt Ihre Deltas zum Ball Objekt auf Schöpfung hinzufügen und wenn es zum ersten Mal gemalt wird wird es eine zufällige Position hat auf deinem Spielbrett jedes Mal, wenn ein Ball erstellt wird.

Wie über diese Linie in der actionPerformed()

if(ball.getX() < -100) 
    score1++; 
    ball.setX(208); 
    ball.setY(50); 
    ball.setdx(20); 

Wenn die Setter sollte nur aufgerufen werden, wenn ball.getX() < -100, dann müssen Sie Klammern mit Ihren, wenn verwenden. Keine Klammern nach einem, wenn nur die nächste Zeile ausgeführt wird, und nichts mehr.

if(ball.getX() < -100) 
{ 
    score1++; 
    ball.setX(208); 
    ball.setY(50); 
    ball.setdx(20); 
} 
+0

Vielen Dank für Ihre Beiträge, aber ich denke nicht, dass es notwendig ist, die setX- und setY-Funktionen in den Ball zu setzen, nur den move() Verwenden Sie in meinem actionPerformed, um den Ball nach dem Zufallsprinzip zu bewegen. Darüber hinaus, wenn ich die Setter in den Ball heraus, der gleiche Fehler auftritt. –

+0

Wie wäre es mit den Änderungen? Ich habe einen weiteren Vorschlag hinzugefügt @HarrisLew –

+0

Vielen Dank @RAZ_Muh_Taz ... so ein einfacher Fehler, den ich verpasste ... die Klammern vergessen (die anderen Codezeilen wurden nicht ausgeführt !!) Ich danke Ihnen so sehr für Ihre Hilfe (ein Neophyt) aus. –

Verwandte Themen