package ruscz.game.gameOfProd.LevelEditor; import ruscz.game.gameOfProd.Map.Map; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.LinkedList; public class MapLayersManager { private LevelEditor editor; private JLayeredPane view; private Map map; private LinkedList imagesOfTiles; private JLayeredPane mapLayers; private JPanel objectSet; private JPanel cellSet; private JPanel tileSet; private int width; private int height; public MapLayersManager(LevelEditor editor) { this.editor = editor; view = editor.getView(); map = editor.getMap(); imagesOfTiles = editor.getImagesOfTiles(); width = editor.getMapWidth(); height = editor.getMapHeight(); mapLayers = new JLayeredPane(); mapLayers.setPreferredSize(new Dimension(width * 50, height * 50)); mapLayers.setLayout(null); objectSet = new JPanel(); objectSet.setBounds(0, 0, width * 50, height * 50); objectSet.setLayout(null); objectSet.setBackground(Color.RED); cellSet = new JPanel(); cellSet.setBounds(0, 0, width * 50, height * 50); cellSet.setLayout(null); cellSet.setBackground(Color.GREEN); tileSet = new JPanel(); tileSet.setBounds(0, 0, width * 50, height * 50); tileSet.setLayout(null); tileSet.setBackground(Color.BLUE); mapLayers.add(objectSet, JLayeredPane.POPUP_LAYER); mapLayers.add(cellSet, JLayeredPane.MODAL_LAYER); mapLayers.add(tileSet, JLayeredPane.DEFAULT_LAYER); } protected void repaintSets() { imagesOfTiles = editor.getImagesOfTiles(); repaintObjectset(); repaintCellSet(); repaintTileset(); } protected void repaintObjectset() { objectSet.removeAll(); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { JLabel object = new JLabel(); if (imagesOfTiles == null || imagesOfTiles.size() == 0) { object.setText("
" + String.valueOf(map.getImageCell().getMapForeground()[i][j]) + "
"); object.setHorizontalTextPosition(JLabel.CENTER); objectSet.setOpaque(true); objectSet.setBackground(Color.RED); } else if (map.getImageCell().getMapForeground()[i][j] != 0) { if (map.getImageCell().getMapForeground()[i][j] > imagesOfTiles.size() || map.getImageCell().getMapForeground()[i][j] < 0) { editor.displayError("Inner Value out of bounds for current tileset was found on position " + i + ":" + j + " on Object Layer. Defaulting to 0."); map.getImageCell().getMapForeground()[i][j] = 0; } object.setIcon(new ImageIcon(imagesOfTiles.get(map.getImageCell().getMapForeground()[i][j]).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); } else objectSet.setOpaque(false); object.setName(String.valueOf(map.getImageCell().getMapForeground()[i][j])); object.setBounds(i * 50, j * 50, 50, 50); int x = i; int y = j; object.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { editor.getInfoManager().displayInfo(object, "object", x, y); } }); objectSet.add(object); } } view.repaint(); } protected void repaintCellSet() { cellSet.removeAll(); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { JLabel cell = new JLabel(); if (imagesOfTiles == null || imagesOfTiles.size() == 0) { cell.setText("
" + editor.getCellArray()[i][j].split(",")[0].toUpperCase() + "
"); cell.setHorizontalTextPosition(JLabel.CENTER); cellSet.setOpaque(true); cellSet.setBackground(Color.GREEN); } else if (!editor.getCellArray()[i][j].split(",")[0].toUpperCase().equals("EMPTY")) { setCellIcon(cell, i, j); } else cellSet.setOpaque(false); cell.setName(String.valueOf(editor.getCellArray()[i][j])); cell.setBounds(i * 50, j * 50, 50, 50); int x = i; int y = j; cell.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { editor.getInfoManager().displayInfo(cell, "cell", x, y); } }); cellSet.add(cell); } } view.repaint(); } protected void repaintTileset() { tileSet.removeAll(); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { JLabel tile = new JLabel(); if (imagesOfTiles == null || imagesOfTiles.size() == 0) { tile.setText("
" + String.valueOf(map.getImageCell().getMapBackground()[i][j]) + "
"); tile.setHorizontalTextPosition(JLabel.CENTER); tileSet.setOpaque(true); tileSet.setBackground(Color.BLUE); } else { if (map.getImageCell().getMapBackground()[i][j] > imagesOfTiles.size() || map.getImageCell().getMapBackground()[i][j] < 0) { editor.displayError("Inner Value out of bounds for current tileset was found on position " + i + ":" + j + " on Tile Layer. Defaulting to 0."); map.getImageCell().getMapForeground()[i][j] = 0; } tile.setIcon(new ImageIcon(imagesOfTiles.get(map.getImageCell().getMapBackground()[i][j]).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); } tile.setName(String.valueOf(map.getImageCell().getMapBackground()[i][j])); tile.setBounds(i * 50, j * 50, 50, 50); int x = i; int y = j; tile.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { editor.getInfoManager().displayInfo(tile, "tile", x, y); } }); tileSet.add(tile); } } view.repaint(); } private void setCellIcon(JLabel cell, int i, int j) { String value; String[] info = editor.getCellArray()[i][j].split(","); if (info[0].equals(info[0].toLowerCase())) { return; } if (info[0].toUpperCase().equals("DOOR") || info[0].toUpperCase().equals("DOORTO")) { value = "DOOR/DOORTO"; } else { value = info[0].toUpperCase(); } if(info.length > 1) { if (info[1].equals("u")) { BufferedImage img = toBufferedImage(imagesOfTiles.get(editor.getCellMap().get(value)).getScaledInstance(50, 50, Image.SCALE_DEFAULT)); img = img.getSubimage(0, 0, 50, 25); cell.setIcon(new ImageIcon(tilify(img, true))); } else if (info[1].equals("d")) { BufferedImage img = toBufferedImage(imagesOfTiles.get(editor.getCellMap().get(value)).getScaledInstance(50, 50, Image.SCALE_DEFAULT)); img = img.getSubimage(0, 25, 50, 25); cell.setIcon(new ImageIcon(tilify(img, false))); } } else { cell.setIcon(new ImageIcon(imagesOfTiles.get(editor.getCellMap().get(value)).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); } } private BufferedImage toBufferedImage(Image img) { BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D bGr = bimage.createGraphics(); bGr.drawImage(img, 0, 0, null); bGr.dispose(); return bimage; } private BufferedImage tilify(BufferedImage img, boolean isUp) { BufferedImage image = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB); Graphics2D bGr = image.createGraphics(); if (isUp) bGr.drawImage(img, 0, 0, null); else bGr.drawImage(img, 0, 25, null); bGr.dispose(); return image; } public JLayeredPane getMapLayers() { return mapLayers; } public JPanel getObjectSet() { return objectSet; } public JPanel getCellSet() { return cellSet; } public JPanel getTileSet() { return tileSet; } }