| /* |
| * 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; |
| |
| import com.replica.replicaisland.CollisionParameters.HitType; |
| |
| /** |
| * GameObject defines any object that resides in the game world (character, background, special |
| * effect, enemy, etc). It is a collection of GameComponents which implement its behavior; |
| * GameObjects themselves have no intrinsic behavior. GameObjects are also "bags of data" that |
| * components can use to share state (direct component-to-component communication is discouraged). |
| */ |
| public class GameObject extends PhasedObjectManager { |
| private final static float COLLISION_SURFACE_DECAY_TIME = 0.3f; |
| // These fields are managed by components. |
| private Vector2 mPosition; |
| private Vector2 mVelocity; |
| private Vector2 mTargetVelocity; |
| private Vector2 mAcceleration; |
| private Vector2 mImpulse; |
| |
| private Vector2 mBackgroundCollisionNormal; |
| |
| private float mLastTouchedFloorTime; |
| private float mLastTouchedCeilingTime; |
| private float mLastTouchedLeftWallTime; |
| private float mLastTouchedRightWallTime; |
| |
| public boolean positionLocked; |
| |
| public float activationRadius; |
| public boolean destroyOnDeactivation; |
| |
| public int life; |
| |
| public int lastReceivedHitType; |
| |
| public Vector2 facingDirection; |
| public float width; |
| public float height; |
| |
| private static final int DEFAULT_LIFE = 1; |
| |
| public enum ActionType { |
| INVALID, |
| IDLE, |
| MOVE, |
| ATTACK, |
| HIT_REACT, |
| DEATH, |
| HIDE, |
| FROZEN |
| } |
| |
| private ActionType mCurrentAction; |
| |
| public enum Team { |
| NONE, |
| PLAYER, |
| ENEMY |
| } |
| |
| public Team team; |
| |
| public GameObject() { |
| super(); |
| |
| mPosition = new Vector2(); |
| mVelocity = new Vector2(); |
| mTargetVelocity = new Vector2(); |
| mAcceleration = new Vector2(); |
| mImpulse = new Vector2(); |
| mBackgroundCollisionNormal = new Vector2(); |
| |
| facingDirection = new Vector2(1, 0); |
| |
| reset(); |
| } |
| |
| @Override |
| public void reset() { |
| removeAll(); |
| commitUpdates(); |
| |
| mPosition.zero(); |
| mVelocity.zero(); |
| mTargetVelocity.zero(); |
| mAcceleration.zero(); |
| mImpulse.zero(); |
| mBackgroundCollisionNormal.zero(); |
| facingDirection.set(1.0f, 1.0f); |
| |
| mCurrentAction = ActionType.INVALID; |
| positionLocked = false; |
| activationRadius = 0; |
| destroyOnDeactivation = false; |
| life = DEFAULT_LIFE; |
| team = Team.NONE; |
| width = 0.0f; |
| height = 0.0f; |
| |
| lastReceivedHitType = HitType.INVALID; |
| } |
| |
| // Utility functions |
| public final boolean touchingGround() { |
| final TimeSystem time = sSystemRegistry.timeSystem; |
| final float gameTime = time.getGameTime(); |
| final boolean touching = gameTime > 0.1f && |
| Utils.close(mLastTouchedFloorTime, time.getGameTime(), COLLISION_SURFACE_DECAY_TIME); |
| return touching; |
| } |
| |
| public final boolean touchingCeiling() { |
| final TimeSystem time = sSystemRegistry.timeSystem; |
| final float gameTime = time.getGameTime(); |
| final boolean touching = gameTime > 0.1f && |
| Utils.close(mLastTouchedCeilingTime, time.getGameTime(), COLLISION_SURFACE_DECAY_TIME); |
| return touching; |
| } |
| |
| public final boolean touchingLeftWall() { |
| final TimeSystem time = sSystemRegistry.timeSystem; |
| final float gameTime = time.getGameTime(); |
| final boolean touching = gameTime > 0.1f && |
| Utils.close(mLastTouchedLeftWallTime, time.getGameTime(), COLLISION_SURFACE_DECAY_TIME); |
| return touching; |
| } |
| |
| public final boolean touchingRightWall() { |
| final TimeSystem time = sSystemRegistry.timeSystem; |
| final float gameTime = time.getGameTime(); |
| final boolean touching = gameTime > 0.1f && |
| Utils.close(mLastTouchedRightWallTime, time.getGameTime(), COLLISION_SURFACE_DECAY_TIME); |
| return touching; |
| } |
| |
| public final Vector2 getPosition() { |
| return mPosition; |
| } |
| |
| public final void setPosition(Vector2 position) { |
| mPosition.set(position); |
| } |
| |
| public final float getCenteredPositionX() { |
| return mPosition.x + (width / 2.0f); |
| } |
| |
| public final float getCenteredPositionY() { |
| return mPosition.y + (height / 2.0f); |
| } |
| |
| public final Vector2 getVelocity() { |
| return mVelocity; |
| } |
| |
| public final void setVelocity(Vector2 velocity) { |
| mVelocity.set(velocity); |
| } |
| |
| public final Vector2 getTargetVelocity() { |
| return mTargetVelocity; |
| } |
| |
| public final void setTargetVelocity(Vector2 targetVelocity) { |
| mTargetVelocity.set(targetVelocity); |
| } |
| |
| public final Vector2 getAcceleration() { |
| return mAcceleration; |
| } |
| |
| public final void setAcceleration(Vector2 acceleration) { |
| mAcceleration.set(acceleration); |
| } |
| |
| public final Vector2 getImpulse() { |
| return mImpulse; |
| } |
| |
| public final void setImpulse(Vector2 impulse) { |
| mImpulse.set(impulse); |
| } |
| |
| public final Vector2 getBackgroundCollisionNormal() { |
| return mBackgroundCollisionNormal; |
| } |
| |
| public final void setBackgroundCollisionNormal(Vector2 normal) { |
| mBackgroundCollisionNormal.set(normal); |
| } |
| |
| public final float getLastTouchedFloorTime() { |
| return mLastTouchedFloorTime; |
| } |
| |
| public final void setLastTouchedFloorTime(float lastTouchedFloorTime) { |
| mLastTouchedFloorTime = lastTouchedFloorTime; |
| } |
| |
| public final float getLastTouchedCeilingTime() { |
| return mLastTouchedCeilingTime; |
| } |
| |
| public final void setLastTouchedCeilingTime(float lastTouchedCeilingTime) { |
| mLastTouchedCeilingTime = lastTouchedCeilingTime; |
| } |
| |
| public final float getLastTouchedLeftWallTime() { |
| return mLastTouchedLeftWallTime; |
| } |
| |
| public final void setLastTouchedLeftWallTime(float lastTouchedLeftWallTime) { |
| mLastTouchedLeftWallTime = lastTouchedLeftWallTime; |
| } |
| |
| public final float getLastTouchedRightWallTime() { |
| return mLastTouchedRightWallTime; |
| } |
| |
| public final void setLastTouchedRightWallTime(float lastTouchedRightWallTime) { |
| mLastTouchedRightWallTime = lastTouchedRightWallTime; |
| } |
| |
| public final ActionType getCurrentAction() { |
| return mCurrentAction; |
| } |
| |
| public final void setCurrentAction(ActionType type) { |
| mCurrentAction = type; |
| } |
| } |