/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.replica.replicaisland; /** * A game component that can swap other components in and out of its parent game object. The * purpose of the ChangeComponentsComponent is to allow game objects to have different "modes" * defined by different combinations of GameComponents. ChangeComponentsComponent manages the * switching in and out of those modes by activating and deactivating specific game components. */ public class ChangeComponentsComponent extends GameComponent { private final static int MAX_COMPONENT_SWAPS = 16; private FixedSizeArray mComponentsToInsert; private FixedSizeArray mComponentsToRemove; private boolean mPingPong; private boolean mActivated; private boolean mCurrentlySwapped; private GameObject.ActionType mSwapOnAction; private GameObject.ActionType mLastAction; public ChangeComponentsComponent() { super(); mComponentsToInsert = new FixedSizeArray(MAX_COMPONENT_SWAPS); mComponentsToRemove = new FixedSizeArray(MAX_COMPONENT_SWAPS); reset(); } @Override public void reset() { GameObjectFactory factory = sSystemRegistry.gameObjectFactory; // GameComponents hanging out in the mComponentsToInsert list are not part of the object // hierarchy, so we need to manually release them. if (factory != null) { FixedSizeArray unrelasedComponents = mComponentsToInsert; if (mActivated) { if (!mPingPong) { // if we've activated and are not set to ping pong, the contents of // mComponentsToInsert have already been inserted into the object and // will be cleaned up with all the other of the object's components. // In that case, mComponentsToRemove contains objects that need manual // clean up. unrelasedComponents = mComponentsToRemove; } } final int inactiveComponentCount = unrelasedComponents.getCount(); for (int x = 0; x < inactiveComponentCount; x++) { GameComponent component = unrelasedComponents.get(x); if (!component.shared) { factory.releaseComponent(component); } } } mComponentsToInsert.clear(); mComponentsToRemove.clear(); mPingPong = false; mActivated = false; mCurrentlySwapped = false; mSwapOnAction = GameObject.ActionType.INVALID; mLastAction = GameObject.ActionType.INVALID; } @Override public void update(float timeDelta, BaseObject parent) { if (mSwapOnAction != GameObject.ActionType.INVALID) { GameObject parentObject = (GameObject)parent; GameObject.ActionType currentAction = parentObject.getCurrentAction(); if (currentAction != mLastAction) { mLastAction = currentAction; if (currentAction == mSwapOnAction) { activate(parentObject); } } } } public void addSwapInComponent(GameComponent component) { mComponentsToInsert.add(component); } public void addSwapOutComponent(GameComponent component) { mComponentsToRemove.add(component); } public void setPingPongBehavior(boolean pingPong) { mPingPong = pingPong; } public void setSwapAction(GameObject.ActionType action) { mSwapOnAction = action; } /** Inserts and removes components added to the swap-in and swap-out list, respectively. * Unless mPingPong is set, this may only be called once. * @param parent The parent object to swap components on. */ public void activate(GameObject parent) { if (!mActivated || mPingPong) { final int removeCount = mComponentsToRemove.getCount(); for (int x = 0; x < removeCount; x++) { parent.remove(mComponentsToRemove.get(x)); } final int addCount = mComponentsToInsert.getCount(); for (int x = 0; x < addCount; x++) { parent.add(mComponentsToInsert.get(x)); } mActivated = true; mCurrentlySwapped = !mCurrentlySwapped; if (mPingPong) { FixedSizeArray swap = mComponentsToInsert; mComponentsToInsert = mComponentsToRemove; mComponentsToRemove = swap; } } } public boolean getCurrentlySwapped() { return mCurrentlySwapped; } }