import java.util.ArrayList; import java.awt.Canvas; import java.awt.Graphics2D; import java.awt.Dimension; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferStrategy; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.NoninvertibleTransformException; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JFileChooser; import javax.swing.JCheckBox; import java.lang.Integer; public class MapEditor extends MapScene { private Tile.Type placingTile = Tile.Type.CLEAR; private Actor placingActor = new Actor("", 0, false, 0); private ArrayList actorFields = new ArrayList<>(); private JFrame actorFrame; private boolean nukeActor = false; public MapEditor(JFrame frame, Sub sub) { super(frame, sub); this.setLayout(new BorderLayout()); JPanel bottomPanel = new JPanel(); bottomPanel.setLayout(new GridLayout(1,5)); JButton newButton = new JButton("New"); newButton.setActionCommand("new"); JButton tileButton = new JButton("Placing selector"); tileButton.setActionCommand("tile"); JButton exportButton = new JButton("Export"); exportButton.setActionCommand("export"); JButton importButton = new JButton("Import"); importButton.setActionCommand("import"); JButton actorButton = new JButton("Actors"); actorButton.setActionCommand("actors"); newButton.addActionListener(this); tileButton.addActionListener(this); actorButton.addActionListener(this); exportButton.addActionListener(this); importButton.addActionListener(this); bottomPanel.add(newButton); bottomPanel.add(tileButton); bottomPanel.add(actorButton); bottomPanel.add(exportButton); bottomPanel.add(importButton); this.add(bottomPanel, BorderLayout.PAGE_END); this.add(this.canvas, BorderLayout.CENTER); } @Override public void mouseClicked(MouseEvent e) { int tileSize = this.maxSize/10; Point2D p = new Point2D.Double(e.getX(), e.getY()); try { p = this.tx.inverseTransform(p, null); } catch (NoninvertibleTransformException ex) {} try { int x = (int) p.getX()/tileSize; int y = (int) p.getY()/tileSize; this.map.getTile(x, y); if (this.placingTile != Tile.Type.NONE) { this.map.getTile(x, y).setType(this.placingTile); } else { if (!this.nukeActor) { Actor actor = this.placingActor; actor.place(x, y); this.map.addActor(actor); } else { Actor toNuke = this.placingActor; for (Actor actor : this.map.getActors()) { if (x == actor.getX() && y == actor.getY()) { toNuke = actor; } } this.map.removeActor(toNuke); } } } catch (ArrayIndexOutOfBoundsException ex) { System.out.println("no tile clicked"); } catch (NullPointerException ext) { System.out.println("map non existent"); } } @Override public void actionPerformed(ActionEvent e) { if ("new".equals(e.getActionCommand())) { JTextField size = new JTextField(); JComponent[] inputs = new JComponent[] { new JLabel("Size"), size, }; int result = JOptionPane.showConfirmDialog(null, inputs, "New map", JOptionPane.DEFAULT_OPTION); if (result == JOptionPane.OK_OPTION) { int sizeN = Integer.parseInt(size.getText()); this.map = new Map(new Dimension(sizeN, sizeN)); } } else if ("tile".equals(e.getActionCommand())) { String[] values = {"Clear", "Grass", "Water", "Mountain", "Actor", "Remove Actor"}; Object result = JOptionPane.showInputDialog(null, "Tile Type", "Tile Type Selector", JOptionPane.DEFAULT_OPTION, null, values, "0"); if (result != null) { String selected = result.toString(); switch (selected) { case "Clear": this.placingTile = Tile.Type.CLEAR; break; case "Grass": this.placingTile = Tile.Type.GRASS; break; case "Water": this.placingTile = Tile.Type.WATER; break; case "Mountain": this.placingTile = Tile.Type.MOUNTAIN; break; case "Actor": this.placingTile = Tile.Type.NONE; this.nukeActor = false; break; case "Remove Actor": this.placingTile = Tile.Type.NONE; this.nukeActor = true; break; } } } else if ("export".equals(e.getActionCommand())) { JFileChooser fc = new JFileChooser(); fc.showSaveDialog(null); MapLoader mapLoader = new MapLoader(fc.getSelectedFile()); mapLoader.saveMap(this.map); } else if ("import".equals(e.getActionCommand())) { JFileChooser fc = new JFileChooser(); fc.showOpenDialog(null); MapLoader mapLoader = new MapLoader(fc.getSelectedFile()); this.map = mapLoader.getMap(); } else if ("actors".equals(e.getActionCommand())) { JFrame actorFrame = new JFrame("Actors"); actorFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); actorFrame.setSize(new Dimension(300, 400)); actorFrame.setLocationRelativeTo(null); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(5,2)); JLabel lName = new JLabel("Name"); JTextField name = new JTextField(); JLabel lAgility = new JLabel("Agility"); JTextField agility = new JTextField(); JLabel lHp = new JLabel("max HP"); JTextField hp = new JTextField(); JCheckBox enemy = new JCheckBox("Enemy"); JLabel empty = new JLabel(); JButton ok = new JButton("Confirm"); ok.setActionCommand("actOk"); JButton cancel = new JButton("Cancel"); cancel.setActionCommand("actCancel"); ArrayList actorFields = new ArrayList<>(); actorFields.add(name); actorFields.add(hp); actorFields.add(agility); actorFields.add(enemy); this.actorFields = actorFields; ok.addActionListener(this); cancel.addActionListener(this); panel.add(lName); panel.add(name); panel.add(lAgility); panel.add(agility); panel.add(lHp); panel.add(hp); panel.add(enemy); panel.add(empty); panel.add(ok); panel.add(cancel); actorFrame.add(panel); actorFrame.pack(); actorFrame.setVisible(true); this.actorFrame = actorFrame; } else if ("actOk".equals(e.getActionCommand())) { JTextField nameField = (JTextField) this.actorFields.get(0); String name = nameField.getText(); JTextField hpField = (JTextField) this.actorFields.get(1); int hp = Integer.parseInt(hpField.getText()); JTextField agilityField = (JTextField) this.actorFields.get(2); int agility = Integer.parseInt(agilityField.getText()); JCheckBox enemyBox = (JCheckBox) this.actorFields.get(3); Actor actor = new Actor(name, hp, enemyBox.isSelected(), agility); this.placingActor = actor; this.actorFrame.setVisible(false); this.actorFrame.dispose(); } else if ("actCancel".equals(e.getActionCommand())) { this.actorFrame.setVisible(false); this.actorFrame.dispose(); } } }