package ruscz.game.gameOfProd.Image; import ruscz.game.gameOfProd.Windows.WindowOfFreeMove; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.LinkedList; import java.util.Scanner; public class ImageCell { private static BufferedImage image; private LinkedList imagesOfTiles; private HashMap cellMap; private ImageDoor imageDoor; private LinkedList imagesOfItems; private int[][] mapBackground; private int[][] mapForeground; public void readMapFile(String name) { try { mapBackground = new int[WindowOfFreeMove.CANVAS_WIDTH][WindowOfFreeMove.CANVAS_HEIGHT]; mapForeground = new int[WindowOfFreeMove.CANVAS_WIDTH][WindowOfFreeMove.CANVAS_HEIGHT]; File mapFile = new File("src/main/resources/maps/" + name + "-tileset.txt"); Scanner scanner = new Scanner(mapFile); int j = 0; while (scanner.hasNextLine()) { String data = scanner.nextLine(); if (data.contains("")) { String[] mapInfo = data.split(" "); imageTileset(mapInfo); } else if (data.contains("")) { String[] mapInfo = data.split(" "); imageItem(mapInfo); } else { String[] mapColumn = data.split(" "); for (int i = 0; i < mapColumn.length; i++) { mapBackground[i][j] = Integer.parseInt(mapColumn[i]); } j++; } } loadCellMap(name); imageObjectset(name); } catch (FileNotFoundException e) { System.out.println("An error occurred."); e.printStackTrace(); } } private void imageTileset(String[] mapInfo) { try { image = ImageIO.read(new File("src/main/resources/" + mapInfo[1])); } catch (IOException e) { e.printStackTrace(); } int width = Integer.parseInt(mapInfo[2]); int height = Integer.parseInt(mapInfo[3]); int tileSize = Integer.parseInt(mapInfo[4]); int Xtiles = width / tileSize; int Ytiles = height / tileSize; int tiles = Xtiles * Ytiles; if (imagesOfTiles == null) imagesOfTiles = new LinkedList(); Rectangle[] rectangles = new Rectangle[tiles]; int count = 0; for (int i = 0; i < rectangles.length / Ytiles; i++) { for (int j = 0; j < rectangles.length / Xtiles; j++) { rectangles[count] = new Rectangle(tileSize * i, tileSize * j, tileSize, tileSize); count++; } } for (int i = 0; i < tiles; i++) { imagesOfTiles.add(image.getSubimage(rectangles[i].x, rectangles[i].y, rectangles[i].height, rectangles[i].width)); } } public void imageObjectset(String file) { try { File objectFile = new File("src/main/resources/maps/" + file + "-objectset.txt"); Scanner scanner = new Scanner(objectFile); int j = 0; while (scanner.hasNextLine()) { String[] objects = scanner.nextLine().split(" "); for (int i = 0; i < objects.length; i++) { mapForeground[i][j] = Integer.parseInt(objects[i]); } j++; } } catch (FileNotFoundException e) { e.printStackTrace(); } } public void loadCellMap(String file) { try { File mapFile = new File("src/main/resources/maps/" + file + "-cellmap.txt"); Scanner scanner = new Scanner(mapFile); cellMap = new HashMap(); while (scanner.hasNextLine()) { String data = scanner.nextLine(); String[] cellInfo = data.split(" "); if (cellInfo[0].equals("DOOR")) { Rectangle[] rec = new Rectangle[12]; int CELL_SIZE = WindowOfFreeMove.CELL_SIZE; int count = 0; for (int i = 0; i < rec.length / 4; i++) { for (int j = 0; j < rec.length / 3; j++) { rec[count] = new Rectangle(CELL_SIZE * i, CELL_SIZE * j, CELL_SIZE, CELL_SIZE); count++; } } imageDoor = new ImageDoor(cellInfo[1], rec); } else cellMap.put(cellInfo[0], Integer.parseInt(cellInfo[1])); } } catch (FileNotFoundException e) { e.printStackTrace(); } } public void imageItem(String[] itemInfo) { int imageWidth = 0; int imageHeight = 0; int size = 0; try { image = ImageIO.read(new File("src/main/resources/items/" + itemInfo[1])); imageWidth = Integer.parseInt(itemInfo[2]); imageHeight = Integer.parseInt(itemInfo[3]); size = Integer.parseInt(itemInfo[4]); } catch (IOException e) { e.printStackTrace(); } int Xtiles = imageWidth / size; int Ytiles = imageHeight / size; int tiles = Xtiles * Ytiles; if (imagesOfItems == null) imagesOfItems = new LinkedList(); for (int i = 0; i < Xtiles; i++) { for (int j = 0; j < Ytiles; j++) { BufferedImage img = image.getSubimage(size * i, size * j, size, size); imagesOfItems.add(img); } } } public LinkedList getImagesOfItems() { return imagesOfItems; } public int getImageFromCellMap(String cell) { return cellMap.get(cell); } public LinkedList getImagesOfTiles() { return imagesOfTiles; } public ImageDoor getImageDoor() { return imageDoor; } 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); } public void paintForeground(Graphics g, int x, int y) { int imageNum = mapForeground[x][y]; if (imageNum > 0) g.drawImage(imagesOfTiles.get(imageNum), x * WindowOfFreeMove.CELL_SIZE, y * WindowOfFreeMove.CELL_SIZE, WindowOfFreeMove.CELL_SIZE, WindowOfFreeMove.CELL_SIZE, null); } }