package com.arretadogames.pilot.entities;
import android.util.Log;
import com.arretadogames.pilot.physics.PhysicalWorld;
import com.arretadogames.pilot.render.AnimationSwitcher;
import com.arretadogames.pilot.render.PhysicsRect;
import com.arretadogames.pilot.render.Renderable;
import org.jbox2d.callbacks.ContactImpulse;
import org.jbox2d.collision.Manifold;
import org.jbox2d.collision.shapes.Shape;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.FixtureDef;
import org.jbox2d.dynamics.World;
import org.jbox2d.dynamics.contacts.Contact;
public abstract class Entity implements Renderable, LayerEntity {
public enum State {
ALIVE, DYING, DEAD;
}
public Body body;
protected World world;
protected PhysicsRect physRect;
protected State state;
protected boolean isOnWater;
public Entity(float x, float y) {
world = PhysicalWorld.getInstance().getWorld();
BodyDef bd = new BodyDef();
bd.position.set(x, y);
bd.userData = this;
body = world.createBody(bd);
body.setUserData(this);
body.setSleepingAllowed(true);
body.setAwake(false);
state = State.ALIVE;
}
@Override
public int getLayerPosition() {
return 0;
}
public void setOnWater(boolean isOnWater) {
this.isOnWater = isOnWater;
}
public boolean isOnWater() {
return isOnWater;
}
public final boolean isAlive() {
return state != State.DEAD;
}
public final boolean isDead() {
return state == State.DEAD;
}
/**
* Subclasses may override this to capture the kill event
*/
public void kill() {
if (!isAlive()) {
Log.i("Entity", "Trying to kill a entity that is not alive");
} else {
state = State.DEAD;
}
}
public void addFixture(FixtureDef fd){
body.createFixture(fd);
}
public float getPosX(){
return body.getPosition().x;
}
public float getPosY(){
return body.getPosition().y;
}
public void beginContact(Entity e, Contact contact) {
}
public void endContact(Entity e , Contact contact) {
}
public abstract EntityType getType();
public abstract void setSprite(AnimationSwitcher sprite);
public void destroyBody() {
world.destroyBody(body);
}
public void preSolve(Entity e, Contact contact, Manifold oldManifold) {
}
public void postSolve(Entity e, Contact contact, ContactImpulse impulse) {
}
public Shape getWaterContactShape() {
return body.m_fixtureList.m_shape;
}
}