package org.andengine.entity.scene.menu; import java.util.ArrayList; import org.andengine.engine.camera.Camera; import org.andengine.entity.scene.CameraScene; import org.andengine.entity.scene.IOnAreaTouchListener; import org.andengine.entity.scene.IOnSceneTouchListener; import org.andengine.entity.scene.ITouchArea; import org.andengine.entity.scene.Scene; import org.andengine.entity.scene.menu.animator.IMenuSceneAnimator; import org.andengine.entity.scene.menu.animator.InstantMenuSceneAnimator; import org.andengine.entity.scene.menu.item.IMenuItem; import org.andengine.input.touch.TouchEvent; import android.view.MotionEvent; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:06:51 - 01.04.2010 */ public class MenuScene extends CameraScene implements IOnAreaTouchListener, IOnSceneTouchListener { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== protected final ArrayList<IMenuItem> mMenuItems = new ArrayList<IMenuItem>(); private IOnMenuItemClickListener mOnMenuItemClickListener; private IMenuSceneAnimator mMenuSceneAnimator; private IMenuItem mSelectedMenuItem; // =========================================================== // Constructors // =========================================================== public MenuScene(final Camera pCamera) { this(pCamera, new InstantMenuSceneAnimator()); } public MenuScene(final Camera pCamera, final IMenuSceneAnimator pMenuSceneAnimator) { this(pCamera, pMenuSceneAnimator, null); } public MenuScene(final Camera pCamera, final IOnMenuItemClickListener pOnMenuItemClickListener) { this(pCamera, new InstantMenuSceneAnimator(), pOnMenuItemClickListener); } public MenuScene(final Camera pCamera, final IMenuSceneAnimator pMenuSceneAnimator, final IOnMenuItemClickListener pOnMenuItemClickListener) { super(pCamera); this.mMenuSceneAnimator = pMenuSceneAnimator; this.mOnMenuItemClickListener = pOnMenuItemClickListener; this.setOnSceneTouchListener(this); this.setOnAreaTouchListener(this); } // =========================================================== // Getter & Setter // =========================================================== public IOnMenuItemClickListener getOnMenuItemClickListener() { return this.mOnMenuItemClickListener; } public void setOnMenuItemClickListener(final IOnMenuItemClickListener pOnMenuItemClickListener) { this.mOnMenuItemClickListener = pOnMenuItemClickListener; } public ArrayList<IMenuItem> getMenuItems() { return this.mMenuItems; } public IMenuItem getMenuItem(final int pIndex) { return this.mMenuItems.get(pIndex); } public int getMenuItemCount() { return this.mMenuItems.size(); } public void addMenuItem(final IMenuItem pMenuItem) { this.mMenuItems.add(pMenuItem); this.attachChild(pMenuItem); this.registerTouchArea(pMenuItem); } public void clearMenuItems() { for (int i = this.mMenuItems.size() - 1; i >= 0; i--) { final IMenuItem menuItem = this.mMenuItems.remove(i); this.detachChild(menuItem); this.unregisterTouchArea(menuItem); } } @Override public MenuScene getChildScene() { return (MenuScene)super.getChildScene(); } @Override public void setChildScene(final Scene pChildScene, final boolean pModalDraw, final boolean pModalUpdate, final boolean pModalTouch) throws IllegalArgumentException { if (pChildScene instanceof MenuScene) { super.setChildScene(pChildScene, pModalDraw, pModalUpdate, pModalTouch); } else { throw new IllegalArgumentException("A " + MenuScene.class.getSimpleName() + " accepts only " + MenuScene.class.getSimpleName() + " as a ChildScene."); } } @Override public void clearChildScene() { if (this.getChildScene() != null) { this.getChildScene().reset(); super.clearChildScene(); } } public IMenuSceneAnimator getMenuSceneAnimator() { return this.mMenuSceneAnimator; } public void setMenuSceneAnimator(final IMenuSceneAnimator pMenuSceneAnimator) { this.mMenuSceneAnimator = pMenuSceneAnimator; } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { final IMenuItem menuItem = ((IMenuItem)pTouchArea); switch (pSceneTouchEvent.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: if ((this.mSelectedMenuItem != null) && (this.mSelectedMenuItem != menuItem)) { this.mSelectedMenuItem.onUnselected(); } this.mSelectedMenuItem = menuItem; this.mSelectedMenuItem.onSelected(); break; case MotionEvent.ACTION_UP: if (this.mOnMenuItemClickListener != null) { final boolean handled = this.mOnMenuItemClickListener.onMenuItemClicked(this, menuItem, pTouchAreaLocalX, pTouchAreaLocalY); menuItem.onUnselected(); this.mSelectedMenuItem = null; return handled; } break; case MotionEvent.ACTION_CANCEL: menuItem.onUnselected(); this.mSelectedMenuItem = null; break; } return true; } @Override public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { if (this.mSelectedMenuItem != null) { this.mSelectedMenuItem.onUnselected(); this.mSelectedMenuItem = null; } return false; } @Override public void back() { this.back(true, true); } public void back(final boolean pResetAnimations) { this.back(pResetAnimations, true); } public void back(final boolean pResetAnimations, final boolean pResetParentMenuSceneAnimations) { super.back(); if (pResetAnimations) { this.resetAnimations(); } if (pResetParentMenuSceneAnimations) { if ((this.mParentScene != null) && (this.mParentScene instanceof MenuScene)) { ((MenuScene)this.mParentScene).resetAnimations(); } } } // =========================================================== // Methods // =========================================================== public void closeMenuScene() { this.back(); } public void buildAnimations() { this.mMenuSceneAnimator.buildMenuSceneAnimations(this); } public void resetAnimations() { this.mMenuSceneAnimator.resetMenuSceneAnimations(this); } // =========================================================== // Inner and Anonymous Classes // =========================================================== public static interface IOnMenuItemClickListener { // =========================================================== // Constants // =========================================================== // =========================================================== // Methods // =========================================================== public boolean onMenuItemClicked(final MenuScene pMenuScene, final IMenuItem pMenuItem, final float pMenuItemLocalX, final float pMenuItemLocalY); } }