Java让球反弹,它留下了一条小道?

时间:2012-11-15 17:15:21

标签: java

我对java很新,我正在写一个乒乓球游戏。 我有球移动(这是我的第一优先)并在屏幕上显示它。 但是由于某些原因它背后留下了一条黑线,我不知道我是不是应该错误这个或者什么,但是我的2个类的代码(The Ball Class只是一个保存球的信息的类)

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;

public class Main extends Canvas implements Runnable{
    private static final long serialVersionUID = 1L;

    public static int Width=650;
    public static int Height=600;
    public boolean Running=false;
    public Thread thread;
    public Ball ball = new Ball();

    public static void main(String[] args){
      Main game = new Main();
      JFrame frame = new JFrame();
      frame.setSize(Width+25, Height+49);
      frame.setTitle("Pong By Poo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setResizable(false);
      frame.setVisible(true);
      frame.setLocationRelativeTo(null);
      frame.add(game);
      game.start();
    }


    public void start(){
      if(Running==true){
        return;
      } else {
        Running=true;
        thread = new Thread(this);
        thread.start();
      }
    }

    public void run(){
      while(Running==true){
        try{
          Thread.sleep(5);
          Draw();
          Update();
          ball.YVelocity();
          ball.XVelocity();
        } catch(Exception e){}
      }
    }

    public void Draw(){
      BufferStrategy bs = this.getBufferStrategy();
      if(bs==null){
        createBufferStrategy(2);
      } else {
        Graphics g = bs.getDrawGraphics();
        g.setColor(Color.BLACK);
        g.fillOval(ball.BallLocationX, ball.BallLocationY, 20, 20);
        g.dispose();
        bs.show();
      }
    }

    public void Update(){
      if(ball.BallLocationX==0) {
        ball.BallMovementX=true;
        System.out.println("Ball has hit the Left");
      }
      if(ball.BallLocationX==Width) {
        ball.BallMovementX=false;
        System.out.println("Ball has hit the Right");
      }
      if(ball.BallLocationY==0){
        ball.BallMovementY=true;
        System.out.println("Ball has hit the Top");
      }
      if(ball.BallLocationY==Height){
        ball.BallMovementY=false;
        System.out.println("Ball has hit the bottom");
      }
    }
  }



import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Ball extends JPanel{
  public int BallLocationX;
  public int BallLocationY;
  public boolean BallMovementY; //true makes the ball go up, false makes it go down
  public boolean BallMovementX; //True makes the ball go right, false makes it go left.

  public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.fillOval(BallLocationX, BallLocationY, 10, 10);
  }

  //moves the ball left to right
  public int YVelocity(){
    if(BallMovementY==true){
      BallLocationY++;
    } else {
      BallLocationY--;
    }

    return BallLocationY;
  }

  //Moves the ball up and down
  public int XVelocity(){
    if(BallMovementX==true){
      BallLocationX+=2;
    } else {
      BallLocationX-=2;
    }

    return BallLocationX;
    }
}

请帮忙!

1 个答案:

答案 0 :(得分:4)

基本上,在你Color.BLACK上,你的球移动到处都是永久Canvas。如果你想摆脱这种情况,你需要在每次球移动时刷新并重新绘制CanvasColor.WHITE(或其他),然后重新再次绘制球的位置。

具体来说,请在此处查看您的代码:

public void Draw(){
  BufferStrategy bs = this.getBufferStrategy();
  if(bs==null){
    createBufferStrategy(2);
  } else {
    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.BLACK);
    g.fillOval(ball.BallLocationX, ball.BallLocationY, 20, 20);
    g.dispose();
    bs.show();
  }
}

此处没有逻辑覆盖您之前对Canvas的更改,表明球的位置。

此外,作为侧面挑剔,Java标准的方法名称应为camelCase

要回答评论中的问题:Canvas API中没有任何内容可以自动理解您希望Canvas的默认背景,并可以将所有其他图形属性重置为该内容。但是,要获得此功能,您需要做的就是重新绘制默认布局(无论是全部颜色,基本背景图像还是其他任何颜色),然后再将球的位置涂抹在其上方。