From 51f7d55560d01f24e695c732fdbe044699c9f304 Mon Sep 17 00:00:00 2001 From: musilto9 Date: Mon, 4 May 2020 23:57:06 +0200 Subject: [PATCH] improved added importing to level editor --- .../gameOfProd/LevelEditor/EditorManager.java | 1 - .../gameOfProd/LevelEditor/LevelEditor.java | 320 +++++++++++++----- .../LevelEditor/TilesetOverview.java | 4 + 3 files changed, 246 insertions(+), 79 deletions(-) diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorManager.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorManager.java index ec47c5b..cc8f1dc 100644 --- a/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorManager.java +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorManager.java @@ -6,7 +6,6 @@ public class EditorManager { private LevelEditor editor; public EditorManager() { - overview = new TilesetOverview(); editor = new LevelEditor(); } } diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java index 6a60703..c62bc8d 100644 --- a/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java @@ -5,49 +5,60 @@ import ruscz.game.gameOfProd.Map.Map; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.event.*; +import java.awt.image.BufferedImage; import java.util.Arrays; +import java.util.LinkedList; public class LevelEditor extends JFrame { private JLayeredPane view; + private TilesetOverview overview; + private JPanel menu; + private JPanel info; + + private LinkedList imagesOfTiles; + private Map map; + private int width; + private int height; + + private JPanel objectSet; + private JPanel cellSet; + private JPanel tileSet; public LevelEditor() { view = new JLayeredPane(); - view.setBounds(0, 0, 1200, 1000); + view.setBounds(0, 0, 1300, 1000); view.setLayout(null); - view.setVisible(true); - JPanel menu = new JPanel(); - menu.setBounds(0, 0, 1200, 1000); + menu = new JPanel(); + menu.setBounds(0, 0, 1300, 1000); menu.setLayout(null); - menu.setVisible(true); - JLabel titleNew = new JLabel("
CREATE NEW MAP
"); - titleNew.setBounds(0, 50, 1200, 50); + JLabel titleNew = new JLabel("
CREATE NEW MAP
"); + titleNew.setBounds(0, 50, 1300, 50); - JLabel nameNew = new JLabel("
Name of new map
"); - nameNew.setBounds(0, 120, 1200, 20); + JLabel nameNew = new JLabel("
Name of new map
"); + nameNew.setBounds(0, 120, 1300, 20); JTextField nameVal = new JTextField(); - nameVal.setBounds(550, 140, 100, 20); + nameVal.setBounds(600, 140, 100, 20); - JLabel widthNew = new JLabel("
Width of new map (in cells)
"); - widthNew.setBounds(0, 190, 1200, 20); + JLabel widthNew = new JLabel("
Width of new map (in cells)
"); + widthNew.setBounds(0, 190, 1300, 20); JTextField widthVal = new JTextField(); - widthVal.setBounds(550, 210, 100, 20); + widthVal.setBounds(600, 210, 100, 20); - JLabel heightNew = new JLabel("
Height of new map (in cells)
"); - heightNew.setBounds(0, 260, 1200, 20); + JLabel heightNew = new JLabel("
Height of new map (in cells)
"); + heightNew.setBounds(0, 260, 1300, 20); JTextField heightVal = new JTextField(); - heightVal.setBounds(550, 280, 100, 20); + heightVal.setBounds(600, 280, 100, 20); - JLabel errorInt = new JLabel("
One or more values is not an Integer.
"); - errorInt.setBounds(0, 400, 1200, 20); + JLabel errorInt = new JLabel("
One or more values is not an Integer.
"); + errorInt.setBounds(0, 400, 1300, 20); errorInt.setVisible(false); JButton createNew = new JButton("CREATE NEW MAP"); - createNew.setBounds(500, 330, 200, 50); + createNew.setBounds(550, 330, 200, 50); createNew.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -68,25 +79,22 @@ public class LevelEditor extends JFrame { } }); - JLabel titleEx = new JLabel("
EDIT EXISTING MAP
"); - titleEx.setBounds(0, 500, 1200, 50); + JLabel titleEx = new JLabel("
EDIT EXISTING MAP
"); + titleEx.setBounds(0, 500, 1300, 50); - JLabel nameEx = new JLabel("
Name of map
"); - nameEx.setBounds(0, 570, 1200, 20); + JLabel nameEx = new JLabel("
Name of map
"); + nameEx.setBounds(0, 570, 1300, 20); JTextField nameExVal = new JTextField(); nameExVal.setBounds(550, 590, 100, 20); JButton editEx = new JButton("EDIT EXISTING MAP"); editEx.setBounds(500, 640, 200, 50); - editEx.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - try { - //TODO: LevelEditor version of Map class - } - catch (NumberFormatException ex) { - errorInt.setVisible(true); - } + editEx.addActionListener(e -> { + try { + //TODO: LevelEditor version of Map class + } + catch (NumberFormatException ex) { + errorInt.setVisible(true); } }); @@ -99,15 +107,15 @@ public class LevelEditor extends JFrame { menu.add(heightVal); menu.add(createNew); menu.add(errorInt); - menu.add(titleEx); - menu.add(nameEx); - menu.add(nameExVal); - menu.add(editEx); +// menu.add(titleEx); +// menu.add(nameEx); +// menu.add(nameExVal); +// menu.add(editEx); view.add(menu); add(view); setDefaultCloseOperation(EXIT_ON_CLOSE); - setBounds(0, 0, 1200, 1000); + setBounds(0, 0, 1300, 1000); setLocationRelativeTo(null); setLayout(null); setVisible(true); @@ -116,52 +124,70 @@ public class LevelEditor extends JFrame { private void createNewMap(String name, int width, int height) { TypeOfCell[][] mapArray = new TypeOfCell[width][height]; - for (int i = 0; i < height; i++) { + for (int i = 0; i < width; i++) { Arrays.fill(mapArray[i], TypeOfCell.EMPTY); } Map map = new Map(mapArray); map.setName(name); + this.map = map; + this.width = width; + this.height = height; int[] size = {width, height}; map.setCanvasSize(size); map.getImageCell().readMapFile(); - startMapEditor(map, width, height); + startMapEditor(); } - private void startMapEditor(Map map, int width, int height) { + private void startMapEditor() { JPanel menu = new JPanel(); - menu.setBounds(0, 0, 1200, 1000); + menu.setBounds(0, 0, 1300, 1000); menu.setLayout(null); menu.setVisible(true); JLabel title = new JLabel("
Currently editing: " + map.getName() + "
"); title.setBounds(20, 10, 400, 50); + JButton importTilesets = new JButton("Import Tilesets"); + importTilesets.setBounds(20, 120, 260, 30); + importTilesets.setVisible(false); + importTilesets.addActionListener(e -> { + imagesOfTiles = overview.getImagesOfTiles(); + repaintSets(); + }); + + JButton openTilesets = new JButton("Open Tileset Overview"); + openTilesets.setBounds(20, 70, 260, 30); + openTilesets.addActionListener(e -> { + if (overview == null) overview = new TilesetOverview(); + else overview.setState(Frame.NORMAL); + importTilesets.setVisible(true); + }); + JLayeredPane mapLayers = new JLayeredPane(); mapLayers.setPreferredSize(new Dimension(width * 50, height * 50)); mapLayers.setLayout(null); - mapLayers.setVisible(true); - JPanel objectSet = new JPanel(); + objectSet = new JPanel(); objectSet.setBounds(0, 0, width * 50, height * 50); objectSet.setLayout(null); - objectSet.setVisible(true); objectSet.setBackground(Color.RED); + objectSet.setOpaque(true); - JPanel cellSet = new JPanel(); + cellSet = new JPanel(); cellSet.setBounds(0, 0, width * 50, height * 50); cellSet.setLayout(null); - cellSet.setVisible(true); cellSet.setBackground(Color.GREEN); + cellSet.setOpaque(true); - JPanel tileSet = new JPanel(); + tileSet = new JPanel(); tileSet.setBounds(0, 0, width * 50, height * 50); tileSet.setLayout(null); - tileSet.setVisible(true); tileSet.setBackground(Color.BLUE); + tileSet.setOpaque(true); JScrollPane mapViewer = new JScrollPane(mapLayers); - mapViewer.setBounds(200, 70, 950, 860); + mapViewer.setBounds(300, 70, 950, 860); mapViewer.setVisible(true); mapViewer.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); mapViewer.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); @@ -177,14 +203,6 @@ public class LevelEditor extends JFrame { if (objectSet.isVisible()) objectSet.setVisible(false); else objectSet.setVisible(true); }); - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - JLabel object = new JLabel(String.valueOf(map.getImageCell().getMapForeground()[i][j]), JLabel.CENTER); - object.setHorizontalTextPosition(JLabel.CENTER); - object.setBounds(i * 50, j * 50, 50, 50); - objectSet.add(object); - } - } JLabel cellLabel = new JLabel("Physical (cell) Layer"); cellLabel.setBounds( 700, 30, 150, 20); @@ -195,14 +213,6 @@ public class LevelEditor extends JFrame { if (cellSet.isVisible()) cellSet.setVisible(false); else cellSet.setVisible(true); }); - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - JLabel cell = new JLabel(String.valueOf(map.getMapArray()[i][j]), JLabel.CENTER); - cell.setHorizontalTextPosition(JLabel.CENTER); - cell.setBounds(i * 50, j * 50, 50, 50); - cellSet.add(cell); - } - } JLabel tileLabel = new JLabel("Tile Layer"); tileLabel.setBounds( 950, 30, 100, 20); @@ -213,14 +223,8 @@ public class LevelEditor extends JFrame { if (tileSet.isVisible()) tileSet.setVisible(false); else tileSet.setVisible(true); }); - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - JLabel tile = new JLabel(String.valueOf(map.getImageCell().getMapBackground()[i][j]), JLabel.CENTER); - tile.setHorizontalTextPosition(JLabel.CENTER); - tile.setBounds(i * 50, j * 50, 50, 50); - tileSet.add(tile); - } - } + + repaintSets(); menu.add(title); menu.add(objectLabel); @@ -229,11 +233,171 @@ public class LevelEditor extends JFrame { menu.add(cellBox); menu.add(tileLabel); menu.add(tileBox); - mapLayers.add(objectSet); - mapLayers.add(cellSet); - mapLayers.add(tileSet); + menu.add(importTilesets); + menu.add(openTilesets); + + mapLayers.add(objectSet, JLayeredPane.MODAL_LAYER); + mapLayers.add(cellSet, JLayeredPane.MODAL_LAYER); + mapLayers.add(tileSet, JLayeredPane.MODAL_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("Number value:"); + numValue.setBounds(70, 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.addActionListener(e -> { + if (!overview.getInfo().getText().equals("")) { + infoLabel.setIcon(overview.getInfo().getIcon()); + tileNum.setText(overview.getInfo().getText().replace("", "").replace("", "")); + } + else overview.setState(Frame.NORMAL); + }); + + JButton selectTile = new JButton("Select tile"); + selectTile.addActionListener(e -> { + if (overview == null) overview = new TilesetOverview(); + else overview.setState(Frame.NORMAL); + importTile.setVisible(true); + }); + + JButton saveInfo = new JButton("Save tile info"); + saveInfo.addActionListener(e -> { + map.getImageCell().getMapForeground()[x][y] = Integer.parseInt(tileNum.getText()); + repaintObjectset(); + info.removeAll(); + view.remove(info); + view.revalidate(); + view.repaint(); + }); + + if (layer.equals("object")) { + selectTile.setBounds(20, 100, 150, 30); + + importTile.setBounds(20, 150, 150, 30); + + saveInfo.setBounds(20, 200, 150, 30); + } + + info.add(infoLabel); + info.add(numValue); + info.add(tileNum); + info.add(selectTile); + info.add(importTile); + info.add(saveInfo); + view.add(info); + } + + private void repaintSets() { + repaintObjectset(); + repaintCellSet(); + repaintTileset(); + } + + 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) { + object.setIcon(new ImageIcon(imagesOfTiles.get(map.getImageCell().getMapForeground()[i][j]).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); + } + 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(); + } + + 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 + cell.setIcon(new ImageIcon(imagesOfTiles.get(map.getImageCell().getMapForeground()[i][j]).getScaledInstance(50, 50, Image.SCALE_DEFAULT))); + 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 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) { + tile.setText("
" + String.valueOf(map.getImageCell().getMapBackground()[i][j]) + "
"); + tile.setHorizontalTextPosition(JLabel.CENTER); + } + else + 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(); + } } diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/TilesetOverview.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/TilesetOverview.java index 84ff5e5..700fe3e 100644 --- a/src/main/java/ruscz/game/gameOfProd/LevelEditor/TilesetOverview.java +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/TilesetOverview.java @@ -146,4 +146,8 @@ public class TilesetOverview extends JFrame { } view.repaint(); } + + public LinkedList getImagesOfTiles() { return imagesOfTiles; } + + public JLabel getInfo() { return info; } }