需要减慢矩形运动

时间:2013-12-15 21:23:35

标签: java multithreading swing pong

我遇到线程问题。我正在尝试重建乒乓球,其中有2名球员有2个动作听众。 2个拨片以我希望他们移动的速度移动。然而,“球”(在其上面涂有椭圆形的矩形物体)移动速度太快。我尝试使用Ball类中的第二个线程来减慢速度,但这似乎不起作用。任何帮助,将不胜感激。 这是我的代码:

public class BattleBallz extends JFrame implements Runnable {
AL keyListen1 = new AL();
AL2 keyListen2 = new AL2();
Image dbi;
Graphics dbg;

int x1,x2;
int ballX, ballY, direction;
Ball b1;

public BattleBallz(){
    setTitle("Battle Ballz");
    setSize(350, 400);
    setResizable(false);
    setVisible(true);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    addKeyListener(keyListen1);
    addKeyListener(keyListen2);
    x1 = 150;
    x2 = 150;
    int direction = 0 + (int)(Math.random() * ((2 - 0) + 1));
    b1 = new Ball(direction);
    Thread b = new Thread(b1);
    b.start();
}

public void paint(Graphics g){
    dbi = createImage(getWidth(), getHeight());
    dbg = dbi.getGraphics();
    paintComponent(dbg);
    g.drawImage(dbi, 0, 0, this);
}

public void paintComponent(Graphics g){
    Rectangle p1 = new Rectangle(x1,375,60,10);
    g.setColor(Color.blue);
    g.fillRect(x1, 375, 60, 10);
    Rectangle p2 = new Rectangle(x2,45,60,10);
    g.setColor(Color.red);
    g.fillRect(x2,45,60,10);

    b1.paintComponent(g, p1, p2);

    repaint();
}


@Override
public void run() {
    try {
        while(true){
            move();
            Thread.sleep(5);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }

}

public void move(){
    x1 += keyListen1.getXdirection();
    x2 += keyListen2.getXdirection();

    if (x1<=0){
        x1 =0;
    }
    if (x1>=305){
        x1 = 305;
    }
    if (x2<=0){
        x2=0;
    }
    if (x2>=305){
        x2=305;
    }
}
}

public class Ball extends JPanel implements Runnable {

boolean up,down,right,left;
int x = 150, y = 150 ;

public Ball(int direction){
    if(direction ==1){
        down = true;
    }
    if (direction ==0){
        up = true;
    }
}

public void paintComponent(Graphics g, Rectangle p1, Rectangle p2){
    super.paintComponents(g);
    if(down){
        y++;
        Rectangle ball = new Rectangle(x,y,49,49);
        g.fillOval(x, y, 50, 50);
        if (y>=385 || ball.intersects(p1)){
            down = false;
            up = true;
        }
    }
    if (up){
        y--;
        Rectangle ball = new Rectangle(x,y,49,49);
        g.fillOval(x, y, 50, 50);
        if (y<=10 || ball.intersects(p2)){
            up = false;
            down = true;
        }
    }
}

@Override
public void run() {
    // TODO Auto-generated method stub
    try {
        while (true){
            Thread.sleep(30);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}
}

1 个答案:

答案 0 :(得分:3)

  1. 使用Swing Timer代替普通Thread,您遇到Concurency in Swing问题,代码已发布到阻止Event Dispatch Thread,被Thread.sleep锁定,无尽的阻碍

  2. 使用paintComponent,但将JPanel放在第1位。里面的代码行应为super.paintComponent,否则会累积绘制,覆盖getPreferredSize的{​​{1}}

  3. 使用KeyBindings代替KeyListener