0

私はJavaに不慣れで、ポンゲームを書いています。ボールを動かして(それが私の最優先事項です)、画面に表示させます。しかし、いくつかの理由で、その後ろに黒い線が残っているので、私はこれまたは何かを消去することになっているのかどうかわかりませんが、ここに私の2つのクラスのコードがあります(ボールクラスはボールの情報を保存するための単なるクラスです)

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 標準ではメソッド名を .xml に含める必要がありますcamelCase

コメントの質問に答えるために: Canvas APIには、デフォルトの背景をどうしたいかを自動的に理解し、Canvas他のすべてのグラフィックス属性をそれにリセットできるものはありません。ただし、この機能を利用するには、ボールの位置をその上にペイントする前に、デフォルトのレイアウト (すべてが 1 色であるか、基本的な背景画像であるか、またはその他のものであるかに関係なく) を再ペイントする必要があります。

于 2012-11-15T17:25:13.387 に答える