From 79771178906628fe739397d5eba42d4dcb59fd89 Mon Sep 17 00:00:00 2001 From: musilto9 Date: Thu, 14 May 2020 01:25:00 +0200 Subject: [PATCH] added TileSet info and saving --- src/main/java/ruscz/game/gameOfProd/Game.java | 8 +- .../LevelEditor/EditorSaveManager.java | 100 ++++++++++++++++++ .../gameOfProd/LevelEditor/InfoManager.java | 76 +++++++++++-- .../gameOfProd/LevelEditor/LevelEditor.java | 57 ++++++---- .../LevelEditor/TilesetOverview.java | 2 + src/main/resources/maps/1/glade-tileset.txt | 4 +- 6 files changed, 208 insertions(+), 39 deletions(-) create mode 100644 src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorSaveManager.java diff --git a/src/main/java/ruscz/game/gameOfProd/Game.java b/src/main/java/ruscz/game/gameOfProd/Game.java index c45480e..caa5c4c 100644 --- a/src/main/java/ruscz/game/gameOfProd/Game.java +++ b/src/main/java/ruscz/game/gameOfProd/Game.java @@ -1,6 +1,6 @@ package ruscz.game.gameOfProd; -import ruscz.game.gameOfProd.LevelEditor.EditorManager; +import ruscz.game.gameOfProd.LevelEditor.LevelEditor; import ruscz.game.gameOfProd.LevelEditor.TilesetOverview; import ruscz.game.gameOfProd.Windows.WindowOfBattle; import ruscz.game.gameOfProd.Windows.WindowOfFreeMove; @@ -48,11 +48,11 @@ public class Game extends JFrame { // freeMove.start(true); //tohle spustí na začátku bitvu - add(battle); - battle.startBattle(); +// add(battle); +// battle.startBattle(); //Tohle spustí na začátku tileset overview -// new EditorManager(); + new LevelEditor(); setDefaultCloseOperation(EXIT_ON_CLOSE); setUndecorated(true); diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorSaveManager.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorSaveManager.java new file mode 100644 index 0000000..c31db28 --- /dev/null +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorSaveManager.java @@ -0,0 +1,100 @@ +package ruscz.game.gameOfProd.LevelEditor; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class EditorSaveManager { + + private LevelEditor editor; + + public EditorSaveManager(LevelEditor editor) { + this.editor = editor; + } + + public void saveMap() { + boolean isValid = validate(); + if (isValid) { + editor.hideError(); + saveObjectSet(); + saveCellSet(); + saveTileSet(); + editor.displayMessage("Map was successfully saved."); + } + else { + editor.displayError("There is no Tileset imported for this map."); + } + } + + public boolean validate() { + boolean valid = editor.getImagesOfTiles() != null && editor.getImagesOfTiles().size() > 0; + return valid; + } + + private void saveObjectSet() { + try { + FileWriter writer = new FileWriter("src/main/resources/maps/custom/" + editor.getMap().getName() + "-objectset.txt"); + int[][] set = editor.getMap().getImageCell().getMapForeground(); + String info = ""; + for (int i = 0; i < editor.getMapWidth(); i++) { + for (int j = 0; j < editor.getMapHeight(); j++) { + if (j != 0) info += " "; + info += set[i][j]; + } + if (i != editor.getMapWidth() -1) info += System.lineSeparator(); + } + writer.write(info); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void saveCellSet() { + try { + FileWriter writer = new FileWriter("src/main/resources/maps/custom/" + editor.getMap().getName() + ".txt"); + String[][] set = editor.getCellArray(); + String info = editor.getMapWidth() + " " + editor.getMapHeight() + System.lineSeparator(); + for (int i = 0; i < editor.getMapWidth(); i++) { + for (int j = 0; j < editor.getMapHeight(); j++) { + if (j != 0) info += " "; + info += set[i][j]; + } + if (i != editor.getMapWidth() -1) info += System.lineSeparator(); + } + writer.write(info); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void saveTileSet() { + try { + FileWriter writer = new FileWriter("src/main/resources/maps/custom/" + editor.getMap().getName() + "-tileset.txt"); + int[][] set = editor.getMap().getImageCell().getMapBackground(); + String info = ""; + for (String tileset : editor.getOverview().getActiveTilesets()) { + BufferedImage image = ImageIO.read(new File("src/main/resources/tilesets/" + tileset)); + info += " " + tileset + " " + image.getWidth() + " " + image.getHeight() + " 32" + System.lineSeparator(); + } + for (String key : editor.getCellMap().keySet()) { + info += " " + key + " " + editor.getCellMap().get(key) + System.lineSeparator(); + } + info += " DOOR qubodup-DoorOpen01-changed.wav qubodup-DoorClose02-changed.wav doorLocked.wav"; + for (int i = 0; i < editor.getMapWidth(); i++) { + for (int j = 0; j < editor.getMapHeight(); j++) { + if (j != 0) info += " "; + info += set[i][j]; + } + if (i != editor.getMapWidth() -1) info += System.lineSeparator(); + } + writer.write(info); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/InfoManager.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/InfoManager.java index 36b900f..c32d19e 100644 --- a/src/main/java/ruscz/game/gameOfProd/LevelEditor/InfoManager.java +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/InfoManager.java @@ -2,6 +2,9 @@ package ruscz.game.gameOfProd.LevelEditor; import javax.swing.*; import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.Arrays; import java.util.LinkedList; public class InfoManager { @@ -36,18 +39,21 @@ public class InfoManager { switch (layer) { case "object": - displayObjectInfo(label, x, y); + displayObjectAndTileInfo(label, x, y, true); break; case "cell": displayCellInfo(label, x, y); break; + case "tile": + displayObjectAndTileInfo(label, x, y, false); + break; } view.add(info); view.revalidate(); } - private void displayObjectInfo(JLabel label, int x, int y) { + private void displayObjectAndTileInfo(JLabel label, int x, int y, boolean isObject) { JLabel infoLabel = new JLabel(); infoLabel.setBounds(0, 0, 50, 50); infoLabel.setIcon(label.getIcon()); @@ -84,8 +90,40 @@ public class InfoManager { importTile.setVisible(true); }); + JButton setTileToAll = new JButton("Set tile info to whole layer"); + setTileToAll.setBounds(25, 200, 200, 30); + setTileToAll.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(); + if(isObject) { + for (int i = 0; i < editor.getMap().getImageCell().getMapForeground().length; i++) { + Arrays.fill(editor.getMap().getImageCell().getMapForeground()[i], Integer.parseInt(tileNum.getText())); + } + editor.getMapLayers().repaintObjectset(); + } + else { + for (int i = 0; i < editor.getMap().getImageCell().getMapBackground().length; i++) { + Arrays.fill(editor.getMap().getImageCell().getMapBackground()[i], Integer.parseInt(tileNum.getText())); + } + editor.getMapLayers().repaintTileset(); + } + info.removeAll(); + view.remove(info); + view.revalidate(); + view.repaint(); + }); + JButton saveInfo = new JButton("Save tile info"); - saveInfo.setBounds(50, 200, 150, 30); + saveInfo.setBounds(50, 250, 150, 30); saveInfo.addActionListener(e -> { if (editor.getImagesOfTiles() != null) { if (Integer.parseInt(tileNum.getText()) > editor.getImagesOfTiles().size() || Integer.parseInt(tileNum.getText()) < 0) { @@ -98,8 +136,14 @@ public class InfoManager { return; } editor.hideError(); - editor.getMap().getImageCell().getMapForeground()[x][y] = Integer.parseInt(tileNum.getText()); - editor.getMapLayers().repaintObjectset(); + if (isObject) { + editor.getMap().getImageCell().getMapForeground()[x][y] = Integer.parseInt(tileNum.getText()); + editor.getMapLayers().repaintObjectset(); + } + else { + editor.getMap().getImageCell().getMapBackground()[x][y] = Integer.parseInt(tileNum.getText()); + editor.getMapLayers().repaintTileset(); + } info.removeAll(); view.remove(info); view.revalidate(); @@ -111,6 +155,7 @@ public class InfoManager { info.add(tileNum); info.add(selectTile); info.add(importTile); + info.add(setTileToAll); info.add(saveInfo); } @@ -142,8 +187,21 @@ public class InfoManager { 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(); + for (Component component : info.getComponents()) { + component.requestFocus(); + } + }); + cellType.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + for (Component component : info.getComponents()) { + component.requestFocus(); + } + } + @Override public void mousePressed(MouseEvent e) {} + @Override public void mouseReleased(MouseEvent e) {} + @Override public void mouseEntered(MouseEvent e) {} + @Override public void mouseExited(MouseEvent e) {} }); openCellMap.setBounds(30, 70, 200, 30); @@ -174,9 +232,7 @@ public class InfoManager { } private void displayDetailedCellInfo(String type, JButton open, JButton save) { - if (type.equals("BLOCK")) { - upperLowerInfo(open, save); - } + if (type.equals("BLOCK")) upperLowerInfo(open, save); } private void upperLowerInfo(JButton open, JButton save) { diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java index 8f0e24a..7bdb715 100644 --- a/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java @@ -8,10 +8,13 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; +import java.util.concurrent.atomic.AtomicBoolean; public class LevelEditor extends JFrame { @@ -93,25 +96,6 @@ public class LevelEditor extends JFrame { } }); - JLabel titleEx = new JLabel("
EDIT EXISTING MAP
"); - titleEx.setBounds(0, 500, 1300, 50); - - 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(e -> { - try { - //TODO: LevelEditor version of Map class - } - catch (NumberFormatException ex) { - error.setVisible(true); - } - }); - menu.add(titleNew); menu.add(nameNew); menu.add(nameVal); @@ -121,10 +105,6 @@ public class LevelEditor extends JFrame { menu.add(heightVal); menu.add(createNew); menu.add(error); -// menu.add(titleEx); -// menu.add(nameEx); -// menu.add(nameExVal); -// menu.add(editEx); view.add(menu); add(view); @@ -239,6 +219,29 @@ public class LevelEditor extends JFrame { errorMessage.setBounds(300, 900, 950, 30); errorMessage.setVisible(false); + AtomicBoolean save = new AtomicBoolean(false); + JButton saveMap = new JButton("Save Current Map"); + saveMap.setBounds(1050, 900, 200, 30); + saveMap.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + new EditorSaveManager(getEditor()).saveMap(); + } + + @Override public void mousePressed(MouseEvent e) {} + @Override public void mouseReleased(MouseEvent e) {} + + @Override + public void mouseEntered(MouseEvent e) { + displayMessage("Proceeding will overwrite any previous data for map with this name. To proceed click 'Save Current Map' again."); + } + + @Override + public void mouseExited(MouseEvent e) { + hideError(); + } + }); + mapLayersManager.repaintSets(); menu.add(title); @@ -251,6 +254,7 @@ public class LevelEditor extends JFrame { menu.add(importTilesets); menu.add(openTilesets); menu.add(errorMessage); + menu.add(saveMap); view.add(mapViewer); view.add(menu); @@ -271,6 +275,11 @@ public class LevelEditor extends JFrame { errorMessage.setVisible(true); } + protected void displayMessage(String message) { + errorMessage.setText(message); + errorMessage.setVisible(true); + } + protected void hideError() { errorMessage.setVisible(false); } public JLayeredPane getView() { @@ -312,4 +321,6 @@ public class LevelEditor extends JFrame { public void setOverview(TilesetOverview overview) { this.overview = overview; } + + public LevelEditor getEditor() { return this; } } diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/TilesetOverview.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/TilesetOverview.java index 700fe3e..9703ae6 100644 --- a/src/main/java/ruscz/game/gameOfProd/LevelEditor/TilesetOverview.java +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/TilesetOverview.java @@ -149,5 +149,7 @@ public class TilesetOverview extends JFrame { public LinkedList getImagesOfTiles() { return imagesOfTiles; } + public LinkedList getActiveTilesets() { return activeTilesets; } + public JLabel getInfo() { return info; } } diff --git a/src/main/resources/maps/1/glade-tileset.txt b/src/main/resources/maps/1/glade-tileset.txt index cebae29..83c95e9 100644 --- a/src/main/resources/maps/1/glade-tileset.txt +++ b/src/main/resources/maps/1/glade-tileset.txt @@ -1,5 +1,5 @@ - A2_Ground.png 512 384 32 192 - D_OutDoor.png 512 512 32 256 + A2_Ground.png 512 384 32 + D_OutDoor.png 512 512 32 BLOCK 120 MOVETO 277 EVENT 334