Как замаскировать сетку BufferedImage, отображаемую поверх фона BufferedImage - PullRequest
0 голосов
/ 05 марта 2020

Первый вопрос здесь, совершенно новый на java (и engli sh не мой родной язык), пожалуйста, будьте снисходительны :) Не нашел подобной проблемы.

Я пытаюсь сделать 2D-игра (по очереди, поэтому не проблема в режиме реального времени). Моя карта отображается в JPanel со смесью изображений для фона, сетки и подвижных объектов. Все изображения загружаются и сохраняются один раз перед отображением. У меня есть BufferedImage для фона, другой, на котором я рисую сетку, и множество изображений для других объектов. В paintComponent () я рисую все BufferedImages на Graphics2D (приведенный из параметра Graphics). Моя задача - замаскировать сетку, когда игрок выбрал (или когда масштаб слишком велик, с переменными «ruleGrid» и «zoom» соответственно). Вывод тестового текста правильно записан, но сетка все равно видна. Кажется, что оба изображения объединены, и я не могу замаскировать второе. Я попытался отобразить сетку в другом месте (другие координаты), и она работает хорошо. Но если оба изображения перекрываются, то часть сетки на другом изображении остается (как будто нарисована на первом, а не на JPanel). Извините, если он недостаточно ясен ...

Некоторые снимки экрана могут помочь: Сетка и фон с одинаковыми координатами

Сетка и фон с разными координатами

При прокрутке и уменьшении : вот проблема. Перекрывающаяся часть сетки все еще «печатается» на фоновом изображении, а остальная часть сетки отображается «под» фоном.

Почему это происходит? Что я сделал не так ? Это связано с оптимизацией / рендерингом из класса Graphics2D? Мне лучше использовать Layered Panes?

Для обоих BufferedImages я использую:

BufferedImage.TYPE_INT_ARGB

.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

Вот упрощение моего кода:

BufferedImage mapZones;
BufferedImage mapGrid;

@Override
public void paintComponent(Graphics g1){

    Graphics2D g = (Graphics2D)g1;

    //Clear the map
    clearBackground(g);

    //Display Background
    displayMap(g, mapZones);

    //Grid
    if (Options.ruleGrid && Options.zoom > 4f) {
        displayMap(g, mapGrid);
        System.out.println("Test if grid should be displayed"); 
    }  
}

/*********************************************************************************************************/
private void displayMap(Graphics2D g, BufferedImage bufI) {

    g.drawImage(bufI, -x0, -y0, width, height, null);

}

/*********************************************************************************************************/
private void clearBackground(Graphics2D g1) {
    g1.setColor(Color.WHITE);   
    int max = 500000;       
    g1.clearRect(-max, -max, max*2, max*2);
}
/*********************************************************************************************************/

Any помощь будет оценена. Спасибо.

1 Ответ

0 голосов
/ 08 марта 2020

Найдите причину (хотя не «почему?»). У меня был третий вызов 'displayMap' с пустым изображением

    //Display Elements
    displayMap(g, mapElements);

, которое создается

mapElements = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

, и я еще не рисовал на нем.

Когда я комментирую вызов 'displayMap (g, mapElements);', у меня наконец-то возникает желаемое поведение.

Но я все еще не знаю, почему? Я думаю, что именно так кодируются графические классы и «нарисованные» функции:

Этот метод возвращает сразу во всех случаях, даже если полное изображение еще не было загружено и не было преобразился для текущего устройства вывода простой способ ...

...