TileImage: prepare the way for implementing normalForm()
This commit is contained in:
parent
3d2733436e
commit
d9761ec54f
1 changed files with 84 additions and 0 deletions
|
@ -12,6 +12,19 @@ public abstract class TileImage
|
||||||
{
|
{
|
||||||
public static final int STD_SIZE = 16;
|
public static final int STD_SIZE = 16;
|
||||||
|
|
||||||
|
interface MultiPart
|
||||||
|
{
|
||||||
|
MultiPart makeEmptyCopy();
|
||||||
|
Iterable<? extends Part> parts();
|
||||||
|
void addPartLike(TileImage m, Part p);
|
||||||
|
TileImage asTileImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Part
|
||||||
|
{
|
||||||
|
TileImage getImage();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws a part of this tile image to the given graphics context.
|
* Draws a part of this tile image to the given graphics context.
|
||||||
*/
|
*/
|
||||||
|
@ -22,6 +35,15 @@ public abstract class TileImage
|
||||||
this.drawFragment(gr, destX, destY, 0, 0);
|
this.drawFragment(gr, destX, destY, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Brings any internal Animation object to the top of the hierarchy.
|
||||||
|
*/
|
||||||
|
public TileImage normalForm()
|
||||||
|
{
|
||||||
|
// subclasses should override this behavior
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public static class TileImageLayer extends TileImage
|
public static class TileImageLayer extends TileImage
|
||||||
{
|
{
|
||||||
public final TileImage below;
|
public final TileImage below;
|
||||||
|
@ -36,6 +58,42 @@ public abstract class TileImage
|
||||||
this.above = above;
|
this.above = above;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TileImage normalForm()
|
||||||
|
{
|
||||||
|
TileImage below1 = below.normalForm();
|
||||||
|
TileImage above1 = above.normalForm();
|
||||||
|
|
||||||
|
if (above1 instanceof MultiPart) {
|
||||||
|
|
||||||
|
MultiPart rv = ((MultiPart)above1).makeEmptyCopy();
|
||||||
|
for (Part p : ((MultiPart)above1).parts()) {
|
||||||
|
TileImageLayer m = new TileImageLayer(
|
||||||
|
below1,
|
||||||
|
p.getImage()
|
||||||
|
);
|
||||||
|
rv.addPartLike(m, p);
|
||||||
|
}
|
||||||
|
return rv.asTileImage();
|
||||||
|
}
|
||||||
|
else if (below1 instanceof MultiPart) {
|
||||||
|
|
||||||
|
MultiPart rv = ((MultiPart)below1).makeEmptyCopy();
|
||||||
|
for (Part p : ((MultiPart)below1).parts()) {
|
||||||
|
TileImageLayer m = new TileImageLayer(
|
||||||
|
p.getImage(),
|
||||||
|
above1
|
||||||
|
);
|
||||||
|
rv.addPartLike(m, p);
|
||||||
|
}
|
||||||
|
return rv.asTileImage();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
return new TileImageLayer(below1, above1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawFragment(Graphics2D gr, int destX, int destY, int srcX, int srcY)
|
public void drawFragment(Graphics2D gr, int destX, int destY, int srcX, int srcY)
|
||||||
{
|
{
|
||||||
|
@ -55,6 +113,32 @@ public abstract class TileImage
|
||||||
this.source = source;
|
this.source = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TileImage normalForm()
|
||||||
|
{
|
||||||
|
TileImage source_n = source.normalForm();
|
||||||
|
if (source_n instanceof MultiPart) {
|
||||||
|
|
||||||
|
MultiPart rv = ((MultiPart)source_n).makeEmptyCopy();
|
||||||
|
for (Part p : ((MultiPart)source_n).parts()) {
|
||||||
|
TileImageSprite m = sameTransformFor(p.getImage());
|
||||||
|
rv.addPartLike(m, p);
|
||||||
|
}
|
||||||
|
return rv.asTileImage();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return sameTransformFor(source_n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TileImageSprite sameTransformFor(TileImage img)
|
||||||
|
{
|
||||||
|
TileImageSprite m = new TileImageSprite(img);
|
||||||
|
m.offsetX = this.offsetX;
|
||||||
|
m.offsetY = this.offsetY;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawFragment(Graphics2D gr, int destX, int destY, int srcX, int srcY)
|
public void drawFragment(Graphics2D gr, int destX, int destY, int srcX, int srcY)
|
||||||
{
|
{
|
||||||
|
|
Reference in a new issue