231 lines
9.0 KiB
Java
231 lines
9.0 KiB
Java
package ruscz.game.gameOfProd.LevelEditor;
|
|
|
|
import ruscz.game.gameOfProd.Map.Map;
|
|
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
import java.awt.event.MouseAdapter;
|
|
import java.awt.event.MouseEvent;
|
|
import java.awt.image.BufferedImage;
|
|
import java.util.LinkedList;
|
|
|
|
public class MapLayersManager {
|
|
|
|
private LevelEditor editor;
|
|
private JLayeredPane view;
|
|
private Map map;
|
|
private LinkedList<BufferedImage> imagesOfTiles;
|
|
|
|
private JLayeredPane mapLayers;
|
|
private JPanel objectSet;
|
|
private JPanel cellSet;
|
|
private JPanel tileSet;
|
|
|
|
private int width;
|
|
private int height;
|
|
|
|
public MapLayersManager(LevelEditor editor) {
|
|
this.editor = editor;
|
|
view = editor.getView();
|
|
map = editor.getMap();
|
|
imagesOfTiles = editor.getImagesOfTiles();
|
|
width = editor.getMapWidth();
|
|
height = editor.getMapHeight();
|
|
|
|
mapLayers = new JLayeredPane();
|
|
mapLayers.setPreferredSize(new Dimension(width * 50, height * 50));
|
|
mapLayers.setLayout(null);
|
|
|
|
objectSet = new JPanel();
|
|
objectSet.setBounds(0, 0, width * 50, height * 50);
|
|
objectSet.setLayout(null);
|
|
objectSet.setBackground(Color.RED);
|
|
|
|
cellSet = new JPanel();
|
|
cellSet.setBounds(0, 0, width * 50, height * 50);
|
|
cellSet.setLayout(null);
|
|
cellSet.setBackground(Color.GREEN);
|
|
|
|
tileSet = new JPanel();
|
|
tileSet.setBounds(0, 0, width * 50, height * 50);
|
|
tileSet.setLayout(null);
|
|
tileSet.setBackground(Color.BLUE);
|
|
|
|
mapLayers.add(objectSet, JLayeredPane.POPUP_LAYER);
|
|
mapLayers.add(cellSet, JLayeredPane.MODAL_LAYER);
|
|
mapLayers.add(tileSet, JLayeredPane.DEFAULT_LAYER);
|
|
}
|
|
|
|
protected void repaintSets() {
|
|
imagesOfTiles = editor.getImagesOfTiles();
|
|
repaintObjectset();
|
|
repaintCellSet();
|
|
repaintTileset();
|
|
}
|
|
|
|
protected 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 || imagesOfTiles.size() == 0) {
|
|
object.setText("<html><div style='text-align: center; width: 50'>" + String.valueOf(map.getImageCell().getMapForeground()[i][j]) + "</div></html>");
|
|
object.setHorizontalTextPosition(JLabel.CENTER);
|
|
objectSet.setOpaque(true);
|
|
objectSet.setBackground(Color.RED);
|
|
}
|
|
else if (map.getImageCell().getMapForeground()[i][j] != 0) {
|
|
if (map.getImageCell().getMapForeground()[i][j] > imagesOfTiles.size() || map.getImageCell().getMapForeground()[i][j] < 0) {
|
|
editor.displayError("Inner Value out of bounds for current tileset was found on position " + i + ":" + j + " on Object Layer. Defaulting to 0.");
|
|
map.getImageCell().getMapForeground()[i][j] = 0;
|
|
}
|
|
object.setIcon(new ImageIcon(imagesOfTiles.get(map.getImageCell().getMapForeground()[i][j]).getScaledInstance(50, 50, Image.SCALE_DEFAULT)));
|
|
}
|
|
else objectSet.setOpaque(false);
|
|
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) {
|
|
editor.getInfoManager().displayInfo(object, "object", x, y);
|
|
}
|
|
});
|
|
objectSet.add(object);
|
|
}
|
|
}
|
|
view.repaint();
|
|
}
|
|
|
|
protected 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 || imagesOfTiles.size() == 0) {
|
|
cell.setText("<html><div style='text-align: center; width: 50'>" + editor.getCellArray()[i][j].split(",")[0].toUpperCase() + "</div></html>");
|
|
cell.setHorizontalTextPosition(JLabel.CENTER);
|
|
cellSet.setOpaque(true);
|
|
cellSet.setBackground(Color.GREEN);
|
|
}
|
|
else if (!editor.getCellArray()[i][j].split(",")[0].toUpperCase().equals("EMPTY")) {
|
|
setCellIcon(cell, i, j);
|
|
}
|
|
else cellSet.setOpaque(false);
|
|
cell.setName(String.valueOf(editor.getCellArray()[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) {
|
|
editor.getInfoManager().displayInfo(cell, "cell", x, y);
|
|
}
|
|
});
|
|
cellSet.add(cell);
|
|
}
|
|
}
|
|
view.repaint();
|
|
}
|
|
|
|
protected 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 || imagesOfTiles.size() == 0) {
|
|
tile.setText("<html><div style='text-align: center; width: 50'>" + String.valueOf(map.getImageCell().getMapBackground()[i][j]) + "</div></html>");
|
|
tile.setHorizontalTextPosition(JLabel.CENTER);
|
|
tileSet.setOpaque(true);
|
|
tileSet.setBackground(Color.BLUE);
|
|
}
|
|
else {
|
|
if (map.getImageCell().getMapBackground()[i][j] > imagesOfTiles.size() || map.getImageCell().getMapBackground()[i][j] < 0) {
|
|
editor.displayError("Inner Value out of bounds for current tileset was found on position " + i + ":" + j + " on Tile Layer. Defaulting to 0.");
|
|
map.getImageCell().getMapForeground()[i][j] = 0;
|
|
}
|
|
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) {
|
|
editor.getInfoManager().displayInfo(tile, "tile", x, y);
|
|
}
|
|
});
|
|
tileSet.add(tile);
|
|
}
|
|
}
|
|
view.repaint();
|
|
}
|
|
|
|
private void setCellIcon(JLabel cell, int i, int j) {
|
|
String value;
|
|
String[] info = editor.getCellArray()[i][j].split(",");
|
|
if (info[0].equals(info[0].toLowerCase())) {
|
|
return;
|
|
}
|
|
if (info[0].toUpperCase().equals("DOOR") || info[0].toUpperCase().equals("DOORTO")) {
|
|
value = "DOOR/DOORTO";
|
|
}
|
|
else {
|
|
value = info[0].toUpperCase();
|
|
}
|
|
if(info.length > 1) {
|
|
if (info[1].equals("u")) {
|
|
BufferedImage img = toBufferedImage(imagesOfTiles.get(editor.getCellMap().get(value)).getScaledInstance(50, 50, Image.SCALE_DEFAULT));
|
|
img = img.getSubimage(0, 0, 50, 25);
|
|
cell.setIcon(new ImageIcon(tilify(img, true)));
|
|
}
|
|
else if (info[1].equals("d")) {
|
|
BufferedImage img = toBufferedImage(imagesOfTiles.get(editor.getCellMap().get(value)).getScaledInstance(50, 50, Image.SCALE_DEFAULT));
|
|
img = img.getSubimage(0, 25, 50, 25);
|
|
cell.setIcon(new ImageIcon(tilify(img, false)));
|
|
}
|
|
}
|
|
else {
|
|
cell.setIcon(new ImageIcon(imagesOfTiles.get(editor.getCellMap().get(value)).getScaledInstance(50, 50, Image.SCALE_DEFAULT)));
|
|
}
|
|
}
|
|
|
|
private BufferedImage toBufferedImage(Image img) {
|
|
BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
|
|
Graphics2D bGr = bimage.createGraphics();
|
|
bGr.drawImage(img, 0, 0, null);
|
|
bGr.dispose();
|
|
return bimage;
|
|
}
|
|
|
|
private BufferedImage tilify(BufferedImage img, boolean isUp) {
|
|
BufferedImage image = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
|
|
Graphics2D bGr = image.createGraphics();
|
|
if (isUp) bGr.drawImage(img, 0, 0, null);
|
|
else bGr.drawImage(img, 0, 25, null);
|
|
bGr.dispose();
|
|
return image;
|
|
}
|
|
|
|
public JLayeredPane getMapLayers() {
|
|
return mapLayers;
|
|
}
|
|
|
|
public JPanel getObjectSet() {
|
|
return objectSet;
|
|
}
|
|
|
|
public JPanel getCellSet() {
|
|
return cellSet;
|
|
}
|
|
|
|
public JPanel getTileSet() {
|
|
return tileSet;
|
|
}
|
|
}
|