package com.gebauz.bauzoid.menu;
import com.gebauz.bauzoid.game.Game;
import com.gebauz.bauzoid.game.GameObject;
import com.gebauz.bauzoid.graphics.sprite.Sprite;
import com.gebauz.bauzoid.graphics.sprite.SpriteInstance;
import com.gebauz.bauzoid.graphics.sprite.SpriteRegion;
import com.gebauz.bauzoid.graphics.sprite.TileBatch;
import com.gebauz.bauzoid.math.Rect;
import com.gebauz.bauzoid.math.Vector4;
public class FrameElement
extends GameObject
{
// TODO: make customizeable cell size
public static final float CELL_SIZE = 32.0f
;
public static final float TOP_OFFSET_ = 18.0f
;
public static final float LEFT_OFFSET_ = 8.0f
;
public static final float RIGHT_OFFSET_ = 8.0f
;
public static final float BOTTOM_OFFSET_ = 12.0f
;
/* public static final float TOP_OFFSET = CELL_SIZE-18.0f;
public static final float LEFT_OFFSET = CELL_SIZE-8.0f;
public static final float RIGHT_OFFSET = CELL_SIZE-8.0f;
public static final float BOTTOM_OFFSET = CELL_SIZE-12.0f;*/
public enum FrameRegion
{
TOP_LEFT,
TOP_CENTER,
TOP_RIGHT,
MID_LEFT,
MID_CENTER,
MID_RIGHT,
BOTTOM_LEFT,
BOTTOM_CENTER,
BOTTOM_RIGHT,
}
public float x = 0.0f
;
public float y = 0.0f
;
public float w = 0.0f
;
public float h = 0.0f
;
public Vector4 color =
new Vector4
(1,
1,
1,
1);
private Sprite mSprite =
null;
private SpriteInstance
[] mSprites =
new SpriteInstance
[FrameRegion.
values().
length];
/** Offsets for the frame, i.e. amount of pixels the actual inside-area is in from left/top/right/bottom. */
private Rect mInnerOffset =
null;
private boolean mIncludeMidCenter =
false;
public FrameElement
(Game game
)
{
super(game
);
}
public void init
(String textureFile,
boolean includeMidCenter
)
{
mIncludeMidCenter = includeMidCenter
;
mSprite =
new Sprite
(getGame
().
getGraphics(), textureFile
);
mSprite.
init();
SpriteRegion
[] regions =
new SpriteRegion
[FrameRegion.
values().
length];
for (int i =
0; i
< regions.
length; i++
)
{
// offset by 1 to account for the margin between regions
Vector4 r = getRegion
(FrameRegion.
values()[i
]);
regions
[i
] =
new SpriteRegion
(mSprite, i, r.
x, r.
y, r.
z, r.
w,
true);
}
mSprite.
setRegions(regions
);
//mSprite = new AtlasSprite(getGame().getGraphics(), tex, regions);
for (int i =
0; i
< regions.
length; i++
)
{
mSprites
[i
] = mSprite.
createSpriteInstance(i
);
}
if (mInnerOffset ==
null)
{
mInnerOffset =
new Rect
(LEFT_OFFSET_, TOP_OFFSET_, RIGHT_OFFSET_, BOTTOM_OFFSET_
);
}
}
public void exit
()
{
}
public void update
(float deltaTime
)
{
}
public void render
()
{
TileBatch batch = getGraphics
().
getBatch();
//batch.begin();
if (mIncludeMidCenter
)
renderMidCenter
(batch
);
renderTopLeft
(batch
);
renderTopCenter
(batch
);
renderTopRight
(batch
);
renderMidLeft
(batch
);
renderMidRight
(batch
);
renderBottomLeft
(batch
);
renderBottomCenter
(batch
);
renderBottomRight
(batch
);
//batch.end();
}
public void renderTopLeft
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
TOP_LEFT.
ordinal()];
s.
transform.
x = x + mInnerOffset.
left;
s.
transform.
y = y + mInnerOffset.
top;
s.
transform.
w = CELL_SIZE
;
s.
transform.
h = CELL_SIZE
;
s.
transform.
pivotX = s.
transform.
w;
s.
transform.
pivotY = s.
transform.
h;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public void renderTopCenter
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
TOP_CENTER.
ordinal()];
s.
transform.
x = x + mInnerOffset.
left;
s.
transform.
y = y + mInnerOffset.
top;
s.
transform.
w = w - mInnerOffset.
left - mInnerOffset.
right;
s.
transform.
h = CELL_SIZE
;
s.
transform.
pivotX =
0;
s.
transform.
pivotY = s.
transform.
h;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public void renderTopRight
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
TOP_RIGHT.
ordinal()];
s.
transform.
x = x + w - mInnerOffset.
right;
s.
transform.
y = y + mInnerOffset.
top;
s.
transform.
w = CELL_SIZE
;
s.
transform.
h = CELL_SIZE
;
s.
transform.
pivotX =
0;
s.
transform.
pivotY = s.
transform.
h;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public void renderMidLeft
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
MID_LEFT.
ordinal()];
s.
transform.
x = x + mInnerOffset.
left;
s.
transform.
y = y + mInnerOffset.
top;
s.
transform.
w = CELL_SIZE
;
s.
transform.
h = h - mInnerOffset.
top - mInnerOffset.
bottom;
s.
transform.
pivotX = s.
transform.
w;
s.
transform.
pivotY =
0;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public void renderMidCenter
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
MID_CENTER.
ordinal()];
s.
transform.
x = x + mInnerOffset.
left;
s.
transform.
y = y + mInnerOffset.
top;
s.
transform.
w = w - mInnerOffset.
left - mInnerOffset.
right;
s.
transform.
h = h - mInnerOffset.
top - mInnerOffset.
bottom;
s.
transform.
pivotX =
0;
s.
transform.
pivotY =
0;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public void renderMidRight
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
MID_RIGHT.
ordinal()];
s.
transform.
x = x + w - mInnerOffset.
right;
s.
transform.
y = y + mInnerOffset.
top;
s.
transform.
w = CELL_SIZE
;
s.
transform.
h = h - mInnerOffset.
top - mInnerOffset.
bottom;
s.
transform.
pivotX =
0;
s.
transform.
pivotY =
0;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public void renderBottomLeft
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
BOTTOM_LEFT.
ordinal()];
s.
transform.
x = x + mInnerOffset.
left;
s.
transform.
y = y + h - mInnerOffset.
bottom;
s.
transform.
w = CELL_SIZE
;
s.
transform.
h = CELL_SIZE
;
s.
transform.
pivotX = s.
transform.
w;
s.
transform.
pivotY =
0;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public void renderBottomCenter
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
BOTTOM_CENTER.
ordinal()];
s.
transform.
x = x + mInnerOffset.
left;
s.
transform.
y = y + h - mInnerOffset.
bottom;
s.
transform.
w = w - mInnerOffset.
left - mInnerOffset.
right;
s.
transform.
h = CELL_SIZE
;
s.
transform.
pivotX =
0;
s.
transform.
pivotY =
0;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public void renderBottomRight
(TileBatch batch
)
{
SpriteInstance s = mSprites
[FrameRegion.
BOTTOM_RIGHT.
ordinal()];
s.
transform.
x = x + w - mInnerOffset.
right;
s.
transform.
y = y + h - mInnerOffset.
bottom;
s.
transform.
w = CELL_SIZE
;
s.
transform.
h = CELL_SIZE
;
s.
transform.
pivotX =
0;
s.
transform.
pivotY =
0;
s.
color = color
;
//s.render();
batch.
drawSprite(s
);
}
public Vector4 getRegion
(FrameRegion region
)
{
return new Vector4
((region.
ordinal() % 3) * 16,
(region.
ordinal() /
3) * 16,
16,
16);
}
public Rect getInnerOffset
() { return mInnerOffset
; }
public void setInnerOffset
(Rect offset
) { mInnerOffset = offset
; }
}