2014-12-07 2 views
3

Чтобы предисловие к этому, я начинающий программист, желающий добавить анимацию в простую игру, которую я создал. Я сделал отдельный класс, чтобы проверить мои анимации, и каждое изображение отображалось, кроме двух. Мой текущий код:Проблемы с кучей с получением java-изображений

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.net.URL; 

import javax.swing.JApplet; 

public class GooAnimation extends JApplet implements Runnable { 

Image[] eastbarf = new Image[22]; 
Image[] east2barf = new Image[10]; 
boolean enter = false; 
int counter = 0; 
Image img1; 
URL url; 

public void init() { 

    eastbarf[0] = getImage(getDocumentBase(), "eastbarf1.png"); 
    eastbarf[1] = getImage(getDocumentBase(), "eastbarf2.png"); 
    eastbarf[2] = getImage(getDocumentBase(), "eastbarf3.png"); 
    eastbarf[3] = getImage(getDocumentBase(), "eastbarf4.png"); 
    eastbarf[4] = getImage(getDocumentBase(), "eastbarf5.png"); 
    eastbarf[5] = getImage(getDocumentBase(), "eastbarf6.png"); 
    eastbarf[6] = getImage(getDocumentBase(), "eastbarf7.png"); 
    eastbarf[7] = getImage(getDocumentBase(), "eastbarf8.png"); 
    eastbarf[8] = getImage(getDocumentBase(), "eastbarf9.png"); 
    eastbarf[9] = getImage(getDocumentBase(), "eastbarf10.png"); 
    eastbarf[10] = getImage(getDocumentBase(), "eastbarf11.png"); 
    eastbarf[11] = getImage(getDocumentBase(), "eastbarf12.png"); 
    eastbarf[12] = getImage(getDocumentBase(), "eastbarf13.png"); 
    eastbarf[13] = getImage(getDocumentBase(), "eastbarf14.png"); 
    eastbarf[14] = getImage(getDocumentBase(), "eastbarf15.png"); 
    eastbarf[15] = getImage(getDocumentBase(), "eastbarf16.png"); 
    eastbarf[16] = getImage(getDocumentBase(), "eastbarf17.png"); 
    eastbarf[17] = getImage(getDocumentBase(), "eastbarf18.png"); 
    eastbarf[18] = getImage(getDocumentBase(), "eastbarf19.png"); 
    eastbarf[19] = getImage(getDocumentBase(), "eastbarf20.png"); 
    eastbarf[20] = getImage(getDocumentBase(), "eastbarf21.png"); 
    eastbarf[21] = getImage(getDocumentBase(), "eastbarf22.png"); 

    east2barf[0] = getImage(getDocumentBase(), "east2barf1.png"); 
    east2barf[1] = getImage(getDocumentBase(), "east2barf2.png"); 
    east2barf[2] = getImage(getDocumentBase(), "east2barf3.png"); 
    east2barf[3] = getImage(getDocumentBase(), "east2barf4.png"); 
    east2barf[4] = getImage(getDocumentBase(), "east2barf5.png"); 
    east2barf[5] = getImage(getDocumentBase(), "east2barf6.png"); 
    east2barf[6] = getImage(getDocumentBase(), "east2barf7.png"); 
    east2barf[7] = getImage(getDocumentBase(), "east2barf8.png"); 
    east2barf[8] = getImage(getDocumentBase(), "east2barf9.png"); 
    east2barf[9] = getImage(getDocumentBase(), "east2barf10.png"); 

} 

@Override 
public void run() { 
    while (true) { 
     repaint(); 
     try { 
      Thread.sleep(1000); 

     } catch (InterruptedException e) { 

     } 
    } 

} 

@Override 
public void start() { 
    Thread thread = new Thread(this); 
    thread.start(); 
} 

@Override 
public void paint(Graphics g) { 
    // for (int i = 0; i < eastbarf.length; i++) { 
    if (enter) { 
     if (counter < 10) { 
      g.setColor(Color.WHITE); 
      g.drawRect(0, 0, 10000, 10000); 
      g.fillRect(0,0,10000,10000); 
      g.drawImage(east2barf[counter], 300, 0, 1000, 1000, this); 
      System.out.println(eastbarf[counter].getHeight(null)); 
     } 
     if (counter == 10) { 
      counter = 0; 
      enter = false; 
     } 
    } 
    if (!enter) { 
     if (counter < 22) { 
      // if ((i - 1)%2 == 1) { 
      // 

      // } 
      System.out.println(counter); 
      if (eastbarf[counter] == null) { 
       System.out.println("Its null!"); 
      } 
      // if (counter % 2 == 1) { 
      // g.setColor(Color.YELLOW); 
      // } 
      // else { 
      // g.setColor(Color.MAGENTA); 
      // } 
      g.setColor(Color.WHITE); 
      g.drawRect(0, 0, 10000, 10000); 
      g.fillRect(0,0,10000,10000); 
      g.drawImage(eastbarf[counter], 0, 0, 1000, 1000, this); 
      System.out.println(eastbarf[counter].getHeight(null)); 

      // } 
     } 

     // } 

     if (counter > 21) { 
      enter = true; 
      counter = 0; 
     } 
    } 
    counter += 1; 
    // g.drawImage(img1, 0, 0, null); 


} 

}

Я получаю две ошибки, которые говорят:

Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space 
Exception in thread "Image Fetcher 2" java.lang.OutOfMemoryError: Java heap space 

я однако посмотрел, как увеличить затмение пространства кучи и удвоили его. Я не уверен, что это адекватно. В идеале я бы имел 4 списков баффа одинаковой длины и 4 2barf. Как вы можете видеть, я разделил все имена изображений, чтобы упростить концептуализацию. Я довольно новичок, и я не знаю, как лучше практиковать образ мудрый или JApplet/Swing. Я был бы признателен, если бы кто-то мог понять, почему я проигрываю на двух изображениях. Изображения, которые отсутствуют, являются шестым и восьмым изображениями в eastbarf2. Я бы очень признателен за помощь. Thanks Редактировать: Изображения вокруг 80-150 kb каждый. В eclipse это команды, которые я вставляю в часть аргументов в конфигурациях запуска. -Xms1024M -Xmx2048M. Кажется, они ничего не меняют.

+1

Насколько велики изображения? – BitNinja

+1

Насколько велика куча? [Профиль] (http://stackoverflow.com/q/2064427/230513). – trashgod

+0

Я добавил информацию, trashgod, вы думаете, что просто использование этих будет решить проблему? – eweiner

ответ

1
g.drawRect(0, 0, 10000, 10000); 
g.fillRect(0,0,10000,10000); 
g.drawImage(east2barf[counter], 300, 0, 1000, 1000, this); 

вы заполняете 10k 10k х пикселей на экране, после чего вы рисуете изображения с размером 1000 х 1000, что, безусловно, будет дуть память. Если вы хотите большую карту для вашей игры вы должны реализовать Tileset карту с ортогональной камерой, которая будет оказывать только экран игрока находятся в, например изменения все изображения в BufferedImage и просто попробовать, что:

[.. .]

g.drawRect(0, 0, 800, 600); 
    g.fillRect(0,0,800,600); 
    g.drawImage(east2barf[counter], 300, 0, east2barf[counter].getWidth(), east2barf[counter].getHeight(), this); 

[...]

 g.setColor(Color.WHITE); 
     g.drawRect(0, 0, 800, 600); 
     g.fillRect(0,0,800,600); 
     g.drawImage(eastbarf[counter], 0, 0, east2barf[counter].getWidth(), east2barf[counter].getHeight(), this); 

[...]

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