我的球没有移动并且停留在中心,尽管它应该移动

时间:2017-12-05 00:04:51

标签: java jpanel

我正在编写一个原始Pong游戏,我编码了它,因为当球离开屏幕的左侧时,它会移动到屏幕的中心并随机移动。但是,在开始时球始终保持在中心并且永远不会移动(尽管球的X坐标在开始时不小于0)。

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));
  }
}

球:

//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;
         }
     }
   }

1 个答案:

答案 0 :(得分:0)

你似乎有两个不同的球位置值,首先你有x,y来自你的父类,我不知道的名字。然后你有Ball类的位置delta成员变量dx和dy。由于您的构造函数调用了父构造函数

super(x, y, dia, c);

其中x,y分别为200,然后它们永远不会被触及。我的猜测是那些保持球的真实位置,因此需要设置这些值。在Ball构造函数中创建随机delta位置之后使用setter,如此

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  
}

现在应该在创建时将你的增量添加到Ball对象,并且当它第一次被绘制时,每次创建一个Ball时它将在游戏板上有一个随机位置。

actionPerformed()

中的这一行怎么样?
if(ball.getX() < -100)
    score1++;
    ball.setX(208);
    ball.setY(50);
    ball.setdx(20);

如果只在ball.getX()&lt;时调用setter。 -100然后你需要使用你的if括号。在if之后没有括号只执行下一行,仅此而已。

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