0

我对java很陌生,我正在写一个乒乓球游戏。我已经让球移动(这是我的首要任务)并让它出现在屏幕上。但是由于某种原因,它在它后面留下了一条黑线,我不知道我是否应该删除这个或什么,但这是我的 2 个类的代码(Ball 类只是一个保存球信息的类)

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

请帮忙!

4

1 回答 1

4

从本质上讲,您的球移动的任何地方都会永久保留Color.BLACK在您的Canvas. 如果你想摆脱它,你需要在每次球移动时刷新并重新绘制Canvasto Color.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并且可以将所有其他图形属性重置为该属性。但是,要获得此功能,您需要做的就是在将球的位置绘制在其顶部之前,重新绘制默认布局(无论是一种颜色,还是基本背景图像或其他任何东西)。

于 2012-11-15T17:25:13.387 回答