2013-11-15 2 views
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 




} 


} 
+0

«Это грохот» совсем не помогает. Что такое сообщение об ошибке? – Kayaman

+0

Исключение из потока "main" java.lang.OutOfMemoryError: Java heap space Исключение в потоке "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space –

ответ

1

Возможно, что ваш цикл while является причиной его сбоя. Вы можете рассмотреть возможность положить спать здесь, так что ваше приложение не будет использовать процессор постоянно:

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, но это может также привести к тому, что ваша память будет заполняться в какой-то момент.

0

Выполняя следующее, вы рисуете круг в определенном месте.

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

Но while (true) будет повторно выполнить этот код сразу же после того, как он закончил, и продолжать делать это навсегда. Это заполнит вашу память и, в конечном итоге, вызовет сбой.

Но кроме того, бессмысленно, поскольку пользователь даже не видит отдельные круги: они нарисованы друг на друга.

Если это действительно то, что вы ищете, тогда я бы предложил добавить Integer, который подсчитывает количество кругов, находящихся в данный момент на экране. Затем вы должны добавить к концу текущего While -loop:

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); 
} 
0

Возьмите GOval из цикла. Хранение его там заставляет его восстанавливаться, поэтому он падает.

Смежные вопросы