Сделал это, и я получил исключение из нехватки памяти

я программирую основную игру TowerDefense. Все идет отлично, но я застреваю, пытаясь предварительно загрузить изображения. Мое затруднение заключается в том, что когда я вызываю метод paint для своего класса Canvas (он расширяет JPanel), он открывает поток с именем «Image Fetcher x», где «x» - это число, начинающееся с 0 и повышающееся для нескольких экземпляров потока. , Насколько я понимаю, этот поток берет изображения из моих переменных изображения, размещает их на диске, загружает их в оперативную память для отображения моей игры, а затем рисует их.
Это прекрасно работает, однако, в середине игры бывают моменты, когда ничего не появляется, потому что метод draw, который я вызываю, пытается нарисовать изображение, которое не было загружено. Геймплей все еще эффективен, но визуальное представление испорчено, потому что игрок в основном видит травяной блок, стреляющий во врага. Затем изображение неожиданно загружается, рисуется и выглядит нормально.

Это нормально и все, но я хочу иметь возможность предварительно загрузить все ресурсы (и, возможно, сделать загрузочный экран, чтобы игрокзнает игра загружается), чтобы незагруженные изображения не разрушали иллюзию игрового процесса - если это имеет смысл. Я пытался использовать MediaTracker, это не сработало. Я исследовал это и, похоже, ничего не могу найти по этому поводу.

Мой текущий код состоит из массивов изображений с карты изображений. Каждое изображение в массиве рисуется на холсте в соответствии с определенными идентификаторами, которые сообщают игре, какую плитку / башню рисовать. Я использую класс java.awt.Image для хранения своих изображений. Итак, есть ли способ предварительно загрузить мои изображения, чтобы они не загружались в середине игры?
Спасибо!

Редактировать:
Код:

for(int y=0; y<tileMap.length; y++) {
    for(int x=0; x<tileMap[y].length; x++) {
        tileMap[y][x] = new ImageIcon("res/tileMap.png").getImage();
        tileMap[y][x] = createImage(new FilteredImageSource(tileMap[y][x].getSource(), new CropImageFilter(x * Room.blockSize, y * Room.blockSize, Room.blockSize, Room.blockSize))); 
    }
}

public void paintcomponent(Graphics g) {
    g.drawImage(tileMap[1][2], 5, 7, null);
}

Это упрощенная версия, у меня около 1500 строк, так что я не думаю, что вы хотите увидеть все это, лол. По сути, я просто создаю переменные изображения, а затем рисую их. В момент их отрисовки запускается поток Image Fetcher, загружает изображение и затем исчезает после того, как изображение завершило загрузку. Пока изображение загружается (а поток Image Fetcher активен), метод drawImage ничего не рисует, так как изображение предварительно не загружается в RAM. Однако, как только загрузка изображения завершена, метод drawImage фактически рисует правильное изображение и поток Image Fetcher больше не активен. Есть ли способ инициировать процесс извлечения изображений, чтобы все это происходилодо запуск программы?
Я также попытался нарисовать все с самого начала, это не сработало, поскольку программа запускается слишком быстро, чтобы сборщики изображений могли успешно загрузить каждое изображение перед тем, как пользователь начнет играть. ИД, сборщики изображений сложны. Мне просто нужно знать, как предварительно загружать изображения в оперативную память.

Ответы на вопрос(0)

Ваш ответ на вопрос