improved added importing to level editor

This commit is contained in:
musilto9 2020-05-04 23:57:06 +02:00
parent 8f4fcf23de
commit 51f7d55560
3 changed files with 246 additions and 79 deletions

View File

@ -6,7 +6,6 @@ public class EditorManager {
private LevelEditor editor;
public EditorManager() {
overview = new TilesetOverview();
editor = new LevelEditor();
}
}

View File

@ -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<BufferedImage> 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("<html><div style='text-align: center; width: 1200; font-size: 20'>CREATE NEW MAP</div></html>");
titleNew.setBounds(0, 50, 1200, 50);
JLabel titleNew = new JLabel("<html><div style='text-align: center; width: 1300; font-size: 20'>CREATE NEW MAP</div></html>");
titleNew.setBounds(0, 50, 1300, 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);
JLabel nameNew = new JLabel("<html><div style='text-align: center; width: 1300;'>Name of new map</div></html>");
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("<html><div style='text-align: center; width: 1200;'>Width of new map (in cells)</div></html>");
widthNew.setBounds(0, 190, 1200, 20);
JLabel widthNew = new JLabel("<html><div style='text-align: center; width: 1300;'>Width of new map (in cells)</div></html>");
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("<html><div style='text-align: center; width: 1200;'>Height of new map (in cells)</div></html>");
heightNew.setBounds(0, 260, 1200, 20);
JLabel heightNew = new JLabel("<html><div style='text-align: center; width: 1300;'>Height of new map (in cells)</div></html>");
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("<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);
JLabel errorInt = new JLabel("<html><div style='text-align: center; width: 1300; color: red'>One or more values is not an Integer.</div></html>");
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,26 +79,23 @@ public class LevelEditor extends JFrame {
}
});
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 titleEx = new JLabel("<html><div style='text-align: center; width: 1230; font-size: 20'>EDIT EXISTING MAP</div></html>");
titleEx.setBounds(0, 500, 1300, 50);
JLabel nameEx = new JLabel("<html><div style='text-align: center; width: 1200;'>Name of map</div></html>");
nameEx.setBounds(0, 570, 1200, 20);
JLabel nameEx = new JLabel("<html><div style='text-align: center; width: 1230;'>Name of map</div></html>");
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) {
editEx.addActionListener(e -> {
try {
//TODO: LevelEditor version of Map class
}
catch (NumberFormatException ex) {
errorInt.setVisible(true);
}
}
});
menu.add(titleNew);
@ -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("<html><div style='font-size: 20'>Currently editing: " + map.getName() + "</div></html>");
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("<html><span color='black'>", "").replace("</span></html>", ""));
}
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("<html><div style='text-align: center; width: 50'>" + String.valueOf(map.getImageCell().getMapForeground()[i][j]) + "</div></html>");
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("<html><div style='text-align: center; width: 50'>" + String.valueOf(map.getMapArray()[i][j]) + "</div></html>");
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("<html><div style='text-align: center; width: 50'>" + String.valueOf(map.getImageCell().getMapBackground()[i][j]) + "</div></html>");
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();
}
}

View File

@ -146,4 +146,8 @@ public class TilesetOverview extends JFrame {
}
view.repaint();
}
public LinkedList<BufferedImage> getImagesOfTiles() { return imagesOfTiles; }
public JLabel getInfo() { return info; }
}