blob: fb3d6121d93730d41c606f20aeadbffd9b3fe61d [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;
import com.replica.replicaisland.CollisionParameters.HitType;
/**
* CollisionVolume describes a volume (rectangle, sphere, etc) used for dynamic collision detection.
* Volumes can be tested for intersection against other volumes, and can be grown to contain a set
* of other volumes. The volume itself is stored in object-relative space (in terms of offsets from
* some origin); when used with game objects the position of the parent object must be passed to
* a parameter of the intersection test. This means that a single instance of a CollisionVolume and
* its derivatives is safe to share amongst many game object instances.
*/
public abstract class CollisionVolume extends AllocationGuard {
// TODO: does this really belong here?
// When used as an attack volume, mHitType specifies the type of hit that the volume deals.
// When used as a vulnerability volume, it specifies which type the volume is vulernable to
// (invalid = all types).
public int mHitType;
public CollisionVolume() {
super();
mHitType = HitType.INVALID;
}
public CollisionVolume(int type) {
super();
mHitType = type;
}
public void setHitType(int type) {
mHitType = type;
}
public int getHitType() {
return mHitType;
}
public abstract boolean intersects(Vector2 position, FlipInfo flip, CollisionVolume other,
Vector2 otherPosition, FlipInfo otherFlip);
public float getMinXPosition(FlipInfo flip) {
float value = 0;
if (flip != null && flip.flipX) {
final float maxX = getMaxX();
value = flip.parentWidth - maxX;
} else {
value = getMinX();
}
return value;
}
public float getMaxXPosition(FlipInfo flip) {
float value = 0;
if (flip != null && flip.flipX) {
final float minX = getMinX();
value = flip.parentWidth - minX;
} else {
value = getMaxX();
}
return value;
}
public float getMinYPosition(FlipInfo flip) {
float value = 0;
if (flip != null && flip.flipY) {
final float maxY = getMaxY();
value = flip.parentHeight - maxY;
} else {
value = getMinY();
}
return value;
}
public float getMaxYPosition(FlipInfo flip) {
float value = 0;
if (flip != null && flip.flipY) {
final float minY = getMinY();
value = flip.parentHeight - minY;
} else {
value = getMaxY();
}
return value;
}
protected abstract float getMinX();
protected abstract float getMaxX();
protected abstract float getMinY();
protected abstract float getMaxY();
public static class FlipInfo {
public boolean flipX;
public boolean flipY;
public float parentWidth;
public float parentHeight;
}
}