0

我对 Java 编程很陌生。我目前正在尝试制作一个游戏,其中白球不断出现在屏幕上,用户必须单击并将球拖到画布的右侧以使其消失。我还没有写完代码,但是我的代码一直在让我的 Java 程序崩溃。谁能告诉我我的代码有什么问题以及为什么我的程序不断崩溃?谢谢!

public class BubbleGame extends GraphicsProgram
{

//~ Instance/static variables


private GRect field;
private GRect goal;
private GObject gobj;           /* The object being dragged */
private GPoint last;            /* The last mouse position  */

private RandomGenerator rgen = new RandomGenerator();

//~ Constructor ...........................................................

// ----------------------------------------------------------
/**
 * Creates a new BubbleGame object.
 */
public void init()
{
    //call method to create regions
    CreateRegions();

    //add mouse listeners
    addMouseListeners();

    //loop to add bubbles
    while (true)
    {
        //create a filled bubble
        GOval oval = new GOval (100, 100, 50, 50);
        oval.setFilled(true);
        oval.setColor(Color.WHITE);
        add(oval);

        //randomly generate coordinates within the field


        //add the bubble and pause 



    }
}


//~ Methods ...............................................................
public void CreateRegions(){

     //create and add the field with the size and color of your choice
     field = new GRect(0, 0, getWidth() * .75, getHeight());
     field.setFilled(true);
     field.setColor(Color.GREEN);
     add(field);

     //create and add the adjacent goal with the size and color of your choice
     goal = new GRect(493, 0, getWidth() * .25, getHeight());
     goal.setFilled(true);
     goal.setColor(Color.BLACK);
     add(goal);
    }



/* Called on mouse press to record the coordinates of the click */
public void mousePressed(MouseEvent e) {
    last = new GPoint(e.getPoint());
    gobj = getElementAt(last);
    //later add check that not dragging field or goal

}

/* Called on mouse drag to reposition the object */
public void mouseDragged(MouseEvent e) {
    if (gobj != null) {
        gobj.move(e.getX() - last.getX(), e.getY() - last.getY());
        last = new GPoint(e.getPoint());
    }    

}

/* Called on mouse drag to reposition the object */
public void mouseReleased(MouseEvent e) {
    //if gobj has a value and its coordinates are contained by goal, make it invisible  




}


}
4

3 回答 3

1

您的 while 循环可能是它崩溃的原因。你可以考虑在这里设置一个 sleep,这样你的应用程序就不会经常使用 cpu:

    while (true)
    {
        //create a filled bubble
        GOval oval = new GOval (100, 100, 50, 50);
        oval.setFilled(true);
        oval.setColor(Color.WHITE);
        add(oval);

        //randomly generate coordinates within the field


        //add the bubble and pause 


        Thread.sleep(100);
    }

此外,您还在不断添加 GOval 对象。我不知道 GraphicsProgram 类,但它也可能导致你的内存在某些时候填满。

于 2013-11-15T07:13:55.523 回答
0

通过执行以下操作,您将在特定位置绘制一个圆圈。

GOval oval = new GOval (100, 100, 50, 50);

但是while (true)会在它完成后立即重新执行这段代码,并一直这样做下去。这会填满你的记忆并最终导致崩溃。

但除此之外,这是毫无意义的,因为用户甚至看不到单独的圆圈:它们被绘制在彼此之上。

如果这确实是您正在寻找的,那么我建议添加一个Integer计算当前屏幕中的圆圈数。然后,您将添加到当前循环的末尾While

while(counter > 2 ) {
    Thread.sleep(100);
}

这将始终在画布中保留两个圆圈,最大延迟约为 100 毫秒。

您的 IDE 会提醒您可能应该捕获的异常。

在编程和功能上可能更有意义的是:

  • 在删除旧圆的事件中添加绘制新圆的代码,并在程序初始化时仅绘制一个圆。或者,
  • While将-loop更改为For-loop,例如运行 10 次。然后添加代码以随机化每个圆圈的位置。

Random randomGenerator = new Random();

for(int i=0;i<10;i++) {
    int pos1 = randomGenerator.nextInt(100);  // random between 0 and 99
    int pos2 = randomGenerator.nextInt(100);  // random between 0 and 99
    int pos3 = randomGenerator.nextInt(100);  // random between 0 and 99
    int pos4 = randomGenerator.nextInt(100);  // random between 0 and 99
    GOval oval = new GOval (pos1,pos2,pos3,pos4);
}
于 2013-11-15T08:03:29.730 回答
0

将您的 GOval 排除在 while 循环之外。将其保留在那里会使其再生,因此会崩溃。

于 2013-11-15T08:46:31.727 回答