xref: /aosp_15_r20/external/replicaisland/src/com/replica/replicaisland/DynamicCollisionComponent.java (revision 5eae8ebb3c5756e41e77a1f7201fcf94b0eade1f)
1*5eae8ebbSCole Faust /*
2*5eae8ebbSCole Faust  * Copyright (C) 2010 The Android Open Source Project
3*5eae8ebbSCole Faust  *
4*5eae8ebbSCole Faust  * Licensed under the Apache License, Version 2.0 (the "License");
5*5eae8ebbSCole Faust  * you may not use this file except in compliance with the License.
6*5eae8ebbSCole Faust  * You may obtain a copy of the License at
7*5eae8ebbSCole Faust  *
8*5eae8ebbSCole Faust  *      http://www.apache.org/licenses/LICENSE-2.0
9*5eae8ebbSCole Faust  *
10*5eae8ebbSCole Faust  * Unless required by applicable law or agreed to in writing, software
11*5eae8ebbSCole Faust  * distributed under the License is distributed on an "AS IS" BASIS,
12*5eae8ebbSCole Faust  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5eae8ebbSCole Faust  * See the License for the specific language governing permissions and
14*5eae8ebbSCole Faust  * limitations under the License.
15*5eae8ebbSCole Faust  */
16*5eae8ebbSCole Faust 
17*5eae8ebbSCole Faust 
18*5eae8ebbSCole Faust package com.replica.replicaisland;
19*5eae8ebbSCole Faust 
20*5eae8ebbSCole Faust /**
21*5eae8ebbSCole Faust  * A component to include dynamic collision volumes (such as those produced every frame from
22*5eae8ebbSCole Faust  * animating sprites) in the dynamic collision world.  Given a set of "attack" volumes and
23*5eae8ebbSCole Faust  * "vulnerability" volumes (organized such that only attack vs vulnerability intersections result
24*5eae8ebbSCole Faust  * in valid "hits"), this component creates a bounding volume that encompasses the set and submits
25*5eae8ebbSCole Faust  * it to the dynamic collision system.  Including this component in a game object will allow it to
26*5eae8ebbSCole Faust  * send and receive hits to other game objects.
27*5eae8ebbSCole Faust  */
28*5eae8ebbSCole Faust public class DynamicCollisionComponent extends GameComponent {
29*5eae8ebbSCole Faust     private FixedSizeArray<CollisionVolume> mAttackVolumes;
30*5eae8ebbSCole Faust     private FixedSizeArray<CollisionVolume> mVulnerabilityVolumes;
31*5eae8ebbSCole Faust     private SphereCollisionVolume mBoundingVolume;
32*5eae8ebbSCole Faust     private HitReactionComponent mHitReactionComponent;
33*5eae8ebbSCole Faust 
DynamicCollisionComponent()34*5eae8ebbSCole Faust     public DynamicCollisionComponent() {
35*5eae8ebbSCole Faust         super();
36*5eae8ebbSCole Faust         mBoundingVolume = new SphereCollisionVolume(0.0f, 0.0f, 0.0f);
37*5eae8ebbSCole Faust         setPhase(ComponentPhases.FRAME_END.ordinal());
38*5eae8ebbSCole Faust         reset();
39*5eae8ebbSCole Faust     }
40*5eae8ebbSCole Faust 
41*5eae8ebbSCole Faust     @Override
reset()42*5eae8ebbSCole Faust     public void reset() {
43*5eae8ebbSCole Faust        mAttackVolumes = null;
44*5eae8ebbSCole Faust        mVulnerabilityVolumes = null;
45*5eae8ebbSCole Faust        mBoundingVolume.setCenter(Vector2.ZERO);
46*5eae8ebbSCole Faust        mBoundingVolume.setRadius(0.0f);
47*5eae8ebbSCole Faust        mHitReactionComponent = null;
48*5eae8ebbSCole Faust     }
49*5eae8ebbSCole Faust 
50*5eae8ebbSCole Faust     @Override
update(float timeDelta, BaseObject parent)51*5eae8ebbSCole Faust     public void update(float timeDelta, BaseObject parent) {
52*5eae8ebbSCole Faust         GameObjectCollisionSystem collision = sSystemRegistry.gameObjectCollisionSystem;
53*5eae8ebbSCole Faust         if (collision != null && mBoundingVolume.getRadius() > 0.0f) {
54*5eae8ebbSCole Faust             collision.registerForCollisions((GameObject)parent, mHitReactionComponent, mBoundingVolume,
55*5eae8ebbSCole Faust                     mAttackVolumes, mVulnerabilityVolumes);
56*5eae8ebbSCole Faust         }
57*5eae8ebbSCole Faust     }
58*5eae8ebbSCole Faust 
setHitReactionComponent(HitReactionComponent component)59*5eae8ebbSCole Faust     public void setHitReactionComponent(HitReactionComponent component) {
60*5eae8ebbSCole Faust         mHitReactionComponent = component;
61*5eae8ebbSCole Faust     }
62*5eae8ebbSCole Faust 
setCollisionVolumes(FixedSizeArray<CollisionVolume> attackVolumes, FixedSizeArray<CollisionVolume> vulnerableVolumes)63*5eae8ebbSCole Faust     public void setCollisionVolumes(FixedSizeArray<CollisionVolume> attackVolumes,
64*5eae8ebbSCole Faust             FixedSizeArray<CollisionVolume> vulnerableVolumes) {
65*5eae8ebbSCole Faust         if (mVulnerabilityVolumes != vulnerableVolumes || mAttackVolumes != attackVolumes) {
66*5eae8ebbSCole Faust             mAttackVolumes = attackVolumes;
67*5eae8ebbSCole Faust             mVulnerabilityVolumes = vulnerableVolumes;
68*5eae8ebbSCole Faust             mBoundingVolume.reset();
69*5eae8ebbSCole Faust             if (mAttackVolumes != null) {
70*5eae8ebbSCole Faust                final int count = mAttackVolumes.getCount();
71*5eae8ebbSCole Faust                for (int x = 0; x < count; x++) {
72*5eae8ebbSCole Faust                    mBoundingVolume.growBy(mAttackVolumes.get(x));
73*5eae8ebbSCole Faust                }
74*5eae8ebbSCole Faust             }
75*5eae8ebbSCole Faust 
76*5eae8ebbSCole Faust             if (mVulnerabilityVolumes != null) {
77*5eae8ebbSCole Faust                 final int count = mVulnerabilityVolumes.getCount();
78*5eae8ebbSCole Faust                 for (int x = 0; x < count; x++) {
79*5eae8ebbSCole Faust                     mBoundingVolume.growBy(mVulnerabilityVolumes.get(x));
80*5eae8ebbSCole Faust                 }
81*5eae8ebbSCole Faust              }
82*5eae8ebbSCole Faust         }
83*5eae8ebbSCole Faust     }
84*5eae8ebbSCole Faust }
85