Первый вопрос здесь, совершенно новый на 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 помощь будет оценена. Спасибо.