package org.andengine.extension.physics.box2d; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.World; /** * A subclass of {@link PhysicsWorld} that tries to achieve a specific amount of steps per second. * When the time since the last step is bigger long the steplength, additional steps are executed. * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 12:39:42 - 25.07.2010 */ public class FixedStepPhysicsWorld extends PhysicsWorld { // =========================================================== // Constants // =========================================================== public static final int STEPSPERSECOND_DEFAULT = 60; // =========================================================== // Fields // =========================================================== private final float mTimeStep; private final int mMaximumStepsPerUpdate; private float mSecondsElapsedAccumulator; // =========================================================== // Constructors // =========================================================== public FixedStepPhysicsWorld(final int pStepsPerSecond, final Vector2 pGravity, final boolean pAllowSleep) { this(pStepsPerSecond, Integer.MAX_VALUE, pGravity, pAllowSleep); } public FixedStepPhysicsWorld(final int pStepsPerSecond, final int pMaximumStepsPerUpdate, final Vector2 pGravity, final boolean pAllowSleep) { super(pGravity, pAllowSleep); this.mTimeStep = 1.0f / pStepsPerSecond; this.mMaximumStepsPerUpdate = pMaximumStepsPerUpdate; } public FixedStepPhysicsWorld(final int pStepsPerSecond, final Vector2 pGravity, final boolean pAllowSleep, final int pVelocityIterations, final int pPositionIterations) { this(pStepsPerSecond, Integer.MAX_VALUE, pGravity, pAllowSleep, pVelocityIterations, pPositionIterations); } public FixedStepPhysicsWorld(final int pStepsPerSecond, final int pMaximumStepsPerUpdate, final Vector2 pGravity, final boolean pAllowSleep, final int pVelocityIterations, final int pPositionIterations) { super(pGravity, pAllowSleep, pVelocityIterations, pPositionIterations); this.mTimeStep = 1.0f / pStepsPerSecond; this.mMaximumStepsPerUpdate = pMaximumStepsPerUpdate; } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public void onUpdate(final float pSecondsElapsed) { this.mRunnableHandler.onUpdate(pSecondsElapsed); this.mSecondsElapsedAccumulator += pSecondsElapsed; final int velocityIterations = this.mVelocityIterations; final int positionIterations = this.mPositionIterations; final World world = this.mWorld; final float stepLength = this.mTimeStep; int stepsAllowed = this.mMaximumStepsPerUpdate; while(this.mSecondsElapsedAccumulator >= stepLength && stepsAllowed > 0) { world.step(stepLength, velocityIterations, positionIterations); this.mSecondsElapsedAccumulator -= stepLength; stepsAllowed--; } this.mPhysicsConnectorManager.onUpdate(pSecondsElapsed); } // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== }