MakeTiles: make tile drawing code more object-orientated
Separate classes for tile layers, tile sprites, etc., to make it easier to introduce more complicated/flexible tile configurations in the future.
This commit is contained in:
parent
2791a5658a
commit
2ea3318dea
1 changed files with 90 additions and 40 deletions
|
@ -75,13 +75,13 @@ public class MakeTiles
|
||||||
assert rawSpec != null;
|
assert rawSpec != null;
|
||||||
|
|
||||||
TileSpec tileSpec = TileSpec.parse(tileNumber, tileName, rawSpec, recipe);
|
TileSpec tileSpec = TileSpec.parse(tileNumber, tileName, rawSpec, recipe);
|
||||||
FrameSpec ref = parseFrameSpec(tileSpec);
|
TileImage ref = parseFrameSpec(tileSpec);
|
||||||
if (ref == null) {
|
if (ref == null) {
|
||||||
// tile is defined, but it has no images
|
// tile is defined, but it has no images
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
drawTo(ref, gr, 0, TILE_SIZE*i);
|
ref.drawTo(gr, 0, TILE_SIZE*i, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// make parent directories if necessary
|
// make parent directories if necessary
|
||||||
|
@ -127,27 +127,40 @@ public class MakeTiles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drawTo(FrameSpec ref, Graphics2D gr, int destX, int destY)
|
static abstract class TileImage
|
||||||
throws IOException
|
|
||||||
{
|
{
|
||||||
if (ref.background != null) {
|
abstract void drawTo(Graphics2D gr, int destX, int destY, int srcX, int srcY);
|
||||||
drawTo(ref.background, gr, destX, destY);
|
|
||||||
}
|
|
||||||
|
|
||||||
SourceImage sourceImg = ref.image;
|
|
||||||
|
|
||||||
gr.drawImage(
|
|
||||||
sourceImg.image,
|
|
||||||
destX, destY,
|
|
||||||
destX+TILE_SIZE, destY+TILE_SIZE,
|
|
||||||
ref.offsetX * sourceImg.basisSize / STD_SIZE,
|
|
||||||
ref.offsetY * sourceImg.basisSize / STD_SIZE,
|
|
||||||
(ref.offsetX + STD_SIZE) * sourceImg.basisSize / STD_SIZE,
|
|
||||||
(ref.offsetY + STD_SIZE) * sourceImg.basisSize / STD_SIZE,
|
|
||||||
null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static class SourceImage
|
static class TileImageLayer extends TileImage
|
||||||
|
{
|
||||||
|
TileImageLayer below;
|
||||||
|
TileImage above;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void drawTo(Graphics2D gr, int destX, int destY, int srcX, int srcY)
|
||||||
|
{
|
||||||
|
if (below != null) {
|
||||||
|
below.drawTo(gr, destX, destY, srcX, srcY);
|
||||||
|
}
|
||||||
|
above.drawTo(gr, destX, destY, srcX, srcY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class TileImageSprite extends TileImage
|
||||||
|
{
|
||||||
|
TileImage source;
|
||||||
|
int offsetX;
|
||||||
|
int offsetY;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void drawTo(Graphics2D gr, int destX, int destY, int srcX, int srcY)
|
||||||
|
{
|
||||||
|
source.drawTo(gr, destX, destY, srcX+offsetX, srcY+offsetY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class SourceImage extends TileImage
|
||||||
{
|
{
|
||||||
Image image;
|
Image image;
|
||||||
int basisSize;
|
int basisSize;
|
||||||
|
@ -156,44 +169,81 @@ public class MakeTiles
|
||||||
this.image = image;
|
this.image = image;
|
||||||
this.basisSize = basisSize;
|
this.basisSize = basisSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void drawTo(Graphics2D gr, int destX, int destY, int srcX, int srcY)
|
||||||
|
{
|
||||||
|
srcX = srcX * basisSize / STD_SIZE;
|
||||||
|
srcY = srcY * basisSize / STD_SIZE;
|
||||||
|
|
||||||
|
gr.drawImage(
|
||||||
|
image,
|
||||||
|
destX, destY,
|
||||||
|
destX+TILE_SIZE, destY+TILE_SIZE,
|
||||||
|
srcX, srcY,
|
||||||
|
srcX+basisSize, srcY+basisSize,
|
||||||
|
null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class FrameSpec
|
static TileImage parseFrameSpec(TileSpec spec)
|
||||||
{
|
|
||||||
FrameSpec background;
|
|
||||||
SourceImage image;
|
|
||||||
int offsetX;
|
|
||||||
int offsetY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FrameSpec parseFrameSpec(TileSpec spec)
|
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
FrameSpec result = null;
|
return parseFrameSpec(spec.getImages());
|
||||||
|
}
|
||||||
|
|
||||||
for (String layerStr : spec.getImages()) {
|
static TileImage parseFrameSpec(String rawSpec)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
String [] parts = rawSpec.split("|");
|
||||||
|
for (int i = 0; i < parts.length; i++) {
|
||||||
|
parts[i] = parts[i].trim();
|
||||||
|
}
|
||||||
|
return parseFrameSpec(parts);
|
||||||
|
}
|
||||||
|
|
||||||
FrameSpec rv = new FrameSpec();
|
static TileImage parseFrameSpec(String [] layerStrings)
|
||||||
rv.background = result;
|
throws IOException
|
||||||
result = rv;
|
{
|
||||||
|
if (layerStrings.length == 1) {
|
||||||
|
return parseLayerSpec(layerStrings[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
TileImageLayer result = null;
|
||||||
|
|
||||||
|
for (String layerStr : layerStrings) {
|
||||||
|
|
||||||
|
TileImageLayer rv = new TileImageLayer();
|
||||||
|
rv.below = result;
|
||||||
|
rv.above = parseLayerSpec(layerStr);
|
||||||
|
result = rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static TileImage parseLayerSpec(String layerStr)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
String [] parts = layerStr.split("@", 2);
|
String [] parts = layerStr.split("@", 2);
|
||||||
rv.image = loadImage(parts[0]);
|
TileImage img = loadImage(parts[0]);
|
||||||
|
|
||||||
if (parts.length >= 2) {
|
if (parts.length >= 2) {
|
||||||
|
TileImageSprite sprite = new TileImageSprite();
|
||||||
|
sprite.source = img;
|
||||||
|
|
||||||
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]);
|
sprite.offsetX = Integer.parseInt(parts[0]);
|
||||||
}
|
}
|
||||||
if (parts.length >= 2) {
|
if (parts.length >= 2) {
|
||||||
rv.offsetY = Integer.parseInt(parts[1]);
|
sprite.offsetY = Integer.parseInt(parts[1]);
|
||||||
}
|
}
|
||||||
|
return sprite;
|
||||||
}//endif something given after '@' in image specifier
|
}//endif something given after '@' in image specifier
|
||||||
|
|
||||||
}//end foreach layer in image specification
|
return img;
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static File findInkscape()
|
static File findInkscape()
|
||||||
|
|
Reference in a new issue