使用线程Java的迷你网球比赛

时间:2015-01-05 22:40:06

标签: java runnable graphics2d

我在开发代码时遇到了一些困难。由于我对Java不太先进,我需要一些帮助。我正在尝试使用Threads开发迷你网球游戏。这个游戏的目的是通过可以用键盘上的左右按钮控制的桨来捕捉在窗户上移动的球。

那些球应该在窗户上对角移动,当它们接触任何一个角落(从底部出来)时,它们应该像光反射一样改变它们的方式。除此之外,当一个球触及其中一个障碍时,他们也应该改变他们的方式。

窗口底部的桨可以用左右键控制。玩家的任务是抓住球。用户捕获的球数将显示在乐谱部分,球的总数将转到底角。

用户可能需要保存游戏状态。当用户点击“保存游戏”按钮时;球位置和得分应保存到文件中。当用户点击打开按钮时,应重新加载游戏状态。

我的源代码文件是:

public class BallPanel extends JPanel implements Runnable {

int RED, GREEN, BLUE;
int Xdirection = 1, Ydirection = 1;
boolean pleaseWait = false;

BallPanel(int X, int Y){
    locateBall(X, Y, 30, 30);               
/*  Random r = new Random();
    RED = r.nextInt(255);
    GREEN = r.nextInt(255);
    BLUE = r.nextInt(255);
    */
}   
public void paint(Graphics g){
    int panelWidth = this.getWidth();
    int panelHeight = this.getHeight();     

//  g.setColor( new Color(RED, GREEN, BLUE ));
    g.setColor(Color.ORANGE);

    g.fillOval(panelWidth/2, panelHeight/2,panelWidth/2, panelHeight/2);
}

public void locateBall(int x, int y, int width, int height){

    setBounds(x, y, width, height);
    repaint();
}

public void run() {

    int width = this.getWidth();
    int height = this.getHeight();
    Random r = new Random();

    while(true){
        if(!pleaseWait){
            int lastX = this.getX();
            int lastY = this.getY();

            if (lastX > 675) Xdirection = -1;
            if (lastY > 485) Ydirection = -1;
            if (lastX < -5) Xdirection = 1;
            if (lastY < -5) Ydirection = 1;

    /*      if(lastX > 280 && lastY > 170){
                Xdirection = -1;
                Ydirection = -1;
            }
    */      
            locateBall(lastX + Xdirection*r.nextInt(3), 
                       lastY + Ydirection*r.nextInt(3), 
                       width, height );
        }
        try{
            Thread.sleep(5);
        }catch(Exception e){};
    }

}

}


public class BallWindow extends JFrame implements ActionListener{
    JButton btnStop = new JButton("STOP");
    JButton btnSave = new JButton("SAVE");
    Vector<BallPanel> ballVector = new Vector<BallPanel>();

    JPanel p1 = createPanel(280, 200, 200, 20, Color.gray);
    JPanel p2 = createPanel(280, 300, 200, 20, Color.gray);
    JPanel bottomp = createPanel(345, 540, 70, 15, Color.black);

    JPanel lborder = createPanel(10, 10, 2, 560, Color.black);
    JPanel rborder = createPanel(720, 10, 2, 560, Color.black);
    JPanel tborder = createPanel(10, 10, 710, 2, Color.black);



public BallWindow() {
    setLayout(null);
    btnStop.setBounds(12, 15, 100, 30);
    btnStop.addActionListener(this);
    add(btnStop);
    btnSave.setBounds(12, 50, 100, 30);
    //btnSave.addActionListener(this);
    add(btnSave);
    Random r = new Random();
    for(int i=0; i<7; i++){
        BallPanel bp = new BallPanel(r.nextInt(740), r.nextInt(590));
        Thread t = new Thread(bp);
        ballVector.add(bp);
        t.start();
        add(bp);
    }


    add(p1);
    add(p2);
    add(bottomp);
    add(lborder);
    add(rborder);
    add(tborder);

    setSize(740, 590);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    repaint();
}


JPanel createPanel(int x, int y, int width, int height, Color pColor){
    JPanel temp = new JPanel();
    temp.setBackground(pColor);
    temp.setBounds(x, y, width, height);
    return temp;    
}



public static void main(String[] args) {
    new BallWindow();

}

public void actionPerformed(ActionEvent arg0) {
    for (BallPanel ball : ballVector) {
        ball.pleaseWait = !ball.pleaseWait;
    }

    if( btnStop.getText().equalsIgnoreCase("STOP"))
        btnStop.setText("START");
    else
        btnStop.setText("STOP");

//  if(arg0.getSource())

}

}

我遇到了障碍部分和keylistener。任何类型的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

Hava看一下http://zetcode.com/tutorials/javagamestutorial/

您应该特别查看基础知识和动画部分。它将帮助清理你正在做的动画和线程。它还显示了如何实现java游戏的一般模式。