package org.andengine.entity.scene.menu.animator; import org.andengine.entity.modifier.MoveModifier; import org.andengine.entity.scene.menu.MenuScene; import org.andengine.entity.scene.menu.item.IMenuItem; import org.andengine.util.adt.align.HorizontalAlign; import org.andengine.util.adt.align.VerticalAlign; import org.andengine.util.adt.spatial.Direction; import org.andengine.util.modifier.ease.EaseLinear; import org.andengine.util.modifier.ease.IEaseFunction; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 11:04:35 - 02.04.2010 */ public class SlideMenuSceneAnimator extends MenuSceneAnimator { // =========================================================== // Constants // =========================================================== private static final float DURATION = 1.0f; private static final IEaseFunction EASEFUNCTION_DEFAULT = EaseLinear.getInstance(); private static final Direction DIRECTION_DEFAULT = Direction.RIGHT; // =========================================================== // Fields // =========================================================== private IEaseFunction mEaseFunction; private Direction mDirection; // =========================================================== // Constructors // =========================================================== public SlideMenuSceneAnimator() { this(SlideMenuSceneAnimator.DIRECTION_DEFAULT, SlideMenuSceneAnimator.EASEFUNCTION_DEFAULT); } public SlideMenuSceneAnimator(final IEaseFunction pEaseFunction) { this(SlideMenuSceneAnimator.DIRECTION_DEFAULT, pEaseFunction); } public SlideMenuSceneAnimator(final Direction pDirection) { this(pDirection, SlideMenuSceneAnimator.EASEFUNCTION_DEFAULT); } public SlideMenuSceneAnimator(final Direction pDirection, final IEaseFunction pEaseFunction) { super(); this.mDirection = pDirection; this.mEaseFunction = pEaseFunction; } public SlideMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign) { this(pHorizontalAlign, pVerticalAlign, SlideMenuSceneAnimator.DIRECTION_DEFAULT, SlideMenuSceneAnimator.EASEFUNCTION_DEFAULT); } public SlideMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign, final IEaseFunction pEaseFunction) { this(pHorizontalAlign, pVerticalAlign, SlideMenuSceneAnimator.DIRECTION_DEFAULT, pEaseFunction); } public SlideMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign, final Direction pDirection) { this(pHorizontalAlign, pVerticalAlign, pDirection, SlideMenuSceneAnimator.EASEFUNCTION_DEFAULT); } public SlideMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign, final Direction pDirection, final IEaseFunction pEaseFunction) { super(pHorizontalAlign, pVerticalAlign); this.mDirection = pDirection; this.mEaseFunction = pEaseFunction; } // =========================================================== // Getter & Setter // =========================================================== public IEaseFunction getEaseFunction() { return this.mEaseFunction; } public void setEaseFunction(final IEaseFunction pEaseFunction) { this.mEaseFunction = pEaseFunction; } public Direction getDirection() { return this.mDirection; } public void setDirection(final Direction pDirection) { this.mDirection = pDirection; } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { final float fromX = getFromX(pMenuScene, pMenuItem, pX); final float fromY = getFromY(pMenuScene, pMenuItem, pY); pMenuItem.setPosition(fromX, fromY); final MoveModifier moveModifier = new MoveModifier(SlideMenuSceneAnimator.DURATION, fromX, fromY, pX, pY, this.mEaseFunction); moveModifier.setAutoUnregisterWhenFinished(false); pMenuItem.registerEntityModifier(moveModifier); } @Override protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { final float fromX = getFromX(pMenuScene, pMenuItem, pX); final float fromY = getFromY(pMenuScene, pMenuItem, pY); pMenuItem.setPosition(fromX, fromY); pMenuItem.resetEntityModifiers(); } // =========================================================== // Methods // =========================================================== protected float getFromX(final MenuScene pMenuScene, final IMenuItem pMenuItem, final float pX) { switch (this.mDirection) { case UP: case DOWN: return pX; case DOWN_LEFT: case UP_LEFT: case LEFT: return pMenuScene.getWidth() + (pMenuItem.getWidth() * 0.5f); case DOWN_RIGHT: case UP_RIGHT: case RIGHT: return -(pMenuItem.getWidth() * 0.5f); default: throw new IllegalArgumentException(); } } protected float getFromY(final MenuScene pMenuScene, final IMenuItem pMenuItem, final float pY) { switch (this.mDirection) { case DOWN_LEFT: case DOWN: case DOWN_RIGHT: return pMenuScene.getHeight() + (pMenuItem.getHeight() * 0.5f); case LEFT: case RIGHT: return pY; case UP_LEFT: case UP: case UP_RIGHT: return -(pMenuItem.getHeight() * 0.5f); default: throw new IllegalArgumentException(); } } // =========================================================== // Inner and Anonymous Classes // =========================================================== }