使用Java的迷你网球游戏

使用Java的迷你网球游戏,java,runnable,graphics2d,Java,Runnable,Graphics2d,我在开发代码时遇到了一些困难。因为我对Java不是很精通,所以我需要一些帮助。我正在尝试开发使用线程的迷你网球游戏。这个游戏的目的是用键盘上的左右键可以控制的球拍来接住在窗户上移动的球 这些球应该在窗户上沿对角线移动,当它们接触到任何一个角落(底部外)时,它们应该像光线反射一样改变它们的方式。除此之外,当球碰到一个障碍物时,他们也应该改变他们的方式 窗口底部的球拍可以用左右键控制。球员的任务是接球。用户捕获的球数将显示在记分部分,球总数将显示在下角 用户可能需要保存游戏的状态。当用户点击“保存游

我在开发代码时遇到了一些困难。因为我对Java不是很精通,所以我需要一些帮助。我正在尝试开发使用线程的迷你网球游戏。这个游戏的目的是用键盘上的左右键可以控制的球拍来接住在窗户上移动的球

这些球应该在窗户上沿对角线移动,当它们接触到任何一个角落(底部外)时,它们应该像光线反射一样改变它们的方式。除此之外,当球碰到一个障碍物时,他们也应该改变他们的方式

窗口底部的球拍可以用左右键控制。球员的任务是接球。用户捕获的球数将显示在记分部分,球总数将显示在下角

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

我的源代码文件是:

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())

}

}
公共类BallPanel扩展了JPanel实现可运行{
红色、绿色、蓝色;
int Xdirection=1,yddirection=1;
布尔值为it=false;
球形面板(内部X,内部Y){
定位球(X,Y,30,30);
/*随机r=新随机();
红色=r.nextInt(255);
绿色=r.nextInt(255);
蓝色=r.nextInt(255);
*/
}   
公共空间涂料(图g){
int panelWidth=this.getWidth();
intpanelheight=this.getHeight();
//g.setColor(新颜色(红色、绿色、蓝色));
g、 setColor(颜色为橙色);
g、 圆角椭圆形(面板宽度/2,面板高度/2,面板宽度/2,面板高度/2);
}
公共空心定位球(整数x、整数y、整数宽度、整数高度){
立根(x、y、宽度、高度);
重新油漆();
}
公开募捐{
int width=this.getWidth();
int height=this.getHeight();
随机r=新随机();
while(true){
如果(!请下载){
int lastX=this.getX();
int lastY=this.getY();
如果(lastX>675)Xdirection=-1;
如果(lastY>485)y方向=-1;
如果(lastX<-5)Xdirection=1;
如果(lastY<-5)y方向=1;
/*如果(lastX>280&&lastY>170){
Xdirection=-1;
y方向=-1;
}
*/      
定位球(最后X+X方向*r.nextInt(3),
lastY+Y方向*r.nextInt(3),
宽度、高度);
}
试一试{
睡眠(5);
}捕获(例外e){};
}
}
}
公共类BallWindow扩展JFrame实现ActionListener{
JButton btnStop=新JButton(“停止”);
JButton btnSave=新JButton(“保存”);
向量ballVector=新向量();
JPanel p1=createPanel(280、200、200、20,颜色为灰色);
JPanel p2=createPanel(280、300、200、20,颜色为灰色);
JPanel bottomp=createPanel(34554070,15,彩色.黑色);
JPanel lborder=createPanel(10,10,2560,彩色.黑色);
JPanel-rborder=createPanel(720,10,2560,彩色.黑色);
JPanel-tborder=createPanel(10,10,710,2,彩色.黑色);
公共窗口(){
setLayout(空);
btnStop.setBounds(12,15,100,30);
btnStop.addActionListener(这个);
添加(btnStop);
b保存退步(12,50,100,30);
//btnSave.addActionListener(这个);
添加(btnSave);
随机r=新随机();
对于(inti=0;i有一个


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

这里是我迄今为止开发的(我是新来的,所以还不能发布图片;)这是相当多的如果阅读做…你甚至从来没有告诉我们你的问题/:还有,你甚至需要多个线程为这个?(除了EDT和可能的游戏线程)也许这是有帮助的:是的,我为这么多的信息感到抱歉。我只是想弄清楚我的项目是关于什么的。我的问题是我不知道如何在按“左”和“右”时实现keylistener我将能够移动我的底部面板。感谢您的回复。克里斯托弗,感谢您的链接。这将非常有用:)非常感谢…正在帮助我。我想我今天将有一个不眠之夜:))