package com.sunnet;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.utils.GdxRuntimeException;
public class LogoDrawer
{
private final static int[][] qpLogo = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1,
1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1,
1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1,
1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 1, 1, 1, 1, 1, 1 },
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,
1, 1, 1, 0, 1, 1, 1 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 1, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 }
};
private final String qpText = "http://qplay.vn";
private static float SLEEP_INTERVAL = 0.1f;
private float mCountTime = 0;
public static final byte FAST_ANIMATING = 1;
public static final byte NORMAL_ANIMATING = 2;
public static final byte SLOW_ANIMATING = 3;
// ===============================================
private final float[] color = { 0, 0, 0 };
private int i = 1, t = 0, left, top;
private final int rd, width, height;
private int x = 0, y = 0, xText = 0, yText = 0;
private final int mPixelSize;
private final int mPixelDistance;
private final float sizeText;
private boolean mStopAnimation = false;
private boolean isRunning = false;
// switch between two animation
private boolean changed = false;
// ===============================================
private final ShapeRenderer renderer;
private Runnable mCompleteListener = null;
public LogoDrawer()
{
renderer = new ShapeRenderer();
/* =============================== */
i = 1;
rd = MathUtils.random(0, 2);
/* =============================== */
width = Gdx.graphics.getWidth();
height = Gdx.graphics.getHeight();
renderer.setProjectionMatrix(new Matrix4().setToOrtho2D(0, height, width, -height));
/* =============================== */
int sizeLarge = (width < height) ? width : height;
if (sizeLarge >= 480) {
mPixelDistance = 10;
mPixelSize = 5;
sizeText = 25f * qpText.length();
} else if (sizeLarge >= 320) {
mPixelDistance = 6;
mPixelSize = 3;
sizeText = 18f * qpText.length();
} else {
mPixelDistance = 4;
mPixelSize = 2;
sizeText = 12f * qpText.length();
}
x = width >> 1;
y = height >> 1;
x = x - 36 * (mPixelDistance) / 2;
y = (int) ((float) height * 0.382) - 20 * mPixelDistance / 2;
xText = (int) ((width >> 1) - sizeText / 2);
yText = (int) ((float) height * 0.764f - sizeText / 2);
left = x;
top = y;
}
/******************************************************
*
******************************************************/
public void draw (float delta)
{
drawLogoQplay();
update(delta);
}
private void drawLogoQplay ()
{
if (i <= 0)
return;
renderer.begin(ShapeType.Filled);
renderer.setColor(color[0], color[1], color[2], 1);
if (rd == 0) {
for (int q = 1; q <= 35 - (11 - i) * 3; q++) {
for (int p = 1; p <= 20; p++) {
if (qpLogo[p - 1][q - 1] == 1) {
left = q * mPixelDistance + x;
top = p * mPixelDistance + y;
renderer.rect(left, top, mPixelSize, mPixelSize);
}
}
}
}
else if (rd == 1) {
for (int q = 1; q <= 35; q++) {
for (int p = 1; p <= 20 - (11 - i) * 2; p++) {
if (qpLogo[p - 1][q - 1] == 1) {
left = q * mPixelDistance + x;
top = p * mPixelDistance + y;
renderer.rect(left, top, mPixelSize, mPixelSize);
}
}
}
} else {
for (int q = 1; q <= 35 - (11 - i) * 3; q++) {
for (int p = 1; p <= 20 - (11 - i) * 2; p++) {
if (qpLogo[p - 1][q - 1] == 1) {
left = q * mPixelDistance + x;
top = p * mPixelDistance + y;
renderer.rect(left, top, mPixelSize, mPixelSize);
}
}
}
}
renderer.end();
}
private void update (float delta)
{
if (mStopAnimation)
return;
isRunning = true;
mCountTime += delta;
if (mCountTime >= SLEEP_INTERVAL) {
mCountTime = 0;
if (i > 0) {
if ((i <= 11) && !changed) {
color[0] = (float) (i * 20 + 30) / 255;
color[1] = (float) (i * 15) / 255;
color[2] = 0;
if (i < 11)
i++;
if (i == 11) {
if (t < 10)
t++;
else
changed = true;
}
} else if (changed) {
i--;
color[0] = (float) (i * 20 + 30) / 255;
color[1] = (float) (i * 15) / 255;
color[2] = 0;
}
}
}
if (changed && i == 0) {
stopAnimation();
}
}
/******************************************************
*
******************************************************/
public void postCompleteAction (Runnable runnable)
{
// if (isRunning)
// throw new GdxRuntimeException("You can not config the LogoDrawer while it is drawing");
this.mCompleteListener = runnable;
}
public void stopAnimation ()
{
mStopAnimation = true;
isRunning = false;
renderer.dispose();
if (mCompleteListener != null)
mCompleteListener.run();
}
public void setDuration (byte logoDuration)
{
if (isRunning)
throw new GdxRuntimeException("You can not config the LogoDrawer while it is drawing");
switch (logoDuration) {
case FAST_ANIMATING:
SLEEP_INTERVAL = 0.066f;
break;
case SLOW_ANIMATING:
SLEEP_INTERVAL = 0.13f;
break;
default:
SLEEP_INTERVAL = 0.1f;
}
}
public boolean isRunning ()
{
return isRunning;
}
}