From 5167562025427cda087f756a41ae93c6baf8602c Mon Sep 17 00:00:00 2001 From: musilto9 Date: Sat, 9 May 2020 21:02:11 +0200 Subject: [PATCH] added CellMap config and CellSet info (bugged) --- .../gameOfProd/LevelEditor/InfoManager.java | 351 ++++++++++++++++++ .../gameOfProd/LevelEditor/LevelEditor.java | 273 ++++---------- .../LevelEditor/MapLayersManager.java | 187 ++++++++++ 3 files changed, 605 insertions(+), 206 deletions(-) create mode 100644 src/main/java/ruscz/game/gameOfProd/LevelEditor/InfoManager.java create mode 100644 src/main/java/ruscz/game/gameOfProd/LevelEditor/MapLayersManager.java diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/InfoManager.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/InfoManager.java new file mode 100644 index 0000000..8d767bf --- /dev/null +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/InfoManager.java @@ -0,0 +1,351 @@ +package ruscz.game.gameOfProd.LevelEditor; + +import javax.swing.*; +import java.awt.*; +import java.util.LinkedList; + +public class InfoManager { + + private LevelEditor editor; + private JPanel info; + private JScrollPane scrollInfo; + private JLayeredPane view; + + LinkedList radioButtons; + + public InfoManager(LevelEditor editor) { + this.editor = editor; + this.view = editor.getView(); + } + + protected void displayInfo(JLabel label, String layer, int x, int y) { + if (info != null) { + info.removeAll(); + view.remove(info); + info = null; + } + if (scrollInfo != null) { + scrollInfo.removeAll(); + view.remove(scrollInfo); + scrollInfo = null; + view.repaint(); + } + info = new JPanel(); + info.setBounds(20, 200, 260, 730); + info.setLayout(null); + + switch (layer) { + case "object": + displayObjectInfo(label, x, y); + break; + case "cell": + displayCellInfo(label, x, y); + break; + } + + view.add(info); + view.revalidate(); + } + + private void displayObjectInfo(JLabel label, int x, int y) { + JLabel infoLabel = new JLabel(); + infoLabel.setBounds(0, 0, 50, 50); + infoLabel.setIcon(label.getIcon()); + infoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); + + JLabel numValue = new JLabel("Inner Value:"); + numValue.setBounds(90, 10, 100, 30); + + JTextField tileNum = new JTextField(label.getName()); + tileNum.setBounds(170, 10, 50, 30); + + JButton importTile = new JButton("Import selected tile"); + importTile.setVisible(false); + importTile.setBounds(50, 150, 150, 30); + importTile.addActionListener(e -> { + if (!editor.getOverview().getInfo().getText().equals("")) { + infoLabel.setIcon(editor.getOverview().getInfo().getIcon()); + tileNum.setText(editor.getOverview().getInfo().getText().replace("", "").replace("", "")); + } + else { + editor.getOverview().setState(Frame.NORMAL); + editor.getOverview().toFront(); + } + }); + + JButton selectTile = new JButton("Select tile"); + selectTile.setBounds(50, 100, 150, 30); + selectTile.addActionListener(e -> { + if (editor.getOverview() == null) editor.setOverview(new TilesetOverview()); + else { + editor.getOverview().setState(Frame.NORMAL); + editor.getOverview().toFront(); + } + importTile.setVisible(true); + }); + + JButton saveInfo = new JButton("Save tile info"); + saveInfo.setBounds(50, 200, 150, 30); + saveInfo.addActionListener(e -> { + if (editor.getImagesOfTiles() != null) { + if (Integer.parseInt(tileNum.getText()) > editor.getImagesOfTiles().size() || Integer.parseInt(tileNum.getText()) < 0) { + editor.displayError("Inner value out of bounds. Value has to bee between 0 and " + (editor.getImagesOfTiles().size() - 1) + "."); + return; + } + } + else if (Integer.parseInt(tileNum.getText()) < 0) { + editor.displayError("Inner value out of bounds. Value has to bee higher than 0."); + return; + } + editor.hideError(); + editor.getMap().getImageCell().getMapForeground()[x][y] = Integer.parseInt(tileNum.getText()); + editor.getMapLayers().repaintObjectset(); + info.removeAll(); + view.remove(info); + view.revalidate(); + view.repaint(); + }); + + info.add(infoLabel); + info.add(numValue); + info.add(tileNum); + info.add(selectTile); + info.add(importTile); + info.add(saveInfo); + } + + private void displayCellInfo(JLabel label, int x, int y) { + String[] array = {"EMPTY", "BLOCK", "INTER", "TRIGGER", "MOVETO", "DOOR", "DOORTO", "CHEST"}; + radioButtons = new LinkedList<>(); + + JLabel infoLabel = new JLabel(); + infoLabel.setBounds(0, 0, 50, 50); + infoLabel.setIcon(label.getIcon()); + infoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); + + JLabel valueLabel = new JLabel("Inner Value:"); + valueLabel.setBounds(90, 10, 100, 30); + + JButton openCellMap = new JButton("Open CellMap Configuration"); + + JButton saveInfo = new JButton("Save tile info"); + + JComboBox cellType = new JComboBox(array); + cellType.setBounds(170, 10, 90, 30); + String[] cellname = label.getName().split(","); + cellType.setSelectedItem(cellname[0]); + cellType.addActionListener(e -> { + if (editor.getImagesOfTiles() != null && editor.getImagesOfTiles().size() > 0) { + String value; + if (cellType.getSelectedItem().equals("DOOR") || cellType.getSelectedItem().equals("DOORTO")) value = "DOOR/DOORTO"; + else value = String.valueOf(cellType.getSelectedItem()); + infoLabel.setIcon(new ImageIcon(editor.getImagesOfTiles().get(editor.getCellMap().get(value)).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); + } + displayDetailedCellInfo(String.valueOf(cellType.getSelectedItem()), openCellMap, saveInfo); + info.requestFocus(); + info.revalidate(); + }); + + openCellMap.setBounds(30, 70, 200, 30); + openCellMap.addActionListener(e -> { + info.removeAll(); + info.revalidate(); + view.remove(info); + view.revalidate(); + displayCellSetConfig(); + }); + + saveInfo.setBounds(50, 120, 150, 30); + saveInfo.addActionListener(e -> { + editor.getCellArray()[x][y] = String.valueOf(cellType.getSelectedItem()); + editor.getMapLayers().repaintCellSet(); + info.removeAll(); + info.revalidate(); + view.remove(info); + view.revalidate(); + view.repaint(); + }); + + info.add(infoLabel); + info.add(valueLabel); + info.add(cellType); + info.add(openCellMap); + info.add(saveInfo); + } + + private void displayDetailedCellInfo(String type, JButton open, JButton save) { + if (type.equals("BLOCK")) { + upperLowerInfo(open, save); + } + } + + private void upperLowerInfo(JButton open, JButton save) { + JLabel label = new JLabel("
Half Block
"); + label.setBounds(0, 120, 260, 20); + + JRadioButton up = new JRadioButton("Upper"); + up.setBounds(0, 150, 70, 20); + up.setName("up"); + radioButtons.add(up); + + JRadioButton low = new JRadioButton("Lower"); + low.setBounds(100, 150, 70, 20); + low.setName("low"); + radioButtons.add(low); + + JRadioButton none = new JRadioButton("None"); + none.setBounds(200, 150, 70, 20); + none.setSelected(true); + none.setName("none"); + radioButtons.add(none); + + ButtonGroup group = new ButtonGroup(); + group.add(up); + group.add(low); + group.add(none); + + open.setLocation(open.getX(), open.getY() + 110); + + save.setLocation(save.getX(), save.getY() + 110); + + info.add(label); + info.add(up); + info.add(low); + info.add(none); + } + + private void displayCellSetConfig() { + int offset = 0; + String[] array = {"BLOCK", "INTER", "TRIGGER", "MOVETO", "DOOR/DOORTO", "CHEST"}; //EMPTY is missing on purpose, DOOR & DOORTO are combined on purpose + LinkedList numFields = new LinkedList<>(); + + JPanel infoPanel = new JPanel(); + infoPanel.setPreferredSize(new Dimension(250, array.length * 160 + 50)); + infoPanel.setLayout(null); + + if (scrollInfo != null) { + scrollInfo.removeAll(); + view.remove(scrollInfo); + scrollInfo = null; + } + scrollInfo = new JScrollPane(infoPanel); + scrollInfo.setBounds(20, 200, 270, 730); + scrollInfo.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + scrollInfo.setWheelScrollingEnabled(true); + scrollInfo.getVerticalScrollBar().setUnitIncrement(10); + + for (String name : array) { + JLabel nameLabel = nameLabel(name, offset); + JLabel iconLabel = iconLabel(name, offset); + JLabel valueLabel = valueLabel(offset); + JTextField numField = numField(name, offset); + numFields.add(numField); + JButton importButton = importButton(iconLabel, numField, offset); + JButton selectButton = selectButton(importButton, offset); + JLabel dividerLabel = dividerLabel(offset); + + infoPanel.add(nameLabel); + infoPanel.add(iconLabel); + infoPanel.add(valueLabel); + infoPanel.add(numField); + infoPanel.add(importButton); + infoPanel.add(selectButton); + infoPanel.add(dividerLabel); + + offset += 160; + } + + JButton saveInfo = new JButton("Save CellMap info"); + saveInfo.setBounds(50, offset, 150, 30); + saveInfo.addActionListener(e -> { + for (JTextField field : numFields) { + try { + editor.getCellMap().replace(field.getName(), Integer.parseInt(field.getText())); + } + catch (NumberFormatException ex) { + editor.displayError("Inner Value for " + field.getName() + " is not an Integer."); + return; + } + } + editor.hideError(); + editor.getMapLayers().repaintCellSet(); + scrollInfo.removeAll(); + scrollInfo.revalidate(); + view.remove(scrollInfo); + view.revalidate(); + view.repaint(); + }); + + infoPanel.add(saveInfo); + + scrollInfo.revalidate(); + scrollInfo.requestFocus(); + view.add(scrollInfo); + } + + private JLabel nameLabel(String name, int offset) { + JLabel label = new JLabel("
" + name + "
"); + label.setBounds(0, offset, 250, 20); + return label; + } + + private JLabel iconLabel(String name, int offset) { + JLabel label = new JLabel(); + label.setBounds(0, offset + 40, 50, 50); + if (editor.getImagesOfTiles() != null && editor.getImagesOfTiles().size() > 0) + label.setIcon(new ImageIcon(editor.getImagesOfTiles().get(editor.getCellMap().get(name)).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); + label.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); + return label; + } + + private JLabel valueLabel(int offset) { + JLabel label = new JLabel("Inner Value:"); + label.setBounds(80, offset + 40, 100, 30); + return label; + } + + private JTextField numField(String name, int offset) { + JTextField field = new JTextField(String.valueOf(editor.getCellMap().get(name))); + field.setName(name); + field.setBounds(160, offset + 40, 50, 30); + return field; + } + + private JButton importButton(JLabel iconLabel, JTextField tileNum, int offset) { + JButton button = new JButton("Import selected tile"); + button.setVisible(false); + button.setBounds(100, offset + 100, 150, 30); + button.addActionListener(e -> { + if (!editor.getOverview().getInfo().getText().equals("")) { + iconLabel.setIcon(editor.getOverview().getInfo().getIcon()); + tileNum.setText(editor.getOverview().getInfo().getText().replace("", "").replace("", "")); + } + else { + editor.getOverview().setState(Frame.NORMAL); + editor.getOverview().toFront(); + } + }); + return button; + } + + private JButton selectButton(JButton importButton, int offset) { + JButton button = new JButton("Select tile"); + button.setBounds(0, offset + 100, 90, 30); + button.addActionListener(e -> { + if (editor.getOverview() == null) editor.setOverview(new TilesetOverview()); + else { + editor.getOverview().setState(Frame.NORMAL); + editor.getOverview().toFront(); + } + importButton.setVisible(true); + }); + return button; + } + + private JLabel dividerLabel(int offset) { + JLabel label = new JLabel(); + label.setBounds(0, offset + 140, 255, 1); + label.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); + return label; + } +} diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java index b4694af..8f0e24a 100644 --- a/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java @@ -6,9 +6,11 @@ import ruscz.game.gameOfProd.Windows.WindowOfFreeMove; import javax.swing.*; import java.awt.*; -import java.awt.event.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.util.Arrays; +import java.util.HashMap; import java.util.LinkedList; public class LevelEditor extends JFrame { @@ -16,18 +18,22 @@ public class LevelEditor extends JFrame { private JLayeredPane view; private TilesetOverview overview; private JPanel menu; - private JPanel info; private JLabel errorMessage; - private LinkedList imagesOfTiles; - private Map map; - private int width; - private int height; - + private InfoManager infoManager; + private MapLayersManager mapLayersManager; + private JLayeredPane mapLayers; private JPanel objectSet; private JPanel cellSet; private JPanel tileSet; + private LinkedList imagesOfTiles; + private HashMap cellMap; + private String[][] cellArray; + private Map map; + private int width; + private int height; + public LevelEditor() { view = new JLayeredPane(); view.setBounds(0, 0, 1300, 1000); @@ -140,6 +146,10 @@ public class LevelEditor extends JFrame { this.map = map; this.width = width; this.height = height; + this.cellArray = new String[width][height]; + for (int i = 0; i < width; i++) { + Arrays.fill(cellArray[i], "EMPTY"); + } int[] size = {width, height}; map.setCanvasSize(size); map.getImageCell().readMapFile(); @@ -161,7 +171,7 @@ public class LevelEditor extends JFrame { importTilesets.setVisible(false); importTilesets.addActionListener(e -> { imagesOfTiles = overview.getImagesOfTiles(); - repaintSets(); + mapLayersManager.repaintSets(); }); JButton openTilesets = new JButton("Open Tileset Overview"); @@ -175,24 +185,15 @@ public class LevelEditor extends JFrame { importTilesets.setVisible(true); }); - JLayeredPane mapLayers = new JLayeredPane(); - mapLayers.setPreferredSize(new Dimension(width * 50, height * 50)); - mapLayers.setLayout(null); + mapLayersManager = new MapLayersManager(this); + mapLayers = mapLayersManager.getMapLayers(); + objectSet = mapLayersManager.getObjectSet(); + cellSet = mapLayersManager.getCellSet(); + tileSet = mapLayersManager.getTileSet(); + cellMap = new HashMap<>(); + initializeCellMap(); - 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); + infoManager = new InfoManager(this); JScrollPane mapViewer = new JScrollPane(mapLayers); mapViewer.setBounds(300, 70, 950, 810); @@ -210,7 +211,6 @@ public class LevelEditor extends JFrame { objectBox.addActionListener(actionEvent -> { if (objectSet.isVisible()) objectSet.setVisible(false); else { - objectSet.setBackground(new Color(0, 0, 0, 0)); objectSet.setVisible(true); } }); @@ -239,7 +239,7 @@ public class LevelEditor extends JFrame { errorMessage.setBounds(300, 900, 950, 30); errorMessage.setVisible(false); - repaintSets(); + mapLayersManager.repaintSets(); menu.add(title); menu.add(objectLabel); @@ -252,203 +252,64 @@ public class LevelEditor extends JFrame { menu.add(openTilesets); menu.add(errorMessage); - mapLayers.add(objectSet, JLayeredPane.POPUP_LAYER); - mapLayers.add(cellSet, JLayeredPane.MODAL_LAYER); - mapLayers.add(tileSet, JLayeredPane.DEFAULT_LAYER); - view.add(mapViewer); view.add(menu); view.repaint(); } - private void displayInfo(JLabel label, String layer, int x, int y) { - if (info != null) { - info.removeAll(); - view.remove(info); - info = null; - } - info = new JPanel(); - info.setBounds(20, 200, 260, 730); - info.setLayout(null); - - JLabel infoLabel = new JLabel(); - infoLabel.setBounds(0, 0, 50, 50); - infoLabel.setIcon(label.getIcon()); - infoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); - - JLabel numValue = new JLabel("Inner Value:"); - numValue.setBounds(90, 10, 100, 30); - - JTextField tileNum = new JTextField(label.getName()); - tileNum.setBounds(170, 10, 90, 30); - - JButton importTile = new JButton("Import selected tile"); - importTile.setVisible(false); - importTile.addActionListener(e -> { - if (!overview.getInfo().getText().equals("")) { - infoLabel.setIcon(overview.getInfo().getIcon()); - tileNum.setText(overview.getInfo().getText().replace("", "").replace("", "")); - } - else { - overview.setState(Frame.NORMAL); - overview.toFront(); - } - }); - - JButton selectTile = new JButton("Select tile"); - selectTile.addActionListener(e -> { - if (overview == null) overview = new TilesetOverview(); - else { - overview.setState(Frame.NORMAL); - overview.toFront(); - } - importTile.setVisible(true); - }); - - JButton saveInfo = new JButton("Save tile info"); - - if (layer.equals("object")) { - selectTile.setBounds(50, 100, 150, 30); - - importTile.setBounds(50, 150, 150, 30); - - saveInfo.setBounds(50, 200, 150, 30); - saveInfo.addActionListener(e -> { - if (imagesOfTiles != null) { - if (Integer.parseInt(tileNum.getText()) > imagesOfTiles.size() || Integer.parseInt(tileNum.getText()) < 0) { - displayError("Inner value out of bounds. Value has to bee between 0 and " + (imagesOfTiles.size() - 1) + "."); - return; - } - } - else if (Integer.parseInt(tileNum.getText()) < 0) { - displayError("Inner value out of bounds. Value has to bee higher than 0."); - return; - } - hideError(); - map.getImageCell().getMapForeground()[x][y] = Integer.parseInt(tileNum.getText()); - repaintObjectset(); - info.removeAll(); - view.remove(info); - view.revalidate(); - view.repaint(); - }); - } - - info.add(infoLabel); - info.add(numValue); - info.add(tileNum); - info.add(selectTile); - info.add(importTile); - info.add(saveInfo); - view.add(info); + private void initializeCellMap() { + cellMap.put("BLOCK", 0); + cellMap.put("INTER", 0); + cellMap.put("TRIGGER", 0); + cellMap.put("MOVETO", 0); + cellMap.put("DOOR/DOORTO", 0); + cellMap.put("CHEST", 0); } - private void displayError(String message) { + protected void displayError(String message) { errorMessage.setText("" + message + ""); errorMessage.setVisible(true); } - private void hideError() { errorMessage.setVisible(false); } + protected void hideError() { errorMessage.setVisible(false); } - private void repaintSets() { - repaintObjectset(); - repaintCellSet(); - repaintTileset(); + public JLayeredPane getView() { + return view; } - private 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) { - object.setText("
" + String.valueOf(map.getImageCell().getMapForeground()[i][j]) + "
"); - object.setHorizontalTextPosition(JLabel.CENTER); - } - else if (map.getImageCell().getMapForeground()[i][j] != 0) { - if (map.getImageCell().getMapForeground()[i][j] > imagesOfTiles.size() || map.getImageCell().getMapForeground()[i][j] < 0) { - 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) { - displayInfo(object, "object", x, y); - } - }); - objectSet.add(object); - } - } - view.repaint(); + public TilesetOverview getOverview() { + return overview; } - private 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) { - cell.setText("
" + String.valueOf(map.getMapArray()[i][j]) + "
"); - cell.setHorizontalTextPosition(JLabel.CENTER); - } - else if (map.getMapArray()[i][j] != TypeOfCell.EMPTY) - cell.setIcon(new ImageIcon(imagesOfTiles.get(map.getImageCell().getMapForeground()[i][j]).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); - else cellSet.setOpaque(false); - cell.setName(String.valueOf(map.getMapArray()[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) { - displayInfo(cell, "cell", x, y); - } - }); - cellSet.add(cell); - } - } - view.repaint(); + public Map getMap() { + return map; } - public void repaintTileset() { - tileSet.removeAll(); + public int getMapWidth() { + return width; + } - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - JLabel tile = new JLabel(); - if (imagesOfTiles == null) { - tile.setText("
" + String.valueOf(map.getImageCell().getMapBackground()[i][j]) + "
"); - tile.setHorizontalTextPosition(JLabel.CENTER); - } - else { - if (map.getImageCell().getMapBackground()[i][j] > imagesOfTiles.size() || map.getImageCell().getMapBackground()[i][j] < 0) { - 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) { - displayInfo(tile, "tile", x, y); - } - }); - tileSet.add(tile); - } - } - view.repaint(); + public int getMapHeight() { + return height; + } + + public LinkedList getImagesOfTiles() { + return imagesOfTiles; + } + + public InfoManager getInfoManager() { + return infoManager; + } + + public MapLayersManager getMapLayers() { + return mapLayersManager; + } + + public HashMap getCellMap() { return cellMap; } + + public String[][] getCellArray() { return cellArray; } + + public void setOverview(TilesetOverview overview) { + this.overview = overview; } } diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/MapLayersManager.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/MapLayersManager.java new file mode 100644 index 0000000..156da03 --- /dev/null +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/MapLayersManager.java @@ -0,0 +1,187 @@ +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] + "
"); + cell.setHorizontalTextPosition(JLabel.CENTER); + cellSet.setOpaque(true); + cellSet.setBackground(Color.GREEN); + } + else if (!editor.getCellArray()[i][j].equals("EMPTY")) { + String value; + if (editor.getCellArray()[i][j].equals("DOOR") || editor.getCellArray()[i][j].equals("DOORTO")) value = "DOOR/DOORTO"; + else value = editor.getCellArray()[i][j]; + cell.setIcon(new ImageIcon(imagesOfTiles.get(editor.getCellMap().get(value)).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); + } + 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(); + } + + public JLayeredPane getMapLayers() { + return mapLayers; + } + + public JPanel getObjectSet() { + return objectSet; + } + + public JPanel getCellSet() { + return cellSet; + } + + public JPanel getTileSet() { + return tileSet; + } +}