Neat class I use to load sprite sheets. Ive never seen any code for any on the web so im not sure if there is another practice used for loading sprite sheets, or if people just do it manually every time. I used to do it manually every time which was a massive hassle.
Anyway if anyone could inform me how people generally do this, and or suggest how to make more flexible. Thats always a plus.
/**
* <p>Title: SpriteSheet</p>
*
* <p>Description: makes loading sprite sheets a breeze</p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author John carlyle
* @version 1.0
*/
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.*;
public class SpriteSheet {
private BufferedImage sheet, workArea;
private int xOffset = 0, yOffset = 0, xDel = 0, yDel = 0;
private Point size;
/**
*
* Makes a new sprite sheet
*
* @param img BufferedImage the image of the sprite sheet
* @param xo int distance of the first sprite row from the left edge
* @param yo int distance of the first sprite column from the top edge
* @param xd int size of delimiting space between sprites on the x-axis
* @param yd int size of delimiting space between sprites on the y-axis
* @param size Point height/width respectivly of the sprite frames you are ripping
*/
public SpriteSheet(BufferedImage img,
int xo,
int yo,
int xd,
int yd,
Point size) {
sheet = img;
workArea = sheet;
xOffset = xo;
yOffset = yo;
xDel = xd;
yDel = yd;
this.size = size;
}
/**
*
* sets the sprite sheet
*
* @param img BufferedImage new sheet
*/
public void setSheet(BufferedImage img) {
sheet = img;
}
/**
*
* gets the sprite sheet
*
* @return BufferedImage the sheet
*/
public BufferedImage getSheet() {
return sheet;
}
/**
*
* set the size of the sprite's frames you are cutting out
*
* @param s Point x is width y is height
*/
public void setSpriteSize(Point s) {
size.setLocation(s);
}
/**
*
* returns the current size of the sprites you are cutting out
*
* @return Point current size
*/
public Point getSpriteSize() {
return size;
}
/**
*
* distance of first row of sprites from the top of the image
*
* @param y int new distance
*/
public void setYOffset(int y) {
yOffset = y;
}
/**
*
* same as above
*
* @return int distance
*/
public int getYOffset() {
return yOffset;
}
/**
*
* distance of first column of sprites from the left side of the image
*
* @param x int new distance
*/
public void setXOffset(int x) {
xOffset = x;
}
/**
*
* same as above
*
* @return int offset
*/
public int getXOffset() {
return xOffset;
}
/**
*
* Distance between sprites on the y-axis
*
* @param y int new delimiter
*/
public void setYDel(int y) {
yDel = y;
}
/**
*
* same as above
*
* @return int delimiter
*/
public int getYDel() {
return yDel;
}
/**
*
* distance between sprites on the x-axis
*
* @param x int new delimiter
*/
public void setXDel(int x) {
xDel = x;
}
/**
*
* same as above
*
* @return int the delimiter
*/
public int getXDel() {
return xDel;
}
/**
*
* sets the area of the sheet you are working in
* (rectangle)
* Note: uses the rest of the sheet as the height and width
*
* @param x int x location of new area
* @param y int y location of new area
*/
public void setWorkArea(int x, int y) {
setWorkArea(x, y, sheet.getWidth() - x, sheet.getHeight() - y);
}
/**
*
* same as above but manualy sets the height and width
* (rectangle)
*
* @param x int x location of new area
* @param y int y location of new area
* @param w int width of new area
* @param h int height of new area
*/
public void setWorkArea(int x, int y, int w, int h) {
workArea = sheet.getSubimage(x, y, w, h);
}
/**
*
* nifty method that takes a list of points, and an integer, and converts
* it into an animation. Points reprsent frames in the animation.
* x being row y being column
*
* Basically each point in the list is a frame in the animation,
* the image is taken from the xth row and the yth column,
*
* @param points list of points that represent rows/columns(x/y)
* @param frameSpeed int length spent on each frame in animation
* @return Animation resulting anmation
*/
public Animation getAnimationFor(Point points[], int frameSpeed) {
Animation result = new Animation();
for (int i = 0; i < points.length; i++) {
int x = xOffset;
x += xDel * points[i].x;
x += size.x * points[i].x;
int y = yOffset;
y += yDel * points[i].y;
y += size.y * points[i].y;
result.addFrame(workArea.getSubimage(x, y, size.x, size.y), frameSpeed);
}
return (Animation)result.clone();
}
/**
*
* simpler method that returns a single image from a sprite sheet
* (good for portraits)
*
* @param p Point the location of the image in row/column form
* @return BufferedImage the image that was cut out
*/
public BufferedImage getImageFor(Point p) {
int x = xOffset;
x += xDel * p.x;
x += size.x * p.x;
int y = yOffset;
y += yDel * p.y;
y += size.y * p.y;
return workArea.getSubimage(x, y, size.x, size.y);
}
}
Basically you give it the metrics of the sprite sheet. Then enter a series of points, or a single one, which represent row/column position of the images you want to copy. If its a series of points it loads them into an animation, if an image then it just returns it. Has been a life saver in the last sprite sheet I was trying to load. Once I think I managed to use nested hashtables for some sprite sheet “organizing”, it was pretty messy.