package com.gushikustudios.rube;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
/**
* Simple class for spatial (image) rendering. If a body reference is included, its position will serve as the local coordinate system.
*
* @author tescott
*
*/
public class SimpleSpatial {
private Sprite mSprite;
private Body mBody;
private final Vector2 mCenter = new Vector2();
private final Vector2 mHalfSize = new Vector2();
private float mRotation;
private static final Vector2 mTmp = new Vector2();
public SimpleSpatial(Texture texture, boolean flip, Body body, Color color, Vector2 size,
Vector2 center, float rotationInDegrees) {
mSprite = new Sprite(texture);
defineSpatial(flip,body,color,size,center,rotationInDegrees);
}
public SimpleSpatial(TextureRegion region, boolean flip, Body body, Color color,
Vector2 size, Vector2 center, float rotationInDegrees) {
mSprite = new Sprite(region);
defineSpatial(flip,body,color,size,center,rotationInDegrees);
}
public void defineSpatial(boolean flip, Body body, Color color, Vector2 size,
Vector2 center, float rotationInDegrees)
{
mBody = body;
mSprite.flip(flip, false);
mSprite.setColor(color);
mRotation = rotationInDegrees;
mSprite.setSize(size.x, size.y);
mSprite.setOrigin(size.x / 2, size.y / 2);
mHalfSize.set(size.x / 2, size.y / 2);
mCenter.set(center);
if (body != null) {
mTmp.set(body.getPosition());
mSprite.setPosition(mTmp.x - size.x / 2, mTmp.y - size.y / 2);
float angle = mBody.getAngle() * MathUtils.radiansToDegrees;
mTmp.set(mCenter).rotate(angle).add(mBody.getPosition())
.sub(mHalfSize);
mSprite.setRotation(mRotation + angle);
} else {
mTmp.set(center.x - size.x / 2, center.y - size.y / 2);
mSprite.setRotation(rotationInDegrees);
}
mSprite.setPosition(mTmp.x, mTmp.y);
}
public void render(SpriteBatch batch, float delta) {
// if this is a dynamic spatial...
if (mBody != null) {
// use body information to render it...
float angle = mBody.getAngle() * MathUtils.radiansToDegrees;
mTmp.set(mCenter).rotate(angle).add(mBody.getPosition())
.sub(mHalfSize);
mSprite.setPosition(mTmp.x, mTmp.y);
mSprite.setRotation(mRotation + angle);
mSprite.draw(batch);
} else {
// else just draw it wherever it was defined at initialization
mSprite.draw(batch);
}
}
}