我正在开发一个简单的游戏,我需要这些squareBumpers,它们只是闲置着,当被击中时,会碰撞并反射球。但是目前,球只是飞过我的SquareBumpers。我只能使用java awt和swing库。这是代码:

class squareBumper {
      private int x = 300;
      private int y = 300;
      private Color color = new Color(66,139,139);

      public void paint(Graphics g) {
        Rectangle clipRect = g.getClipBounds();
          g.setColor(color);
          g.fillRect(x, y, 31, 31);
      }
   }

class BouncingBall {
  // Overview: A BouncingBall is a mutable data type.  It simulates a
  // rubber ball bouncing inside a two dimensional box.  It also
  // provides methods that are useful for creating animations of the
  // ball as it moves.

  private int x = 320;
  private int y = 598;
  public static double vx;
  public static double vy;
  private int radius = 6;
  private Color color = new Color(0, 0, 0);

  public void move() {
    // modifies: this
    // effects: Move the ball according to its velocity.  Reflections off
    // walls cause the ball to change direction.
    x += vx;
    if (x <= radius) { x = radius; vx = -vx; }
    if (x >= 610-radius) { x = 610-radius; vx = -vx; }

    y += vy;
    if (y <= radius) { y = radius; vy = -vy; }
    if (y >= 605-radius) { y = 605-radius; vy = -vy; }
  }

  public void randomBump() {
    // modifies: this
    // effects: Changes the velocity of the ball by a random amount
    vx += (int)((Math.random() * 10.0) - 5.0);
    vx = -vx;
    vy += (int)((Math.random() * 10.0) - 5.0);
    vy = -vy;
  }

  public void paint(Graphics g) {
    // modifies: the Graphics object <g>.
    // effects: paints a circle on <g> reflecting the current position
    // of the ball.

    // the "clip rectangle" is the area of the screen that needs to be
    // modified
    Rectangle clipRect = g.getClipBounds();

    // For this tiny program, testing whether we need to redraw is
    // kind of silly.  But when there are lots of objects all over the
    // screen this is a very important performance optimization
    if (clipRect.intersects(this.boundingBox())) {
      g.setColor(color);
      g.fillOval(x-radius, y-radius, radius+radius, radius+radius);
    }
  }

  public Rectangle boundingBox() {
    // effect: Returns the smallest rectangle that completely covers the
    //         current position of the ball.

    // a Rectangle is the x,y for the upper left corner and then the
    // width and height
    return new Rectangle(x-radius, y-radius, radius+radius+1, radius+radius+1);
  }
}

最佳答案

看一下实现Shape接口的类。有椭圆和其他形状,它们都实现了intersects(Rectangle2D)方法。如果您不想自己进行交叉,则可能会有所帮助。

至于处理碰撞,这取决于所需的精度水平。简单地使边缘球偏斜是很容易的。只需确定矩形的碰撞面是垂直还是水平,然后相应地抵消相应的速度分量即可。如果您想应付困难,那会更加复杂。

08-16 22:25