package org.andengine.extension.physics.box2d; import java.util.Iterator; import java.util.List; import org.andengine.engine.handler.IUpdateHandler; import org.andengine.engine.handler.runnable.RunnableHandler; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.Contact; import com.badlogic.gdx.physics.box2d.ContactFilter; import com.badlogic.gdx.physics.box2d.ContactListener; import com.badlogic.gdx.physics.box2d.DestructionListener; import com.badlogic.gdx.physics.box2d.Joint; import com.badlogic.gdx.physics.box2d.JointDef; import com.badlogic.gdx.physics.box2d.QueryCallback; import com.badlogic.gdx.physics.box2d.RayCastCallback; import com.badlogic.gdx.physics.box2d.World; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 15:18:19 - 15.07.2010 */ public class PhysicsWorld implements IUpdateHandler { // =========================================================== // Constants // =========================================================== static { System.loadLibrary( "andenginephysicsbox2dextension" ); } public static final int VELOCITY_ITERATIONS_DEFAULT = 8; public static final int POSITION_ITERATIONS_DEFAULT = 8; // =========================================================== // Fields // =========================================================== protected final PhysicsConnectorManager mPhysicsConnectorManager = new PhysicsConnectorManager(); protected final RunnableHandler mRunnableHandler = new RunnableHandler(); protected final World mWorld; protected int mVelocityIterations = VELOCITY_ITERATIONS_DEFAULT; protected int mPositionIterations = POSITION_ITERATIONS_DEFAULT; // =========================================================== // Constructors // =========================================================== public PhysicsWorld(final Vector2 pGravity, final boolean pAllowSleep) { this(pGravity, pAllowSleep, VELOCITY_ITERATIONS_DEFAULT, POSITION_ITERATIONS_DEFAULT); } public PhysicsWorld(final Vector2 pGravity, final boolean pAllowSleep, final int pVelocityIterations, final int pPositionIterations) { this.mWorld = new World(pGravity, pAllowSleep); this.mVelocityIterations = pVelocityIterations; this.mPositionIterations = pPositionIterations; } // =========================================================== // Getter & Setter // =========================================================== // public World getWorld() { // return this.mWorld; // } public int getPositionIterations() { return this.mPositionIterations; } public void setPositionIterations(final int pPositionIterations) { this.mPositionIterations = pPositionIterations; } public int getVelocityIterations() { return this.mVelocityIterations; } public void setVelocityIterations(final int pVelocityIterations) { this.mVelocityIterations = pVelocityIterations; } public PhysicsConnectorManager getPhysicsConnectorManager() { return this.mPhysicsConnectorManager; } public void clearPhysicsConnectors() { this.mPhysicsConnectorManager.clear(); } public void registerPhysicsConnector(final PhysicsConnector pPhysicsConnector) { this.mPhysicsConnectorManager.add(pPhysicsConnector); } public void unregisterPhysicsConnector(final PhysicsConnector pPhysicsConnector) { this.mPhysicsConnectorManager.remove(pPhysicsConnector); } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public void onUpdate(final float pSecondsElapsed) { this.mRunnableHandler.onUpdate(pSecondsElapsed); this.mWorld.step(pSecondsElapsed, this.mVelocityIterations, this.mPositionIterations); this.mPhysicsConnectorManager.onUpdate(pSecondsElapsed); } @Override public void reset() { // TODO Reset all native physics objects !?!??! this.mPhysicsConnectorManager.reset(); this.mRunnableHandler.reset(); } // =========================================================== // Methods // =========================================================== public void postRunnable(final Runnable pRunnable) { this.mRunnableHandler.postRunnable(pRunnable); } public void clearForces() { this.mWorld.clearForces(); } public Body createBody(final BodyDef pDef) { return this.mWorld.createBody(pDef); } public Joint createJoint(final JointDef pDef) { return this.mWorld.createJoint(pDef); } public void destroyBody(final Body pBody) { this.mWorld.destroyBody(pBody); } public void destroyJoint(final Joint pJoint) { this.mWorld.destroyJoint(pJoint); } public void dispose() { this.mWorld.dispose(); } public boolean getAutoClearForces() { return this.mWorld.getAutoClearForces(); } public Iterator<Body> getBodies() { return this.mWorld.getBodies(); } public int getBodyCount() { return this.mWorld.getBodyCount(); } public int getContactCount() { return this.mWorld.getContactCount(); } public List<Contact> getContactList() { return this.mWorld.getContactList(); } public Vector2 getGravity() { return this.mWorld.getGravity(); } public Iterator<Joint> getJoints() { return this.mWorld.getJoints(); } public int getJointCount() { return this.mWorld.getJointCount(); } public int getProxyCount() { return this.mWorld.getProxyCount(); } public boolean isLocked() { return this.mWorld.isLocked(); } public void QueryAABB(final QueryCallback pCallback, final float pLowerX, final float pLowerY, final float pUpperX, final float pUpperY) { this.mWorld.QueryAABB(pCallback, pLowerX, pLowerY, pUpperX, pUpperY); } public void setAutoClearForces(final boolean pFlag) { this.mWorld.setAutoClearForces(pFlag); } public void setContactFilter(final ContactFilter pFilter) { this.mWorld.setContactFilter(pFilter); } public void setContactListener(final ContactListener pListener) { this.mWorld.setContactListener(pListener); } public void setContinuousPhysics(final boolean pFlag) { this.mWorld.setContinuousPhysics(pFlag); } public void setDestructionListener(final DestructionListener pListener) { this.mWorld.setDestructionListener(pListener); } public void setGravity(final Vector2 pGravity) { this.mWorld.setGravity(pGravity); } public void setWarmStarting(final boolean pFlag) { this.mWorld.setWarmStarting(pFlag); } public void rayCast(final RayCastCallback pRayCastCallback, final Vector2 pPoint1, final Vector2 pPoint2) { this.mWorld.rayCast(pRayCastCallback, pPoint1, pPoint2); } // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== }