From 8f4fcf23de905d6764608168251a1cfdf2b7793f Mon Sep 17 00:00:00 2001 From: musilto9 Date: Mon, 4 May 2020 14:29:04 +0200 Subject: [PATCH] added level editor --- src/main/java/ruscz/game/gameOfProd/Game.java | 3 +- .../game/gameOfProd/Image/ImageCell.java | 9 + .../gameOfProd/LevelEditor/EditorManager.java | 12 + .../gameOfProd/LevelEditor/LevelEditor.java | 239 ++++++++++++++++++ .../java/ruscz/game/gameOfProd/Map/Map.java | 2 + src/main/resources/save/savedGame/events.txt | 65 ----- .../resources/save/savedGame/inventory.txt | 6 - src/main/resources/save/savedGame/person.txt | 6 - src/main/resources/save/savedGame/village.txt | 1 - 9 files changed, 264 insertions(+), 79 deletions(-) create mode 100644 src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorManager.java create mode 100644 src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java diff --git a/src/main/java/ruscz/game/gameOfProd/Game.java b/src/main/java/ruscz/game/gameOfProd/Game.java index c40d6b5..3d7fe30 100644 --- a/src/main/java/ruscz/game/gameOfProd/Game.java +++ b/src/main/java/ruscz/game/gameOfProd/Game.java @@ -1,5 +1,6 @@ package ruscz.game.gameOfProd; +import ruscz.game.gameOfProd.LevelEditor.EditorManager; import ruscz.game.gameOfProd.LevelEditor.TilesetOverview; import ruscz.game.gameOfProd.Windows.WindowOfBattle; import ruscz.game.gameOfProd.Windows.WindowOfFreeMove; @@ -51,7 +52,7 @@ public class Game extends JFrame { // battle.startBattle(); //Tohle spustí na začátku tileset overview -// new TilesetOverview(); + new EditorManager(); setDefaultCloseOperation(EXIT_ON_CLOSE); setUndecorated(true); diff --git a/src/main/java/ruscz/game/gameOfProd/Image/ImageCell.java b/src/main/java/ruscz/game/gameOfProd/Image/ImageCell.java index d71e151..d6cc2a9 100644 --- a/src/main/java/ruscz/game/gameOfProd/Image/ImageCell.java +++ b/src/main/java/ruscz/game/gameOfProd/Image/ImageCell.java @@ -21,6 +21,11 @@ public class ImageCell { private int[][] mapBackground; private int[][] mapForeground; + public void readMapFile() { + mapBackground = new int[WindowOfFreeMove.CANVAS_WIDTH][WindowOfFreeMove.CANVAS_HEIGHT]; + mapForeground = new int[WindowOfFreeMove.CANVAS_WIDTH][WindowOfFreeMove.CANVAS_HEIGHT]; + } + public void readMapFile(String name) { try { mapBackground = new int[WindowOfFreeMove.CANVAS_WIDTH][WindowOfFreeMove.CANVAS_HEIGHT]; @@ -168,6 +173,10 @@ public class ImageCell { public ImageDoor getImageDoor() { return imageDoor; } + public int[][] getMapForeground() { return mapForeground; } + + public int[][] getMapBackground() { return mapBackground; } + public void paintBackground(Graphics g, int x, int y) { g.drawImage(imagesOfTiles.get(mapBackground[x][y]), x * WindowOfFreeMove.CELL_SIZE, y * WindowOfFreeMove.CELL_SIZE, WindowOfFreeMove.CELL_SIZE, WindowOfFreeMove.CELL_SIZE, null); diff --git a/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorManager.java b/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorManager.java new file mode 100644 index 0000000..ec47c5b --- /dev/null +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/EditorManager.java @@ -0,0 +1,12 @@ +package ruscz.game.gameOfProd.LevelEditor; + +public class EditorManager { + + private TilesetOverview overview; + 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 new file mode 100644 index 0000000..6a60703 --- /dev/null +++ b/src/main/java/ruscz/game/gameOfProd/LevelEditor/LevelEditor.java @@ -0,0 +1,239 @@ +package ruscz.game.gameOfProd.LevelEditor; + +import ruscz.game.gameOfProd.Cells.TypeOfCell; +import ruscz.game.gameOfProd.Map.Map; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; + +public class LevelEditor extends JFrame { + + private JLayeredPane view; + + public LevelEditor() { + view = new JLayeredPane(); + view.setBounds(0, 0, 1200, 1000); + view.setLayout(null); + view.setVisible(true); + + JPanel menu = new JPanel(); + menu.setBounds(0, 0, 1200, 1000); + menu.setLayout(null); + menu.setVisible(true); + + JLabel titleNew = new JLabel("
CREATE NEW MAP
"); + titleNew.setBounds(0, 50, 1200, 50); + + JLabel nameNew = new JLabel("
Name of new map
"); + nameNew.setBounds(0, 120, 1200, 20); + JTextField nameVal = new JTextField(); + nameVal.setBounds(550, 140, 100, 20); + + JLabel widthNew = new JLabel("
Width of new map (in cells)
"); + widthNew.setBounds(0, 190, 1200, 20); + JTextField widthVal = new JTextField(); + widthVal.setBounds(550, 210, 100, 20); + + JLabel heightNew = new JLabel("
Height of new map (in cells)
"); + heightNew.setBounds(0, 260, 1200, 20); + JTextField heightVal = new JTextField(); + heightVal.setBounds(550, 280, 100, 20); + + JLabel errorInt = new JLabel("
One or more values is not an Integer.
"); + errorInt.setBounds(0, 400, 1200, 20); + errorInt.setVisible(false); + + JButton createNew = new JButton("CREATE NEW MAP"); + createNew.setBounds(500, 330, 200, 50); + createNew.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + try { + String name = nameVal.getText(); + int width = Integer.parseInt(widthVal.getText()); + int height = Integer.parseInt(heightVal.getText()); + menu.removeAll(); + menu.setVisible(false); + view.remove(menu); + view.revalidate(); + view.repaint(); + createNewMap(name, width, height); + } + catch (NumberFormatException ex) { + errorInt.setVisible(true); + } + } + }); + + JLabel titleEx = new JLabel("
EDIT EXISTING MAP
"); + titleEx.setBounds(0, 500, 1200, 50); + + JLabel nameEx = new JLabel("
Name of map
"); + nameEx.setBounds(0, 570, 1200, 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); + } + } + }); + + menu.add(titleNew); + menu.add(nameNew); + menu.add(nameVal); + menu.add(widthNew); + menu.add(widthVal); + menu.add(heightNew); + menu.add(heightVal); + menu.add(createNew); + menu.add(errorInt); + 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); + setLocationRelativeTo(null); + setLayout(null); + setVisible(true); + setResizable(false); + } + + private void createNewMap(String name, int width, int height) { + TypeOfCell[][] mapArray = new TypeOfCell[width][height]; + for (int i = 0; i < height; i++) { + Arrays.fill(mapArray[i], TypeOfCell.EMPTY); + } + Map map = new Map(mapArray); + map.setName(name); + int[] size = {width, height}; + map.setCanvasSize(size); + map.getImageCell().readMapFile(); + startMapEditor(map, width, height); + } + + private void startMapEditor(Map map, int width, int height) { + + JPanel menu = new JPanel(); + menu.setBounds(0, 0, 1200, 1000); + menu.setLayout(null); + menu.setVisible(true); + + JLabel title = new JLabel("
Currently editing: " + map.getName() + "
"); + title.setBounds(20, 10, 400, 50); + + JLayeredPane mapLayers = new JLayeredPane(); + mapLayers.setPreferredSize(new Dimension(width * 50, height * 50)); + mapLayers.setLayout(null); + mapLayers.setVisible(true); + + JPanel objectSet = new JPanel(); + objectSet.setBounds(0, 0, width * 50, height * 50); + objectSet.setLayout(null); + objectSet.setVisible(true); + objectSet.setBackground(Color.RED); + + JPanel cellSet = new JPanel(); + cellSet.setBounds(0, 0, width * 50, height * 50); + cellSet.setLayout(null); + cellSet.setVisible(true); + cellSet.setBackground(Color.GREEN); + + JPanel tileSet = new JPanel(); + tileSet.setBounds(0, 0, width * 50, height * 50); + tileSet.setLayout(null); + tileSet.setVisible(true); + tileSet.setBackground(Color.BLUE); + + JScrollPane mapViewer = new JScrollPane(mapLayers); + mapViewer.setBounds(200, 70, 950, 860); + mapViewer.setVisible(true); + mapViewer.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + mapViewer.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + mapViewer.setWheelScrollingEnabled(true); + mapViewer.getVerticalScrollBar().setUnitIncrement(10); + + JLabel objectLabel = new JLabel("Object Layer"); + objectLabel.setBounds( 500, 30, 100, 20); + JCheckBox objectBox = new JCheckBox(); + objectBox.setBounds(600, 30, 30, 20); + objectBox.setSelected(true); + objectBox.addActionListener(actionEvent -> { + 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); + JCheckBox cellBox = new JCheckBox(); + cellBox.setBounds(850, 30, 30, 20); + cellBox.setSelected(true); + cellBox.addActionListener(actionEvent -> { + 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); + JCheckBox tileBox = new JCheckBox(); + tileBox.setBounds(1030, 30, 30, 20); + tileBox.setSelected(true); + tileBox.addActionListener(actionEvent -> { + 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); + } + } + + menu.add(title); + menu.add(objectLabel); + menu.add(objectBox); + menu.add(cellLabel); + menu.add(cellBox); + menu.add(tileLabel); + menu.add(tileBox); + mapLayers.add(objectSet); + mapLayers.add(cellSet); + mapLayers.add(tileSet); + view.add(mapViewer); + view.add(menu); + view.repaint(); + } +} diff --git a/src/main/java/ruscz/game/gameOfProd/Map/Map.java b/src/main/java/ruscz/game/gameOfProd/Map/Map.java index fd3b373..a4454d7 100644 --- a/src/main/java/ruscz/game/gameOfProd/Map/Map.java +++ b/src/main/java/ruscz/game/gameOfProd/Map/Map.java @@ -274,6 +274,8 @@ public class Map { public SoundManager getSoundManager() { return soundManager; } + public void setCanvasSize(int[] size) { canvasSize = size; } + public boolean isBusyCell(int x, int y) { for (Block cell : block) { if (cell.isInBlock(x, y)) diff --git a/src/main/resources/save/savedGame/events.txt b/src/main/resources/save/savedGame/events.txt index 24d3470..e69de29 100644 --- a/src/main/resources/save/savedGame/events.txt +++ b/src/main/resources/save/savedGame/events.txt @@ -1,65 +0,0 @@ - - tutorial - - - 11 - 6 - false - - - - - openspace - - - 6 - 4 - true - - - 14 - 16 - false - - - 15 - 7 - false - - - - - office - - - 4 - 2 - false - - - 1 - 9 - false - - - - - boss - - - 4 - 18 - true - - - - - treasure - - - 6 - 1 - true - - - diff --git a/src/main/resources/save/savedGame/inventory.txt b/src/main/resources/save/savedGame/inventory.txt index 5c77ce0..e69de29 100644 --- a/src/main/resources/save/savedGame/inventory.txt +++ b/src/main/resources/save/savedGame/inventory.txt @@ -1,6 +0,0 @@ - - white-key-card - 1 - 19 - key - diff --git a/src/main/resources/save/savedGame/person.txt b/src/main/resources/save/savedGame/person.txt index d7aae53..e69de29 100644 --- a/src/main/resources/save/savedGame/person.txt +++ b/src/main/resources/save/savedGame/person.txt @@ -1,6 +0,0 @@ - - office - 8 - 6 - 3 - \ No newline at end of file diff --git a/src/main/resources/save/savedGame/village.txt b/src/main/resources/save/savedGame/village.txt index 1b4bc7b..e69de29 100644 --- a/src/main/resources/save/savedGame/village.txt +++ b/src/main/resources/save/savedGame/village.txt @@ -1 +0,0 @@ -TODO: Village \ No newline at end of file