package com.gebauz.bauzoid.menu;
import com.gebauz.bauzoid.game.Game;
import com.gebauz.bauzoid.graphics.sprite.Sprite;
import com.gebauz.bauzoid.math.Rect;
import com.gebauz.bauzoid.math.Vector4;
import com.gebauz.bauzoid.parser.ScanException;
import com.gebauz.bauzoid.parser.Tokenizer;
/** Button that uses a Frame as image.
*
* @author chiu
*
*/
public class SegmentButton
extends Button
{
// Constants========================================================================================
// Embedded Types===================================================================================
// Fields===========================================================================================
private String mTextureName =
"";
private String mPushTextureName =
"";
private String mButtonImageName =
"";
private FrameElement mImage =
null;
private FrameElement mPushImage =
null;
private Sprite mButtonImage =
null;
private float mButtonImageScale = 1.0f
;
private HorizontalAlign mButtonImageAlignH = HorizontalAlign.
CENTER;
private VerticalAlign mButtonImageAlignV = VerticalAlign.
CENTER;
// Methods==========================================================================================
public SegmentButton
(Game game,
Menu parent,
String name
)
{
super(game, parent, name
);
}
@
Override
public void init
()
{
super.
init();
mImage =
new FrameElement
(getParent
().
getGame());
mImage.
setInnerOffset(new Rect
(FrameElement.
CELL_SIZE, FrameElement.
CELL_SIZE, FrameElement.
CELL_SIZE, FrameElement.
CELL_SIZE));
//mImage.init(new Texture(Gdx.files.internal(mTextureName)), true);
mImage.
init(mTextureName,
true);
Frame.
setFrameProperties(mImage,
this);
if (!mPushTextureName.
isEmpty())
{
mPushImage =
new FrameElement
(getParent
().
getGame());
if (mPushImage
!=
null)
{
mPushImage.
setInnerOffset(new Rect
(FrameElement.
CELL_SIZE, FrameElement.
CELL_SIZE, FrameElement.
CELL_SIZE, FrameElement.
CELL_SIZE));
mPushImage.
init(mPushTextureName,
true);
//mPushImage.init(new Texture(Gdx.files.internal(mPushTextureName)), true);
Frame.
setFrameProperties(mPushImage,
this);
}
}
if (!mButtonImageName.
isEmpty())
{
//mButtonImage = new Sprite(getParent().getGame().getGraphics(), new Texture(Gdx.files.internal(mButtonImageName)));
mButtonImage =
new Sprite
(getGame
().
getGraphics(), mButtonImageName
);
mButtonImage.
init();
}
}
@
Override
public void exit
()
{
if (mImage
!=
null)
{
mImage.
exit();
mImage =
null;
}
if (mPushImage
!=
null)
{
mPushImage.
exit();
mPushImage =
null;
}
if (mButtonImage
!=
null)
{
mButtonImage.
dispose();
mButtonImage =
null;
}
super.
exit();
}
@
Override
public void update
(float deltaTime
)
{
super.
update(deltaTime
);
mImage.
update(deltaTime
);
Frame.
setFrameProperties(mImage,
this);
if (mPushImage
!=
null)
{
Frame.
setFrameProperties(mPushImage,
this);
mPushImage.
update(deltaTime
);
}
if (mButtonImage
!=
null)
{
// treat like text
float w = getRight
() - getLeft
();
float h = getBottom
() - getTop
();
mButtonImage.
param.
x = getLeft
();
mButtonImage.
param.
y = getTop
();
mButtonImage.
param.
w = mButtonImage.
getTextureWidth() * mButtonImageScale
;
mButtonImage.
param.
h = mButtonImage.
getTextureHeight() * mButtonImageScale
;
mButtonImage.
param.
pivotX =
0;
mButtonImage.
param.
pivotY =
0;
if (mButtonImageAlignH == HorizontalAlign.
RIGHT)
{
mButtonImage.
param.
x = getRight
();
mButtonImage.
param.
pivotX = mButtonImage.
param.
w;
}
else if (mButtonImageAlignH == HorizontalAlign.
CENTER)
{
mButtonImage.
param.
x = getLeft
() + w/
2;
mButtonImage.
param.
pivotX = mButtonImage.
param.
w/
2;
}
if (mButtonImageAlignV == VerticalAlign.
BOTTOM)
{
mButtonImage.
param.
y = getBottom
();
mButtonImage.
param.
pivotY = mButtonImage.
param.
h;
}
else if (mButtonImageAlignV == VerticalAlign.
CENTER)
{
mButtonImage.
param.
y = getTop
() + h/
2;
mButtonImage.
param.
pivotY = mButtonImage.
param.
h/
2;
}
if (isButtonDown
())
{
mButtonImage.
param.
x += getPushOffset
().
x;
mButtonImage.
param.
y += getPushOffset
().
y;
}
}
}
@
Override
public void render
()
{
if (isButtonDown
() && (mPushImage
!=
null))
mPushImage.
render();
else
mImage.
render();
if (mButtonImage
!=
null)
{
float oldAlpha = mButtonImage.
param.
alpha;
mButtonImage.
param.
alpha *= getParent
().
getFadeAlpha();
if (getTextElement
().
isShadow())
{
Vector4 oldColor = mButtonImage.
param.
color;
mButtonImage.
param.
color = getTextElement
().
getShadowColor();
mButtonImage.
param.
x += getTextElement
().
getShadowOffset().
x;
mButtonImage.
param.
y += getTextElement
().
getShadowOffset().
y;
mButtonImage.
render();
mButtonImage.
param.
x -= getTextElement
().
getShadowOffset().
x;
mButtonImage.
param.
y -= getTextElement
().
getShadowOffset().
y;
mButtonImage.
param.
color = oldColor
;
}
mButtonImage.
render();
mButtonImage.
param.
alpha = oldAlpha
;
}
super.
render();
}
public boolean parseLine
(String identifier, Tokenizer tokenizer
) throws ScanException
{
if (identifier.
equalsIgnoreCase("texture"))
{
mTextureName = MenuUtil.
parseString(tokenizer
);
}
else if (identifier.
equalsIgnoreCase("pushTexture"))
{
mPushTextureName = MenuUtil.
parseString(tokenizer
);
}
else if (identifier.
equalsIgnoreCase("buttonImage"))
{
mButtonImageName = MenuUtil.
parseString(tokenizer
);
}
else if (identifier.
equalsIgnoreCase("buttonImageScale"))
{
mButtonImageScale = MenuUtil.
parseNumber(tokenizer
);
}
else if (identifier.
equalsIgnoreCase("buttonImageAlign"))
{
mButtonImageAlignH = MenuUtil.
stringToHorizontalAlignment(tokenizer.
readIdentifier());
tokenizer.
readToken(",");
mButtonImageAlignV = MenuUtil.
stringToVerticalAlignment(tokenizer.
readIdentifier());
tokenizer.
readToken(";");
}
else
{
return super.
parseLine(identifier, tokenizer
);
}
return true;
}
// Getters/Setters==================================================================================
}