blob: 4087d3e6d7d0b984ad86448416fd4400abc2ded5 [file] [log] [blame]
/*
* 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<GameComponent> mComponentsToInsert;
private FixedSizeArray<GameComponent> mComponentsToRemove;
private boolean mPingPong;
private boolean mActivated;
private boolean mCurrentlySwapped;
private GameObject.ActionType mSwapOnAction;
private GameObject.ActionType mLastAction;
public ChangeComponentsComponent() {
super();
mComponentsToInsert = new FixedSizeArray<GameComponent>(MAX_COMPONENT_SWAPS);
mComponentsToRemove = new FixedSizeArray<GameComponent>(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<GameComponent> 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<GameComponent> swap = mComponentsToInsert;
mComponentsToInsert = mComponentsToRemove;
mComponentsToRemove = swap;
}
}
}
public boolean getCurrentlySwapped() {
return mCurrentlySwapped;
}
}