added level editor

This commit is contained in:
musilto9 2020-05-04 14:29:04 +02:00
parent 414a6602ed
commit 8f4fcf23de
9 changed files with 264 additions and 79 deletions

View File

@ -1,5 +1,6 @@
package ruscz.game.gameOfProd; package ruscz.game.gameOfProd;
import ruscz.game.gameOfProd.LevelEditor.EditorManager;
import ruscz.game.gameOfProd.LevelEditor.TilesetOverview; import ruscz.game.gameOfProd.LevelEditor.TilesetOverview;
import ruscz.game.gameOfProd.Windows.WindowOfBattle; import ruscz.game.gameOfProd.Windows.WindowOfBattle;
import ruscz.game.gameOfProd.Windows.WindowOfFreeMove; import ruscz.game.gameOfProd.Windows.WindowOfFreeMove;
@ -51,7 +52,7 @@ public class Game extends JFrame {
// battle.startBattle(); // battle.startBattle();
//Tohle spustí na začátku tileset overview //Tohle spustí na začátku tileset overview
// new TilesetOverview(); new EditorManager();
setDefaultCloseOperation(EXIT_ON_CLOSE); setDefaultCloseOperation(EXIT_ON_CLOSE);
setUndecorated(true); setUndecorated(true);

View File

@ -21,6 +21,11 @@ public class ImageCell {
private int[][] mapBackground; private int[][] mapBackground;
private int[][] mapForeground; 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) { public void readMapFile(String name) {
try { try {
mapBackground = new int[WindowOfFreeMove.CANVAS_WIDTH][WindowOfFreeMove.CANVAS_HEIGHT]; mapBackground = new int[WindowOfFreeMove.CANVAS_WIDTH][WindowOfFreeMove.CANVAS_HEIGHT];
@ -168,6 +173,10 @@ public class ImageCell {
public ImageDoor getImageDoor() { return imageDoor; } public ImageDoor getImageDoor() { return imageDoor; }
public int[][] getMapForeground() { return mapForeground; }
public int[][] getMapBackground() { return mapBackground; }
public void paintBackground(Graphics g, int x, int y) { public void paintBackground(Graphics g, int x, int y) {
g.drawImage(imagesOfTiles.get(mapBackground[x][y]), x * WindowOfFreeMove.CELL_SIZE, g.drawImage(imagesOfTiles.get(mapBackground[x][y]), x * WindowOfFreeMove.CELL_SIZE,
y * WindowOfFreeMove.CELL_SIZE, WindowOfFreeMove.CELL_SIZE, WindowOfFreeMove.CELL_SIZE, null); y * WindowOfFreeMove.CELL_SIZE, WindowOfFreeMove.CELL_SIZE, WindowOfFreeMove.CELL_SIZE, null);

View File

@ -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();
}
}

View File

@ -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("<html><div style='text-align: center; width: 1200; font-size: 20'>CREATE NEW MAP</div></html>");
titleNew.setBounds(0, 50, 1200, 50);
JLabel nameNew = new JLabel("<html><div style='text-align: center; width: 1200;'>Name of new map</div></html>");
nameNew.setBounds(0, 120, 1200, 20);
JTextField nameVal = new JTextField();
nameVal.setBounds(550, 140, 100, 20);
JLabel widthNew = new JLabel("<html><div style='text-align: center; width: 1200;'>Width of new map (in cells)</div></html>");
widthNew.setBounds(0, 190, 1200, 20);
JTextField widthVal = new JTextField();
widthVal.setBounds(550, 210, 100, 20);
JLabel heightNew = new JLabel("<html><div style='text-align: center; width: 1200;'>Height of new map (in cells)</div></html>");
heightNew.setBounds(0, 260, 1200, 20);
JTextField heightVal = new JTextField();
heightVal.setBounds(550, 280, 100, 20);
JLabel errorInt = new JLabel("<html><div style='text-align: center; width: 1200; color: red'>One or more values is not an Integer.</div></html>");
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("<html><div style='text-align: center; width: 1200; font-size: 20'>EDIT EXISTING MAP</div></html>");
titleEx.setBounds(0, 500, 1200, 50);
JLabel nameEx = new JLabel("<html><div style='text-align: center; width: 1200;'>Name of map</div></html>");
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("<html><div style='font-size: 20'>Currently editing: " + map.getName() + "</div></html>");
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();
}
}

View File

@ -274,6 +274,8 @@ public class Map {
public SoundManager getSoundManager() { return soundManager; } public SoundManager getSoundManager() { return soundManager; }
public void setCanvasSize(int[] size) { canvasSize = size; }
public boolean isBusyCell(int x, int y) { public boolean isBusyCell(int x, int y) {
for (Block cell : block) { for (Block cell : block) {
if (cell.isInBlock(x, y)) if (cell.isInBlock(x, y))

View File

@ -1,65 +0,0 @@
<map>
<mapName>tutorial</mapName>
<events>
<trigger>
<x>11</x>
<y>6</y>
<active>false</active>
</trigger>
</events>
</map>
<map>
<mapName>openspace</mapName>
<events>
<trigger>
<x>6</x>
<y>4</y>
<active>true</active>
</trigger>
<trigger>
<x>14</x>
<y>16</y>
<active>false</active>
</trigger>
<chest>
<x>15</x>
<y>7</y>
<active>false</active>
</chest>
</events>
</map>
<map>
<mapName>office</mapName>
<events>
<trigger>
<x>4</x>
<y>2</y>
<active>false</active>
</trigger>
<chest>
<x>1</x>
<y>9</y>
<active>false</active>
</chest>
</events>
</map>
<map>
<mapName>boss</mapName>
<events>
<trigger>
<x>4</x>
<y>18</y>
<active>true</active>
</trigger>
</events>
</map>
<map>
<mapName>treasure</mapName>
<events>
<trigger>
<x>6</x>
<y>1</y>
<active>true</active>
</trigger>
</events>
</map>

View File

@ -1,6 +0,0 @@
<item>
<name>white-key-card</name>
<multiplicity>1</multiplicity>
<image>19</image>
<action>key</action>
</item>

View File

@ -1,6 +0,0 @@
<location>
<map>office</map>
<x>8</x>
<y>6</y>
<direction>3</direction>
</location>

View File

@ -1 +0,0 @@
TODO: Village