package org.newdawn.slick.tiled;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
import org.newdawn.slick.Color;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.util.Log;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* A group of objects on the map (objects layer)
*
* @author liamzebedee
*/
public class ObjectGroup {
/** The index of this group */
public int index;
/** The name of this group - read from the XML */
public String name;
/** The Objects of this group */
public ArrayList<GroupObject> objects;
/** The width of this layer */
public int width;
/** The height of this layer */
public int height;
/** The mapping between object names and offsets */
private HashMap<String, Integer> nameToObjectMap = new HashMap<String, Integer>();
/** the properties of this group */
public Properties props;
/** The TiledMap of which this ObjectGroup belongs to */
TiledMap map;
/** The opacity of this layer (range 0 to 1) */
public float opacity = 1;
/** The visibility of this layer */
public boolean visible = true;
/** The color of this layer. NOTE: Slick does not render objects on default */
public Color color = new Color(Color.white);
/**
* 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 to which the ObjectGroup belongs
* @throws SlickException
* Indicates a failure to parse the XML group
*/
public ObjectGroup(Element element, TiledMap map) throws SlickException {
this.map = map;
TiledMapPlus tmap = null;
if (map instanceof TiledMapPlus) {
tmap = (TiledMapPlus) map;
}
name = element.getAttribute("name");
String widthS = element.getAttribute("width");
if (widthS != null && widthS.length()!=0) {
width = Integer.parseInt(widthS);
}
String heightS = element.getAttribute("height");
if (heightS != null && heightS.length()!=0) {
height = Integer.parseInt(heightS);
}
if (width==0||height==0)
Log.warn("ObjectGroup "+name+" has zero size (width or height equal to 0)");
objects = new ArrayList<GroupObject>();
String opacityS = element.getAttribute("opacity");
if (opacityS!=null && opacityS.length()!=0) {
opacity = Float.parseFloat(opacityS);
}
if ("0".equals(element.getAttribute("visible"))) {
visible = false;
}
//will default to Color.white if attribute is not found / can't be parsed
String colorS = element.getAttribute("color");
if (colorS != null && colorS.length()!=0) {
try {
color = Color.decode(colorS);
} catch (NumberFormatException e) {
Log.warn("color attribute in element "+name+" could not be parsed; reverting to white");
}
}
// 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);
}
}
}
NodeList objectNodes = element.getElementsByTagName("object");
for (int i = 0; i < objectNodes.getLength(); i++) {
Element objElement = (Element) objectNodes.item(i);
GroupObject object = null;
if (tmap != null) {
object = new GroupObject(objElement, tmap);
} else {
object = new GroupObject(objElement);
}
object.index = i;
objects.add(object);
}
}
/**
* Gets an object by its name
*
* @author liamzebedee
* @param objectName
* The name of the object
*/
public GroupObject getObject(String objectName) {
GroupObject g = this.objects.get(this.nameToObjectMap.get(objectName));
return g;
}
/**
* Gets all objects of a specific type on a layer
*
* @author liamzebedee
* @param type
* The name of the type
*/
public ArrayList<GroupObject> getObjectsOfType(String type) {
ArrayList<GroupObject> foundObjects = new ArrayList<GroupObject>();
for (GroupObject object : this.objects) {
if (object.type.equals(type)) {
foundObjects.add(object);
}
}
return foundObjects;
}
/**
* Removes an object
*
* @author liamzebedee
* @param objectName
* The name of the object
*/
public void removeObject(String objectName) {
int objectOffset = this.nameToObjectMap.get(objectName);
GroupObject object = this.objects.remove(objectOffset);
}
/**
* Sets the mapping from object names to their offsets
*
* @author liamzebedee
* @param map
* The name of the map
*/
public void setObjectNameMapping(HashMap<String, Integer> map) {
this.nameToObjectMap = map;
}
/**
* Adds an object to the object group
*
* @author liamzebedee
* @param object
* The object to be added
*/
public void addObject(GroupObject object) {
this.objects.add(object);
this.nameToObjectMap.put(object.name, this.objects.size());
}
/**
* Gets all the objects from this group
*
* @author liamzebedee
*/
public ArrayList<GroupObject> getObjects() {
return this.objects;
}
}