mirror of
https://github.com/OMGeeky/ATCS.git
synced 2025-12-26 23:57:25 +01:00
Bug fix for the map's "outside" property that wasn't handled properly.
Added support for the new "colorfilter" map property. Due to Java2D having no correct color filter support, only the "blackXX" values can be previwed. "bw" and "invert" cannot, the performance cost was simply way too high.
This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
package tiled.core;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
@@ -36,7 +37,7 @@ import java.util.Properties;
|
||||
*/
|
||||
public class Tile
|
||||
{
|
||||
private Image image;
|
||||
private BufferedImage image;
|
||||
private int id = -1;
|
||||
private Properties properties;
|
||||
private TileSet tileset;
|
||||
@@ -76,7 +77,7 @@ public class Tile
|
||||
*
|
||||
* @param i the new image of the tile
|
||||
*/
|
||||
public void setImage(Image i) {
|
||||
public void setImage(BufferedImage i) {
|
||||
image = i;
|
||||
}
|
||||
|
||||
@@ -133,7 +134,7 @@ public class Tile
|
||||
*
|
||||
* @return Image
|
||||
*/
|
||||
public Image getImage() {
|
||||
public BufferedImage getImage() {
|
||||
if (tileset != null && tileset.sheet != null) return tileset.sheet.getImage(getId());
|
||||
return image;
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ public class TileSet implements Iterable<Tile>
|
||||
tilesPerRow = basicTileCutter.getTilesPerRow();
|
||||
}
|
||||
|
||||
Image tileImage = cutter.getNextTile();
|
||||
BufferedImage tileImage = cutter.getNextTile();
|
||||
while (tileImage != null) {
|
||||
Tile tile = new Tile();
|
||||
tile.setImage(tileImage);
|
||||
@@ -220,7 +220,7 @@ public class TileSet implements Iterable<Tile>
|
||||
tileDimensions = new Rectangle(tileCutter.getTileDimensions());
|
||||
|
||||
int id = 0;
|
||||
Image tileImage = tileCutter.getNextTile();
|
||||
BufferedImage tileImage = tileCutter.getNextTile();
|
||||
while (tileImage != null) {
|
||||
Tile tile = getTile(id);
|
||||
tile.setImage(tileImage);
|
||||
|
||||
@@ -31,6 +31,7 @@ package tiled.io;
|
||||
import java.awt.Color;
|
||||
import java.awt.Image;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
@@ -223,9 +224,9 @@ public class TMXMapReader
|
||||
return o;
|
||||
}
|
||||
|
||||
private Image unmarshalImage(Node t, String baseDir) throws IOException
|
||||
private BufferedImage unmarshalImage(Node t, String baseDir) throws IOException
|
||||
{
|
||||
Image img = null;
|
||||
BufferedImage img = null;
|
||||
|
||||
String source = getAttributeValue(t, "source");
|
||||
|
||||
@@ -253,7 +254,7 @@ public class TMXMapReader
|
||||
// size, somehow makes drawing of the tiles a lot
|
||||
// faster on various systems (seen on Linux, Windows
|
||||
// and MacOS X).
|
||||
img = img.getScaledInstance(
|
||||
img = (BufferedImage) img.getScaledInstance(
|
||||
img.getWidth(null), img.getHeight(null),
|
||||
Image.SCALE_FAST);
|
||||
}
|
||||
@@ -534,7 +535,7 @@ public class TMXMapReader
|
||||
Node child = children.item(i);
|
||||
if ("image".equalsIgnoreCase(child.getNodeName())) {
|
||||
int id = getAttribute(child, "id", -1);
|
||||
Image img = unmarshalImage(child, baseDir);
|
||||
BufferedImage img = unmarshalImage(child, baseDir);
|
||||
tile.setImage(img);
|
||||
} else if ("animation".equalsIgnoreCase(child.getNodeName())) {
|
||||
// TODO: fill this in once TMXMapWriter is complete
|
||||
|
||||
@@ -64,7 +64,7 @@ public class BasicTileCutter implements TileCutter
|
||||
this.image = image;
|
||||
}
|
||||
|
||||
public Image getNextTile() {
|
||||
public BufferedImage getNextTile() {
|
||||
if (nextY + tileHeight + tileMargin <= image.getHeight()) {
|
||||
BufferedImage tile =
|
||||
image.getSubimage(nextX, nextY, tileWidth, tileHeight);
|
||||
|
||||
@@ -48,7 +48,7 @@ public interface TileCutter
|
||||
* @return the next tile image, or <code>null</code> when no more tile
|
||||
* images are available
|
||||
*/
|
||||
public Image getNextTile();
|
||||
public BufferedImage getNextTile();
|
||||
|
||||
/**
|
||||
* Resets the tile cutter so that the next call to <code>getNextTile</code>
|
||||
|
||||
@@ -30,6 +30,7 @@ package tiled.view;
|
||||
import tiled.core.TileLayer;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImageOp;
|
||||
|
||||
/**
|
||||
* An interface defining methods to render a map.
|
||||
@@ -50,5 +51,5 @@ public interface MapRenderer
|
||||
* @param g the graphics context to paint to
|
||||
* @param layer the layer to paint
|
||||
*/
|
||||
public void paintTileLayer(Graphics2D g, TileLayer layer);
|
||||
public void paintTileLayer(Graphics2D g, TileLayer layer, BufferedImageOp filter);
|
||||
}
|
||||
|
||||
@@ -32,6 +32,8 @@ import tiled.core.Tile;
|
||||
import tiled.core.TileLayer;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.BufferedImageOp;
|
||||
|
||||
/**
|
||||
* The orthogonal map renderer. This is the most basic map renderer, dealing
|
||||
@@ -51,7 +53,7 @@ public class OrthogonalRenderer implements MapRenderer
|
||||
map.getHeight() * map.getTileHeight());
|
||||
}
|
||||
|
||||
public void paintTileLayer(Graphics2D g, TileLayer layer) {
|
||||
public void paintTileLayer(Graphics2D g, TileLayer layer, BufferedImageOp filter ) {
|
||||
final Rectangle clip = g.getClipBounds();
|
||||
final int tileWidth = map.getTileWidth();
|
||||
final int tileHeight = map.getTileHeight();
|
||||
@@ -74,15 +76,17 @@ public class OrthogonalRenderer implements MapRenderer
|
||||
final Tile tile = layer.getTileAt(x, y);
|
||||
if (tile == null)
|
||||
continue;
|
||||
final Image image = tile.getImage();
|
||||
final BufferedImage image = tile.getImage();
|
||||
if (image == null)
|
||||
continue;
|
||||
|
||||
|
||||
|
||||
g.drawImage(
|
||||
image,
|
||||
filter,
|
||||
x * tileWidth,
|
||||
(y + 1) * tileHeight - image.getHeight(null),
|
||||
null);
|
||||
(y + 1) * tileHeight - image.getHeight(null));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,14 @@ public class TMXMap extends GameDataElement {
|
||||
public static final String ABOVE_LAYER_NAME = "Above";
|
||||
public static final String WALKABLE_LAYER_NAME = "Walkable";
|
||||
|
||||
public enum ColorFilter {
|
||||
black20,
|
||||
black40,
|
||||
black60,
|
||||
black80,
|
||||
invert,
|
||||
bw
|
||||
}
|
||||
|
||||
public File tmxFile = null;
|
||||
public tiled.core.Map tmxMap = null;
|
||||
@@ -46,6 +54,7 @@ public class TMXMap extends GameDataElement {
|
||||
|
||||
public ProjectTreeNode parent;
|
||||
public Integer outside = null;
|
||||
public ColorFilter colorFilter = null;
|
||||
|
||||
public boolean writable = false;
|
||||
|
||||
@@ -62,8 +71,11 @@ public class TMXMap extends GameDataElement {
|
||||
usedSpritesheets = new HashSet<Spritesheet>();
|
||||
try {
|
||||
tmxMap = new TMXMapReader().readMap(tmxFile.getAbsolutePath(), this);
|
||||
if (tmxMap.getProperties().get("outside") != null) {
|
||||
outside = new Integer(((String) tmxMap.getProperties().get("outside")));
|
||||
if (tmxMap.getProperties().get("outdoors") != null) {
|
||||
outside = new Integer(((String) tmxMap.getProperties().get("outdoors")));
|
||||
}
|
||||
if (tmxMap.getProperties().get("colorfilter") != null) {
|
||||
colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Impossible to load TMX map file "+tmxFile.getAbsolutePath());
|
||||
@@ -97,8 +109,11 @@ public class TMXMap extends GameDataElement {
|
||||
try {
|
||||
clone.usedSpritesheets = new HashSet<Spritesheet>();
|
||||
clone.tmxMap = new TMXMapReader().readMap(new StringReader(this.toXml()), clone);
|
||||
if (clone.tmxMap.getProperties().get("outside") != null) {
|
||||
clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outside")));
|
||||
if (clone.tmxMap.getProperties().get("outdoors") != null) {
|
||||
clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outdoors")));
|
||||
}
|
||||
if (clone.tmxMap.getProperties().get("colorfilter") != null) {
|
||||
clone.colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
||||
}
|
||||
for (tiled.core.MapLayer layer : clone.tmxMap.getLayers()) {
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
@@ -210,6 +225,17 @@ public class TMXMap extends GameDataElement {
|
||||
}
|
||||
|
||||
public String toXml() {
|
||||
if (outside != null && outside == 1) {
|
||||
tmxMap.getProperties().put("outdoors", Integer.toString(outside));
|
||||
} else {
|
||||
tmxMap.getProperties().remove("outdoors");
|
||||
}
|
||||
if (colorFilter != null) {
|
||||
tmxMap.getProperties().put("colorfilter", colorFilter.toString());
|
||||
} else {
|
||||
tmxMap.getProperties().remove("colorfilter");
|
||||
}
|
||||
|
||||
for (MapObjectGroup group : groups) {
|
||||
group.pushBackToTiledProperties();
|
||||
if (!tmxMap.containsLayer(group.tmxGroup)) {
|
||||
|
||||
@@ -14,6 +14,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
import javax.swing.AbstractListModel;
|
||||
import javax.swing.ComboBoxModel;
|
||||
@@ -29,6 +30,7 @@ import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.JSpinner.NumberEditor;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.ListModel;
|
||||
import javax.swing.SpinnerNumberModel;
|
||||
@@ -147,6 +149,51 @@ public abstract class Editor extends JPanel implements ProjectElementListener {
|
||||
});
|
||||
return tfField;
|
||||
}
|
||||
|
||||
public static JTextArea addTextArea(JPanel pane, String label, String initialValue, boolean editable, final FieldUpdateListener listener) {
|
||||
String text= initialValue == null ? "" : initialValue.replaceAll("\\n", "\n");
|
||||
|
||||
JPanel tfPane = new JPanel();
|
||||
tfPane.setLayout(new JideBoxLayout(tfPane, JideBoxLayout.LINE_AXIS, 6));
|
||||
JLabel tfLabel = new JLabel(label);
|
||||
tfPane.add(tfLabel, JideBoxLayout.FIX);
|
||||
final JTextArea tfArea = new JTextArea(text);
|
||||
tfArea.setEditable(editable);
|
||||
tfPane.add(new JScrollPane(tfArea), JideBoxLayout.VARY);
|
||||
JButton nullify = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
|
||||
tfPane.add(nullify, JideBoxLayout.FIX);
|
||||
nullify.setEnabled(editable);
|
||||
pane.add(tfPane, JideBoxLayout.FIX);
|
||||
|
||||
nullify.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
tfArea.setText("");
|
||||
listener.valueChanged(tfArea, null);
|
||||
}
|
||||
});
|
||||
tfArea.getDocument().addDocumentListener(new DocumentListener() {
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n")));
|
||||
}
|
||||
@Override
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n")));
|
||||
}
|
||||
@Override
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n")));
|
||||
}
|
||||
});
|
||||
// tfArea.addActionListener(new ActionListener() {
|
||||
// @Override
|
||||
// public void actionPerformed(ActionEvent e) {
|
||||
// listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", "\\n"));
|
||||
// }
|
||||
// });
|
||||
return tfArea;
|
||||
}
|
||||
|
||||
// public static JSpinner addIntegerField(JPanel pane, String label, Integer initialValue, boolean allowNegatives, boolean editable) {
|
||||
// return addIntegerField(pane, label, initialValue, allowNegatives, editable, nullListener);
|
||||
|
||||
@@ -23,6 +23,7 @@ import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.ListModel;
|
||||
import javax.swing.ListSelectionModel;
|
||||
@@ -79,7 +80,7 @@ public class DialogueEditor extends JSONElementEditor {
|
||||
private static final int SHOP_INDEX = 5;
|
||||
|
||||
private JTextField idField;
|
||||
private JTextField messageField;
|
||||
private JTextArea messageField;
|
||||
private MyComboBox switchToNpcBox;
|
||||
|
||||
private RewardsListModel rewardsListModel;
|
||||
@@ -127,7 +128,7 @@ public class DialogueEditor extends JSONElementEditor {
|
||||
createButtonPane(pane, dialogue.getProject(), dialogue, Dialogue.class, dialogue.getImage(), null, listener);
|
||||
|
||||
idField = addTextField(pane, "Internal ID: ", dialogue.id, dialogue.writable, listener);
|
||||
messageField = addTextField(pane, "Message: ", dialogue.message, dialogue.writable, listener);
|
||||
messageField = addTextArea(pane, "Message: ", dialogue.message, dialogue.writable, listener);
|
||||
switchToNpcBox = addNPCBox(pane, dialogue.getProject(), "Switch active NPC to: ", dialogue.switch_to_npc, dialogue.writable, listener);
|
||||
|
||||
CollapsiblePanel rewards = new CollapsiblePanel("Reaching this phrase gives the following rewards: ");
|
||||
|
||||
@@ -1,24 +1,32 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui.gamedataeditors;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import javax.swing.event.TableModelEvent;
|
||||
import javax.swing.event.TableModelListener;
|
||||
import javax.swing.table.TableCellRenderer;
|
||||
import javax.swing.table.TableModel;
|
||||
|
||||
import org.fife.ui.rtextarea.ColorBackgroundPainterStrategy;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
@@ -79,6 +87,7 @@ public class QuestEditor extends JSONElementEditor {
|
||||
stagesTable.getColumnModel().getColumn(3).setMinWidth(130);
|
||||
stagesTable.getColumnModel().getColumn(3).setMaxWidth(130);
|
||||
stagesTable.setCellSelectionEnabled(true);
|
||||
stagesTable.getColumnModel().getColumn(1).setCellRenderer(new MultilineCellRenderer());
|
||||
stagesPane.add(new JScrollPane(stagesTable), BorderLayout.CENTER);
|
||||
if (quest.writable) {
|
||||
JPanel buttonPane = new JPanel();
|
||||
@@ -330,6 +339,48 @@ public class QuestEditor extends JSONElementEditor {
|
||||
updateJsonViewText(quest.toJsonString());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class MultilineCellRenderer extends JTextArea implements TableCellRenderer {
|
||||
private static final long serialVersionUID = 6539816623608859506L;
|
||||
|
||||
public MultilineCellRenderer() {
|
||||
setLineWrap(true);
|
||||
setWrapStyleWord(true);
|
||||
//setOpaque(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table,
|
||||
Object value, boolean isSelected, boolean hasFocus,
|
||||
int row, int column) {
|
||||
if (isSelected) {
|
||||
setForeground(stagesTable.getSelectionForeground());
|
||||
setBackground(stagesTable.getSelectionBackground());
|
||||
} else {
|
||||
setForeground(stagesTable.getForeground());
|
||||
setBackground(stagesTable.getBackground());
|
||||
}
|
||||
setFont(stagesTable.getFont());
|
||||
if (hasFocus) {
|
||||
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
|
||||
if (stagesTable.isCellEditable(row, column)) {
|
||||
setForeground(UIManager.getColor("Table.focusCellForeground"));
|
||||
setBackground(UIManager.getColor("Table.focusCellBackground"));
|
||||
}
|
||||
} else {
|
||||
setBorder(BorderFactory.createLineBorder(getBackground(), 1));
|
||||
}
|
||||
setText((value == null ? "" : value.toString()));
|
||||
|
||||
int fh = getFontMetrics(getFont()).getHeight();
|
||||
// int tl = getText().length();
|
||||
setSize(stagesTable.getWidth(), fh);
|
||||
stagesTable.setRowHeight(row, getPreferredSize().height);
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import java.awt.Graphics2D;
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.color.ColorSpace;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyAdapter;
|
||||
@@ -18,8 +19,14 @@ import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseMotionAdapter;
|
||||
import java.awt.event.MouseMotionListener;
|
||||
import java.awt.image.BandCombineOp;
|
||||
import java.awt.image.BufferedImageOp;
|
||||
import java.awt.image.ByteLookupTable;
|
||||
import java.awt.image.ColorConvertOp;
|
||||
import java.awt.image.LookupOp;
|
||||
import java.awt.image.LookupTable;
|
||||
import java.awt.image.ShortLookupTable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
@@ -115,6 +122,7 @@ public class TMXMapEditor extends Editor {
|
||||
private RSyntaxTextArea editorPane;
|
||||
|
||||
private IntegerBasedCheckBox outsideBox;
|
||||
private JComboBox colorFilterBox;
|
||||
private LayerListModel layerListModel;
|
||||
private JList layerList;
|
||||
private tiled.core.MapLayer selectedLayer;
|
||||
@@ -206,6 +214,7 @@ public class TMXMapEditor extends Editor {
|
||||
addLabelField(pane, "TMX File: ", ((TMXMap)target).tmxFile.getAbsolutePath());
|
||||
createButtonPane(pane, map.getProject(), map, listener);
|
||||
outsideBox = addIntegerBasedCheckBox(pane, "Map is outdoors", map.outside, map.writable, listener);
|
||||
colorFilterBox = addEnumValueBox(pane, "Color Filter", TMXMap.ColorFilter.values(), map.colorFilter, map.writable, listener);
|
||||
|
||||
JSplitPane layersViewSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
|
||||
layerListModel = new LayerListModel(map);
|
||||
@@ -1242,12 +1251,51 @@ public class TMXMapEditor extends Editor {
|
||||
|
||||
}
|
||||
|
||||
private static final BufferedImageOp colorFilterBlack20 = null;
|
||||
private static final BufferedImageOp colorFilterBlack40 = null;
|
||||
private static final BufferedImageOp colorFilterBlack60 = null;
|
||||
private static final BufferedImageOp colorFilterBlack80 = null;
|
||||
private static final BufferedImageOp colorFilterInvert = null;
|
||||
private static final BufferedImageOp colorFilterBW = null;
|
||||
|
||||
|
||||
// private static final BufferedImageOp colorFilterBlack20 = createGrayScaleColorFilter(0.8f);
|
||||
// private static final BufferedImageOp colorFilterBlack40 = createGrayScaleColorFilter(0.6f);
|
||||
// private static final BufferedImageOp colorFilterBlack60 = createGrayScaleColorFilter(0.4f);
|
||||
// private static final BufferedImageOp colorFilterBlack80 = createGrayScaleColorFilter(0.2f);
|
||||
// private static final BufferedImageOp colorFilterInvert = createInvertColorFilter();
|
||||
// private static final BufferedImageOp colorFilterBW = createBWColorFilter();
|
||||
//
|
||||
// private static BufferedImageOp createGrayScaleColorFilter(float f) {
|
||||
// byte[] gs = new byte[256];
|
||||
// for (int i=0; i < 256; i++) {
|
||||
// gs[i] = (byte)( i * f);
|
||||
// }
|
||||
// return new LookupOp(new ByteLookupTable(0, gs), null);
|
||||
// }
|
||||
//
|
||||
// private static BufferedImageOp createInvertColorFilter() {
|
||||
// byte[] invert = new byte[256];
|
||||
// for (int i=0; i < 256; i++) {
|
||||
// invert[i] = (byte) (255 - i);
|
||||
// }
|
||||
// return new LookupOp(new ByteLookupTable(0, invert), null);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// private static BufferedImageOp createBWColorFilter() {
|
||||
// return new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
|
||||
// }
|
||||
|
||||
public class TMXViewer extends JPanel implements Scrollable {
|
||||
|
||||
private static final long serialVersionUID = 2845032142029325865L;
|
||||
|
||||
|
||||
public tiled.core.MapObject highlighted = null;
|
||||
private MapRenderer renderer;
|
||||
private FieldUpdateListener listener;
|
||||
private TMXMap map;
|
||||
|
||||
public boolean resizing = false;
|
||||
public boolean moving = false;
|
||||
@@ -1257,7 +1305,8 @@ public class TMXMapEditor extends Editor {
|
||||
return new Rectangle(selectedMapObject.x + selectedMapObject.w - 16, selectedMapObject.y + selectedMapObject.h - 16, 16, 16);
|
||||
}
|
||||
|
||||
public Rectangle getMoveHitArea() {
|
||||
|
||||
public Rectangle getMoveHitArea() {
|
||||
//16x16 px square in the upper left corner of area
|
||||
return new Rectangle(selectedMapObject.x, selectedMapObject.y, 16, 16);
|
||||
}
|
||||
@@ -1270,6 +1319,7 @@ public class TMXMapEditor extends Editor {
|
||||
public TMXViewer(final TMXMap map, FieldUpdateListener listener) {
|
||||
this.listener = listener;
|
||||
renderer = createRenderer(map.tmxMap);
|
||||
this.map = map;
|
||||
|
||||
setPreferredSize(renderer.getMapSize());
|
||||
setOpaque(true);
|
||||
@@ -1383,20 +1433,86 @@ public class TMXMapEditor extends Editor {
|
||||
public void paintComponent(Graphics g) {
|
||||
final Graphics2D g2d = (Graphics2D) g.create();
|
||||
final Rectangle clip = g2d.getClipBounds();
|
||||
|
||||
BufferedImageOp filter = null;
|
||||
|
||||
if (map.colorFilter != null) {
|
||||
switch(map.colorFilter) {
|
||||
case black20:
|
||||
filter=colorFilterBlack20;
|
||||
break;
|
||||
case black40:
|
||||
filter=colorFilterBlack40;
|
||||
break;
|
||||
case black60:
|
||||
filter=colorFilterBlack60;
|
||||
break;
|
||||
case black80:
|
||||
filter=colorFilterBlack80;
|
||||
break;
|
||||
case bw:
|
||||
filter=colorFilterBW;
|
||||
break;
|
||||
case invert:
|
||||
filter=colorFilterInvert;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Draw a gray background
|
||||
g2d.setPaint(new Color(100, 100, 100));
|
||||
g2d.fill(clip);
|
||||
|
||||
// Draw each tile map layer
|
||||
boolean paintSelected = false;
|
||||
for (tiled.core.MapLayer layer : ((TMXMap)target).tmxMap) {
|
||||
if (layer instanceof tiled.core.TileLayer && layer.isVisible()) {
|
||||
renderer.paintTileLayer(g2d, (tiled.core.TileLayer) layer);
|
||||
} else if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) {
|
||||
renderer.paintTileLayer(g2d, (tiled.core.TileLayer) layer, filter);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (map.colorFilter != null) {
|
||||
switch(map.colorFilter) {
|
||||
case black20:
|
||||
g2d.setPaint(new Color(0f, 0f, 0f, 0.2f));
|
||||
g2d.fill(clip);
|
||||
break;
|
||||
case black40:
|
||||
g2d.setPaint(new Color(0f, 0f, 0f, 0.4f));
|
||||
g2d.fill(clip);
|
||||
break;
|
||||
case black60:
|
||||
g2d.setPaint(new Color(0f, 0f, 0f, 0.6f));
|
||||
g2d.fill(clip);
|
||||
break;
|
||||
case black80:
|
||||
g2d.setPaint(new Color(0f, 0f, 0f, 0.8f));
|
||||
g2d.fill(clip);
|
||||
break;
|
||||
case bw:
|
||||
break;
|
||||
case invert:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Draw each object map layer
|
||||
boolean paintSelected = false;
|
||||
for (tiled.core.MapLayer layer : ((TMXMap)target).tmxMap) {
|
||||
if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) {
|
||||
paintSelected |= paintObjectGroup(g2d, (tiled.core.ObjectGroup) layer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (paintSelected) {
|
||||
//TODO make this less ugly..... visually speaking.
|
||||
g2d.setColor(new Color(190, 20, 20));
|
||||
@@ -1725,6 +1841,10 @@ public class TMXMapEditor extends Editor {
|
||||
}
|
||||
} else if (source == outsideBox) {
|
||||
map.outside = (Integer)value;
|
||||
} else if (source == colorFilterBox) {
|
||||
map.colorFilter = (TMXMap.ColorFilter) value;
|
||||
tmxViewer.revalidate();
|
||||
tmxViewer.repaint();
|
||||
} else if (source == droplistBox) {
|
||||
if (selectedMapObject instanceof ContainerArea) {
|
||||
ContainerArea area = (ContainerArea)selectedMapObject;
|
||||
@@ -2050,6 +2170,34 @@ public class TMXMapEditor extends Editor {
|
||||
final Graphics2D g2d = (Graphics2D) g.create();
|
||||
final Rectangle clip = g2d.getClipBounds();
|
||||
|
||||
BufferedImageOp filter = null;
|
||||
|
||||
if (map.colorFilter != null) {
|
||||
switch(map.colorFilter) {
|
||||
case black20:
|
||||
filter=colorFilterBlack20;
|
||||
break;
|
||||
case black40:
|
||||
filter=colorFilterBlack40;
|
||||
break;
|
||||
case black60:
|
||||
filter=colorFilterBlack60;
|
||||
break;
|
||||
case black80:
|
||||
filter=colorFilterBlack80;
|
||||
break;
|
||||
case bw:
|
||||
filter=colorFilterBW;
|
||||
break;
|
||||
case invert:
|
||||
filter=colorFilterInvert;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Draw a gray background
|
||||
g2d.setPaint(new Color(100, 100, 100));
|
||||
g2d.fill(clip);
|
||||
@@ -2057,19 +2205,19 @@ public class TMXMapEditor extends Editor {
|
||||
// Draw each tile map layer
|
||||
|
||||
if (ground != null) {
|
||||
renderer.paintTileLayer(g2d, ground);
|
||||
renderer.paintTileLayer(g2d, ground, filter);
|
||||
}
|
||||
|
||||
if (objects != null) {
|
||||
renderer.paintTileLayer(g2d, objects);
|
||||
renderer.paintTileLayer(g2d, objects, filter);
|
||||
}
|
||||
|
||||
if (above != null) {
|
||||
renderer.paintTileLayer(g2d, above);
|
||||
renderer.paintTileLayer(g2d, above, filter);
|
||||
}
|
||||
|
||||
if (walkable != null && showWalkable) {
|
||||
renderer.paintTileLayer(g2d, walkable);
|
||||
renderer.paintTileLayer(g2d, walkable, filter);
|
||||
}
|
||||
|
||||
if (highlighted != null) {
|
||||
|
||||
@@ -81,7 +81,7 @@ public class WorldMapView extends JComponent implements Scrollable {
|
||||
for (tiled.core.MapLayer layer : ((TMXMap)map).tmxMap) {
|
||||
if (layer instanceof tiled.core.TileLayer && layer.isVisible()) {
|
||||
if (layer.getName().equalsIgnoreCase("walkable")) continue;
|
||||
renderer.paintTileLayer(g2, (tiled.core.TileLayer) layer);
|
||||
renderer.paintTileLayer(g2, (tiled.core.TileLayer) layer, null);
|
||||
} else if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) {
|
||||
// paintObjectGroup(g2, map, (tiled.core.ObjectGroup) layer);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user