/*
* Copyright 2011 Rod Hyde (rod@badlydrawngames.com)
*
* 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.todoroo.zxzx.general;
import com.badlogic.gdx.math.Rectangle;
/** All game objects are ultimately based on <code>GameObject</code>. Different behaviours are specified by overriding
* {@link GameObject#update}.
*
* @author Rod */
public class GameObject {
/** The default state for any new game object. */
public static final int INACTIVE = -1;
/** This game object's x coordinate in world space. */
public float x;
/** This game object's y coordinate in world space. */
public float y;
/** This game object's width in world units. */
public float width;
/** This game object's height in world units. */
public float height;
/** This game object's collision geometry (if it has any) in local coordinates. */
public CollisionGeometry geometry;
/** This game object's current state. */
public int state;
/** How long this game object has been in its current state (in seconds). */
public float stateTime;
/** Will be true if this game object is in collision. */
public boolean inCollision;
// Holds this game object's bounding rectangle in world space.
private final Rectangle bounds;
public GameObject () {
stateTime = 0.0f;
inCollision = false;
bounds = new Rectangle();
}
/** Assigns collision geometry to this <code>GameObject</code>.
* @param geometry the new collision geometry. */
public void setGeometry (CollisionGeometry geometry) {
this.geometry = geometry;
}
/** Returns this <code>GameObject</code>'s bounding rectangle.
* @return the bounding rectangle. */
public Rectangle bounds () {
bounds.x = x;
bounds.y = y;
bounds.width = width;
bounds.height = height;
return bounds;
}
/** Switches this game object into a new state and resets {@link stateTime}.
* @param state the new state. */
public void setState (int state) {
if(this.state == state)
return;
this.state = state;
stateTime = 0.0f;
}
/** Returns true if this game object's bounds intersect with the given rectangle.
*
* @param r the rectangle to intersect.
* @return true if the bounds intersect. */
public boolean boundsIntersect (Rectangle r) {
return Colliders.intersects(bounds(), r);
}
/** Returns true if this game object's bounds intersect with the given game object.
*
* @param go the other game object.
* @return true if the bounds intersect. */
public boolean boundsIntersect (GameObject go) {
return Colliders.intersects(bounds(), go.bounds());
}
/** Returns true if this game object's collision geometry intersects with the given rectangle.
*
* @param r the rectangle to intersect.
* @return true if the geometry intersects with the rectangle. */
public boolean geometryIntersects (Rectangle r) {
return geometry.intersects(r, x, y);
}
/** Returns true if this game object's collision geometry intersects with another game object's collision geometry.
*
* @param go the other game object.
* @return true if the geometries intersect. */
public boolean geometryIntersects (GameObject go) {
return geometry.intersects(x, y, go.geometry, go.x, go.y);
}
/** Returns true if this game object is in collision with a rectangle. It first does a simple box test against this game
* object's bounds, then, if that's true, tests its collision geometry against the rectangle.
*
* @param r the rectangle to intersect.
* @return true if this game object intersects the rectangle. */
public boolean intersects (Rectangle r) {
return boundsIntersect(r) && (geometry == null || geometryIntersects(r));
}
/** Returns true if this game object is in collision with another game object. It first does a bounds test, then, if that's
* true, tests its collision geometry against the other game object's collision geometry. */
public boolean intersects (GameObject go) {
if (!boundsIntersect(go)) {
return false;
}
if (geometry == null) {
return go.geometry == null || go.geometryIntersects(bounds());
} else if (go.geometry == null) {
return geometryIntersects(go.bounds());
}
return geometryIntersects(go);
}
/** Updates this game object. Typically you would override this to create interesting behaviour.
*
* @param delta time in seconds since the last update. */
public void update (float delta) {
}
}