package org.newdawn.slick;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.newdawn.slick.util.ResourceLoader;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* A sprite sheet based on an XML descriptor generated from the simple slick tool
*
* @author kevin
*/
public class XMLPackedSheet {
/** The full sheet image */
private Image image;
/** The sprites stored on the image */
private HashMap sprites = new HashMap();
/**
* Create a new XML packed sheet from the XML output by the slick tool
*
* @param imageRef The reference to the image
* @param xmlRef The reference to the XML
* @throws SlickException Indicates a failure to parse the XML or read the image
*/
public XMLPackedSheet(String imageRef, String xmlRef) throws SlickException
{
image = new Image(imageRef, false, Image.FILTER_NEAREST);
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(ResourceLoader.getResourceAsStream(xmlRef));
NodeList list = doc.getElementsByTagName("sprite");
for (int i=0;i<list.getLength();i++) {
Element element = (Element) list.item(i);
String name = element.getAttribute("name");
int x = Integer.parseInt(element.getAttribute("x"));
int y = Integer.parseInt(element.getAttribute("y"));
int width = Integer.parseInt(element.getAttribute("width"));
int height = Integer.parseInt(element.getAttribute("height"));
sprites.put(name, image.getSubImage(x,y,width,height));
}
} catch (Exception e) {
throw new SlickException("Failed to parse sprite sheet XML", e);
}
}
/**
* Get a sprite by it's given name
*
* @param name The name of the sprite to retrieve
* @return The sprite from the sheet or null if the name isn't used in this sheet
*/
public Image getSprite(String name) {
return (Image) sprites.get(name);
}
}