package com.igorcrevar.rolloverchuck.utils;
import java.lang.reflect.Field;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector3;
public class GameHelper {
public static float screenX2OtherX(float x, float worldX) {
return worldX * x / Gdx.graphics.getWidth();
}
public static float screenY2OtherY(float y, float worldY) {
return worldY * (Gdx.graphics.getHeight() - y) / Gdx.graphics.getHeight();
}
public static void clearScreen() {
Gdx.graphics.getGL20().glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Gdx.graphics.getGL20().glClearDepthf(1.0f);
Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
}
public static boolean tapPointInsideRectangle(float x, float y, float rectX, float rectY, float rectWidth, float rectHeight) {
return x >= rectX && x <= rectX + rectWidth && y >= rectY - rectHeight && y <= rectY;
}
public static float getAlignedPosX(BitmapFont font, String txt, float sizeX) {
return (sizeX - font.getBounds(txt).width) / 2.0f;
}
public static float getAlignedPosY(BitmapFont font, String txt, float sizeY) {
return (sizeY - font.getBounds(txt).height) / 2.0f;
}
public static void setProjectionFor2D(SpriteBatch spriteBatch, float width, float height) {
spriteBatch.getProjectionMatrix().setToOrtho2D(0, 0, width, height);
}
private static Vector3 tmp1 = new Vector3();
private static Vector3 tmp2 = new Vector3();
private static Vector3 tmp3 = new Vector3();
/**
* populate vertex buffer with normals
* @param vert vertex buffer
* @param ind index buffer
* @param vertexSize size of one vertex
* @param posOffset offset of position data inside vertex
* @param normalOffset offset of normal data inside vertex
*/
public static void populateNormals(float[] vert, short[] ind, int vertexSize, int posOffset, int normalOffset) {
for (int i = 0; i < ind.length; i += 3) {
int off1 = vertexSize * ind[i];
int off2 = vertexSize * ind[i + 1];
int off3 = vertexSize * ind[i + 2];
// set vertex positions
tmp1.set(vert[off1 + posOffset], vert[off1 + posOffset + 1], vert[off1 + posOffset + 2]);
tmp2.set(vert[off2 + posOffset], vert[off2 + posOffset + 1], vert[off2 + posOffset + 2]);
tmp3.set(vert[off3 + posOffset], vert[off3 + posOffset + 1], vert[off3 + posOffset + 2]);
// subs
tmp2.sub(tmp1);
tmp3.sub(tmp1);
// cross
tmp2.crs(tmp3).nor();
// save normals
vert[off1 + normalOffset] = tmp2.x;
vert[off1 + normalOffset + 1] = tmp2.y;
vert[off1 + normalOffset + 2] = tmp2.z;
}
}
private static String lastStrValue = null;
private static long lastPointsValue = Long.MIN_VALUE;
public static String getStringPoints(long pointsScore) {
if (pointsScore == lastPointsValue) {
return lastStrValue;
}
else if (pointsScore <= 99999999l) {
lastStrValue = String.valueOf(pointsScore);
}
else if (pointsScore <= 99999999999l) {
lastStrValue = String.valueOf(pointsScore / 1000l) + "K";
}
else if (pointsScore <= 99999999999999l) {
lastStrValue = String.valueOf(pointsScore / 1000000l) + "M";
}
else {
lastStrValue = String.valueOf(pointsScore / 1000000000l) + "G";
}
lastPointsValue = pointsScore;
return lastStrValue;
}
public static void load(String fileName, Object object) {
try {
FileHandle fh = Gdx.files.external(fileName);
Field[] fields = object.getClass().getFields();
if (fh.exists()) {
String content = fh.readString();
String[] rows = content.split("\n");
for (String r : rows) {
String[] data = r.split("=");
if (data.length != 2) continue;
for (Field f : fields) {
Class<?> type = f.getType();
if (f.getName().equals(data[0])) {
if (type.isPrimitive()) {
if (type.equals(boolean.class)) {
f.setBoolean(object, Boolean.parseBoolean(data[1]));
}
else if (type.equals(float.class)) {
f.setFloat(object, Float.parseFloat(data[1]));
}
else if (type.equals(int.class)) {
f.setInt(object, Integer.parseInt(data[1]));
}
else if (type.equals(long.class)) {
f.setLong(object, Long.parseLong(data[1]));
}
}
else if (type.getName().equals("com.badlogic.gdx.math.Vector3")) {
String[] tmp = data[1].split(",");
f.set(object, new Vector3(Float.parseFloat(tmp[0]), Float.parseFloat(tmp[1]), Float.parseFloat(tmp[2])));
}
break;
}
}
}
}
else {
StringBuilder content = new StringBuilder();
for (Field f : fields) {
content.append(f.getName()).append('=');
Class<?> type = f.getType();
String tmp = "";
if (type.equals(boolean.class)) {
tmp = Boolean.toString(f.getBoolean(object));
}
else if (type.equals(float.class)) {
tmp = Float.toString(f.getFloat(object));
}
else if (type.equals(int.class)) {
tmp = Integer.toString(f.getInt(object));
}
else if (type.equals(long.class)) {
tmp = Long.toString(f.getLong(object));
}
else if (type.getName().equals("com.badlogic.gdx.math.Vector3")) {
Vector3 v = (Vector3)f.get(object);
tmp = v.x + "," + v.y + "," + v.z;
}
content.append(tmp).append("\n");
}
fh.writeString(content.toString(), false);
}
}
catch (Exception ex) {
}
}
}