package org.newdawn.slick.tiled;
import java.util.Properties;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.Polygon;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* An object from a object-group on the map
*
* @author kulpae
* @author liamzebedee
*/
public class GroupObject {
/** The index of this object */
public int index;
/** The name of this object - read from the XML */
public String name = "";
/** The type of this object - read from the XML */
public String type = "";
/** The x-coordinate of this object */
public int x = 0;
/** The y-coordinate of this object */
public int y = 0;
/** The width of this object */
public int width = 0;
/** The height of this object */
public int height = 0;
/** The image source */
String image;
/** the properties of this group */
public Properties props;
/** The gid reference to the image */
public int gid = -1;
/** The map this object belongs to */
TiledMapPlus map;
/** Types of objects */
public enum ObjectType {
IMAGE, RECTANGLE, POLYGON, POLYLINE
}
/** Object Type */
ObjectType objectType;
/** Points of a polygon object */
Polygon points;
/**
* Create a new group based on the XML definition
*
* @author kulpae
* @author liamzebedee
* @param element
* The XML element describing the layer
* @throws SlickException
* Indicates a failure to parse the XML group
*/
public GroupObject(Element element) throws SlickException {
if (element.getAttribute("gid") != "") {
gid = Integer.parseInt(element.getAttribute("gid"));
this.objectType = ObjectType.IMAGE;
}
if (element.getElementsByTagName("polyline").item(0) != null)
this.objectType = ObjectType.POLYLINE;
else if (element.getElementsByTagName("polygon").item(0) != null)
this.objectType = ObjectType.POLYGON;
else
this.objectType = ObjectType.RECTANGLE;
if (objectType == ObjectType.IMAGE) {
if (element.getAttribute("width") != "") {
width = Integer.parseInt(element.getAttribute("width"));
}
if (element.getAttribute("height") != "") {
height = Integer.parseInt(element.getAttribute("height"));
}
if (element.getAttribute("name") != "") {
name = element.getAttribute("name");
}
if (element.getAttribute("type") != "") {
type = element.getAttribute("type");
}
}
else if ((objectType == ObjectType.POLYGON)
|| (objectType == ObjectType.POLYLINE)) {
name = element.getAttribute("name");
Element polyLine;
if (objectType == ObjectType.POLYGON)
polyLine = (Element) element.getElementsByTagName("polygon")
.item(0);
else
polyLine = (Element) element.getElementsByTagName("polyline")
.item(0);
String pointsUnformatted = polyLine.getAttribute("points");
String[] pointsFormatted = pointsUnformatted.split(" ");
for (String pointS : pointsFormatted) {
String[] pointArray = pointS.split(",");
float pointX = Float.parseFloat(pointArray[0]);
float pointY = Float.parseFloat(pointArray[1]);
points.addPoint(pointX, pointY);
}
}
else if (objectType == ObjectType.RECTANGLE) {
objectType = ObjectType.RECTANGLE;
width = Integer.parseInt(element.getAttribute("width"));
height = Integer.parseInt(element.getAttribute("height"));
name = element.getAttribute("name");
type = element.getAttribute("type");
}
x = Integer.parseInt(element.getAttribute("x"));
y = Integer.parseInt(element.getAttribute("y"));
// now read the layer properties
Element propsElement = (Element) element.getElementsByTagName(
"properties").item(0);
if (propsElement != null) {
NodeList properties = propsElement.getElementsByTagName("property");
if (properties != null) {
props = new Properties();
for (int p = 0; p < properties.getLength(); p++) {
Element propElement = (Element) properties.item(p);
String name = propElement.getAttribute("name");
String value = propElement.getAttribute("value");
props.setProperty(name, value);
}
}
}
}
/**
* Create a new group based on the XML definition
*
* @author kulpae
* @author liamzebedee
* @param element
* The XML element describing the layer
* @param map
* The map this object belongs to
* @throws SlickException
* Indicates a failure to parse the XML group
*/
public GroupObject(Element element, TiledMapPlus map) throws SlickException {
this.map = map;
if (element.getAttribute("gid") != "") {
gid = Integer.parseInt(element.getAttribute("gid"));
this.objectType = ObjectType.IMAGE;
}
if (objectType == ObjectType.IMAGE) {
if (element.getAttribute("width") != "") {
width = Integer.parseInt(element.getAttribute("width"));
}
if (element.getAttribute("height") != "") {
height = Integer.parseInt(element.getAttribute("height"));
}
if (element.getAttribute("name") != "") {
name = element.getAttribute("name");
}
if (element.getAttribute("type") != "") {
type = element.getAttribute("type");
}
} else if (objectType == ObjectType.RECTANGLE) {
width = Integer.parseInt(element.getAttribute("width"));
height = Integer.parseInt(element.getAttribute("height"));
name = element.getAttribute("name");
type = element.getAttribute("type");
} else if (objectType == ObjectType.POLYGON) {
name = element.getAttribute("name");
Element polyLine = (Element) element.getElementsByTagName(
"polyline").item(0);
String pointsUnformatted = polyLine.getAttribute("points");
String[] pointsFormatted = pointsUnformatted.split(" ");
for (String pointS : pointsFormatted) {
String[] pointArray = pointS.split(",");
float pointX = Float.parseFloat(pointArray[0]);
float pointY = Float.parseFloat(pointArray[1]);
points.addPoint(pointX, pointY);
}
}
x = Integer.parseInt(element.getAttribute("x"));
y = Integer.parseInt(element.getAttribute("y"));
// now read the layer properties
Element propsElement = (Element) element.getElementsByTagName(
"properties").item(0);
if (propsElement != null) {
NodeList properties = propsElement.getElementsByTagName("property");
if (properties != null) {
props = new Properties();
for (int p = 0; p < properties.getLength(); p++) {
Element propElement = (Element) properties.item(p);
String name = propElement.getAttribute("name");
String value = propElement.getAttribute("value");
props.setProperty(name, value);
}
}
}
}
/**
* Puts a property to an object
*
* @author liamzebedee
* @param propertyKey
* The key of the property to be put to the object
* @param propertyValue
* The value mappped to the key of the property to be put to the
* object
*/
public void putProperty(String propertyKey, String propertyValue) {
this.props.put(propertyKey, propertyValue);
}
/**
* Puts a property to an object
*
* @author liamzebedee
* @param propertyKey
* The key of the property to be put to the object
* @param propertyValue
* The value mappped to the key of the property to be put to the
* object
*/
public void removeProperty(String propertyKey) {
this.props.remove(propertyKey);
}
/**
* Gets the image of this object, if it is an image object
*
* @author liamzebedee
* @throws SlickException
*/
public Image getImage() throws SlickException {
if (!(objectType == ObjectType.IMAGE)) {
throw new SlickException("Object isn't an image object");
}
if (map == null) {
throw new SlickException(
"Object doesn't belong to a map of type TiledMapPlus");
}
TileSet tileset = this.map.getTileSetByGID(gid);
int tilesetTileID = (this.gid - tileset.firstGID);
return tileset.tiles.getSubImage(tileset.getTileX(tilesetTileID),
tileset.getTileY(tilesetTileID), tileset.tileWidth,
tileset.tileHeight);
}
}