2020-05-23 12:21:14 +02:00

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;
}
}