graphics: MakeTiles: support layering two or more images together
git-svn-id: https://micropolis.googlecode.com/svn/trunk/micropolis-java@705 d9718cc8-9f43-0410-858b-315f434eb58c
This commit is contained in:
parent
57fd5c0847
commit
2e217755a3
2 changed files with 76 additions and 37 deletions
|
@ -1,3 +1,23 @@
|
||||||
|
===============
|
||||||
|
The Recipe File
|
||||||
|
===============
|
||||||
|
|
||||||
|
The `tiles.dat' file is the recipe file for generating the tiles.
|
||||||
|
It is a plain-text file, where each line begins with a tile id,
|
||||||
|
followed by an image specification.
|
||||||
|
|
||||||
|
The image specification consists of one or more image layers separated
|
||||||
|
by the pipe character (|). The layers are drawn in the order specified.
|
||||||
|
|
||||||
|
A layer is a file name (excluding the .png extension), optionally followed
|
||||||
|
by @X,Y,W,H, where X,Y specify the upper-left corner of the rectangle to
|
||||||
|
draw, and W,H specify the width and height of the rectangle to draw.
|
||||||
|
|
||||||
|
|
||||||
|
==============================
|
||||||
|
Generating the composite image
|
||||||
|
==============================
|
||||||
|
|
||||||
To build a new tiles.png file, do the following:
|
To build a new tiles.png file, do the following:
|
||||||
|
|
||||||
1. Open a command-prompt, and cd to the graphics subdirectory.
|
1. Open a command-prompt, and cd to the graphics subdirectory.
|
||||||
|
|
|
@ -42,31 +42,42 @@ public class MakeTiles
|
||||||
String tileImage = tileData.get(Integer.toString(i));
|
String tileImage = tileData.get(Integer.toString(i));
|
||||||
assert tileImage != null;
|
assert tileImage != null;
|
||||||
|
|
||||||
ImageRef ref = parseImageRef(tileImage);
|
ImageSpec ref = parseImageSpec(tileImage);
|
||||||
if (!loadedImages.containsKey(ref.fileName)) {
|
drawTo(ref, gr, 0, TILE_SIZE*i);
|
||||||
loadedImages.put(ref.fileName,
|
|
||||||
loadImage(ref.fileName));
|
|
||||||
}
|
|
||||||
|
|
||||||
Image sourceImg = loadedImages.get(ref.fileName);
|
|
||||||
int srcWidth = sourceImg.getWidth(null);
|
|
||||||
int srcHeight = sourceImg.getHeight(null);
|
|
||||||
|
|
||||||
gr.drawImage(
|
|
||||||
sourceImg,
|
|
||||||
0, TILE_SIZE*i,
|
|
||||||
TILE_SIZE, TILE_SIZE*(i+1),
|
|
||||||
ref.offsetX, ref.offsetY,
|
|
||||||
ref.offsetX + (ref.width != 0 ? ref.width : srcWidth),
|
|
||||||
ref.offsetY + (ref.height != 0 ? ref.height : srcHeight),
|
|
||||||
null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageIO.write(buf, "png", outputFile);
|
ImageIO.write(buf, "png", outputFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
static class ImageRef
|
static void drawTo(ImageSpec ref, Graphics2D gr, int destX, int destY)
|
||||||
|
throws IOException
|
||||||
{
|
{
|
||||||
|
if (ref.background != null) {
|
||||||
|
drawTo(ref.background, gr, destX, destY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!loadedImages.containsKey(ref.fileName)) {
|
||||||
|
loadedImages.put(ref.fileName,
|
||||||
|
loadImage(ref.fileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
Image sourceImg = loadedImages.get(ref.fileName);
|
||||||
|
int srcWidth = sourceImg.getWidth(null);
|
||||||
|
int srcHeight = sourceImg.getHeight(null);
|
||||||
|
|
||||||
|
gr.drawImage(
|
||||||
|
sourceImg,
|
||||||
|
destX, destY,
|
||||||
|
destX+TILE_SIZE, destY+TILE_SIZE,
|
||||||
|
ref.offsetX, ref.offsetY,
|
||||||
|
ref.offsetX + (ref.width != 0 ? ref.width : srcWidth),
|
||||||
|
ref.offsetY + (ref.height != 0 ? ref.height : srcHeight),
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ImageSpec
|
||||||
|
{
|
||||||
|
ImageSpec background;
|
||||||
String fileName;
|
String fileName;
|
||||||
int offsetX;
|
int offsetX;
|
||||||
int offsetY;
|
int offsetY;
|
||||||
|
@ -74,31 +85,39 @@ public class MakeTiles
|
||||||
int height;
|
int height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ImageRef parseImageRef(String s)
|
static ImageSpec parseImageSpec(String chain)
|
||||||
{
|
{
|
||||||
ImageRef rv = new ImageRef();
|
ImageSpec result = null;
|
||||||
|
|
||||||
String [] parts = s.split("@", 2);
|
for (String layerStr : chain.split("\\|")) {
|
||||||
|
|
||||||
|
ImageSpec rv = new ImageSpec();
|
||||||
|
rv.background = result;
|
||||||
|
result = rv;
|
||||||
|
|
||||||
|
String [] parts = layerStr.split("@", 2);
|
||||||
rv.fileName = parts[0];
|
rv.fileName = parts[0];
|
||||||
|
|
||||||
if (parts.length >= 2) {
|
if (parts.length >= 2) {
|
||||||
String offsetInfo = parts[1];
|
String offsetInfo = parts[1];
|
||||||
parts = offsetInfo.split(",");
|
parts = offsetInfo.split(",");
|
||||||
if (parts.length >= 1) {
|
if (parts.length >= 1) {
|
||||||
rv.offsetX = Integer.parseInt(parts[0]);
|
rv.offsetX = Integer.parseInt(parts[0]);
|
||||||
}
|
}
|
||||||
if (parts.length >= 2) {
|
if (parts.length >= 2) {
|
||||||
rv.offsetY = Integer.parseInt(parts[1]);
|
rv.offsetY = Integer.parseInt(parts[1]);
|
||||||
}
|
}
|
||||||
if (parts.length >= 3) {
|
if (parts.length >= 3) {
|
||||||
rv.width = Integer.parseInt(parts[2]);
|
rv.width = Integer.parseInt(parts[2]);
|
||||||
}
|
}
|
||||||
if (parts.length >= 4) {
|
if (parts.length >= 4) {
|
||||||
rv.height = Integer.parseInt(parts[3]);
|
rv.height = Integer.parseInt(parts[3]);
|
||||||
}
|
}
|
||||||
}//endif something given after '@' in image specifier
|
}//endif something given after '@' in image specifier
|
||||||
|
|
||||||
return rv;
|
}//end foreach layer in image specification
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Image loadImage(String fileName)
|
static Image loadImage(String fileName)
|
||||||
|
|
Reference in a new issue