package loon.action.sprite;
import loon.canvas.Canvas;
import loon.canvas.LColor;
import loon.font.IFont;
import loon.font.LFont;
import loon.opengl.GLEx;
import loon.utils.MathUtils;
import loon.utils.StringUtils;
import loon.utils.timer.CountdownTimer;
/*
* 显示大写数字
*
* example:
* NumberSprite number = new NumberSprite("1334");
* number.setLocation(125, 125);
* add(number);
*
*/
public class NumberSprite extends Entity {
private CountdownTimer countdownTimer;
private String label;
// 0
public static final int[][] ZERO = { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 0, 1 },
{ 1, 0, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, };
// 1
public static final int[][] ONE = { { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 },
{ 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, };
// 2
public static final int[][] TWO = { { 1, 1, 1 }, { 0, 0, 1 }, { 1, 1, 1 },
{ 1, 0, 0 }, { 1, 0, 0 }, { 1, 1, 1 }, };
// 3
public static final int[][] THREE = { { 1, 1, 1 }, { 0, 0, 1 },
{ 1, 1, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, { 1, 1, 1 }, };
// 4
public static final int[][] FOUR = { { 1, 0, 1 }, { 1, 0, 1 }, { 1, 1, 1 },
{ 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, };
// 5
public static final int[][] FIVE = { { 1, 1, 1 }, { 1, 0, 0 }, { 1, 1, 1 },
{ 0, 0, 1 }, { 0, 0, 1 }, { 1, 1, 1 }, };
// 6
public static final int[][] SIX = { { 1, 1, 1 }, { 1, 0, 0 }, { 1, 1, 1 },
{ 1, 0, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, };
// 7
public static final int[][] SEVEN = { { 1, 1, 1 }, { 0, 0, 1 },
{ 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, };
// 8
public static final int[][] EIGHT = { { 1, 1, 1 }, { 1, 0, 1 },
{ 1, 1, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, };
// 9
public static final int[][] NINE = { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 },
{ 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, };
private int unit;
public NumberSprite(String mes) {
this(mes, LColor.white);
}
public NumberSprite(String mes, LColor color) {
this(mes, color, 5);
}
public NumberSprite(String mes, int unit) {
this(mes, LColor.white, unit);
}
public NumberSprite(String mes, LColor color, int unit) {
this(null, mes, color, unit);
}
public NumberSprite(CountdownTimer time, LColor color, int unit) {
this(time, null, color, unit);
}
public NumberSprite(CountdownTimer timer, String mes, LColor color, int unit) {
this.countdownTimer = timer;
this.label = timer == null ? mes : timer.getTime();
this.setColor(color);
this.unit = unit;
this.setRepaint(true);
if (label != null) {
int size = label.length() * unit;
super.setWidth(size * 3);
super.setHeight(2 * unit * 6);
}
}
public void setUnit(int unit) {
this.unit = unit;
}
public int getUnit() {
return unit;
}
private int[][] getNum(int num) {
if (num == 0) {
return ZERO;
} else if (num == 1) {
return ONE;
} else if (num == 2) {
return TWO;
} else if (num == 3) {
return THREE;
} else if (num == 4) {
return FOUR;
} else if (num == 5) {
return FIVE;
} else if (num == 6) {
return SIX;
} else if (num == 7) {
return SEVEN;
} else if (num == 8) {
return EIGHT;
} else if (num == 9) {
return NINE;
} else {
return ZERO;
}
}
public void drawNumber(GLEx g, int x, int y, int[][] num) {
int tmp = g.color();
g.setColor(_baseColor);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 6; j++) {
if (num[j][i] == 1) {
g.fillRect(x + (unit * i), y + (unit * j), unit, unit);
}
}
}
g.setColor(tmp);
}
public void drawNumber(GLEx g, int x, int y, String num) {
if (StringUtils.isEmpty(num)) {
return;
}
int index, size = unit * 9, offset = unit * 2;
for (int i = 0; i < num.length(); i++) {
String number = num.substring(i, i + 1);
if (MathUtils.isNan(number)) {
index = Integer.parseInt(number);
drawNumber(g, x + (unit * (4 * i)), y, getNum(index));
} else {
if (StringUtils.isChinese(number.charAt(0))) {
size = unit * 5;
offset = unit * 2;
IFont oldFont = g.getFont();
g.setFont(LFont.getFont(size));
g.drawText(number, x + (unit * (4 * i)) - 4, y + size / 2
+ offset + 4);
g.setFont(oldFont);
} else {
IFont oldFont = g.getFont();
g.setFont(LFont.getFont(size));
g.drawText(number, x + (unit * (4 * i)) - 4, y + size / 2
+ offset);
g.setFont(oldFont);
}
}
}
}
public void drawNumber(Canvas g, int x, int y, int[][] num) {
int tmp1 = g.getFillColor();
int tmp2 = g.getStrokeColor();
g.setColor(_baseColor);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 6; j++) {
if (num[j][i] == 1) {
g.fillRect(x + (unit * i), y + (unit * j), unit, unit);
}
}
}
g.setFillColor(tmp1);
g.setStrokeColor(tmp2);
}
public void drawNumber(Canvas g, int x, int y, String num) {
if (StringUtils.isEmpty(num)) {
return;
}
int index, size = unit * 10, offset = unit / 2;
for (int i = 0; i < num.length(); i++) {
String number = num.substring(i, i + 1);
if (MathUtils.isNan(number)) {
index = Integer.parseInt(number);
drawNumber(g, x + (unit * (4 * i)), y, getNum(index));
} else {
int tmp1 = g.getFillColor();
int tmp2 = g.getStrokeColor();
g.setColor(_baseColor);
if (StringUtils.isChinese(number.charAt(0))) {
size = unit * 5;
offset = unit * 2;
LFont oldFont = g.getFont();
g.setFont(LFont.getFont(size));
g.drawText(number, x + (unit * (4 * i)) - 4, y + size / 2
+ offset + 4 - g.getFont().getAscent());
g.setFont(oldFont);
} else {
LFont oldFont = g.getFont();
g.setFont(LFont.getFont(size));
g.drawText(number, x + (unit * (4 * i)) - 4, y + size / 2
+ offset - g.getFont().getAscent() + 4);
g.setFont(oldFont);
}
g.setFillColor(tmp1);
g.setStrokeColor(tmp2);
}
}
}
@Override
public void setWidth(float w) {
super.setWidth(w);
this.unit = (int) MathUtils.max(unit, w);
}
@Override
public void setHeight(float h) {
super.setHeight(h);
this.unit = (int) MathUtils.max(unit, h);
}
@Override
protected void onUpdate(long elapsedTime) {
if (countdownTimer != null) {
label = countdownTimer.getTime();
}
}
public void setCountdownTimer(CountdownTimer timer) {
this.countdownTimer = timer;
}
public CountdownTimer getCountdownTimer() {
return this.countdownTimer;
}
@Override
public void repaint(GLEx g, float offsetX, float offsetY) {
drawNumber(g, (int)drawX(offsetX), (int)drawY(offsetY), label);
}
}