• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.replica.replicaisland;
18 
19 /**
20  * A component that allows a game object to act like a solid object by submitting surfaces to the
21  * background collision system every frame.
22  */
23 public class SolidSurfaceComponent extends GameComponent {
24     private FixedSizeArray<Vector2> mStartPoints;
25     private FixedSizeArray<Vector2> mEndPoints;
26     private FixedSizeArray<Vector2> mNormals;
27     private Vector2 mStart;
28     private Vector2 mEnd;
29     private Vector2 mNormal;
30 
SolidSurfaceComponent(int maxSurfaceCount)31     public SolidSurfaceComponent(int maxSurfaceCount) {
32         super();
33 
34         inititalize(maxSurfaceCount);
35 
36         mStart = new Vector2();
37         mEnd = new Vector2();
38         mNormal = new Vector2();
39 
40         setPhase(ComponentPhases.POST_COLLISION.ordinal());
41         reset();
42     }
43 
44     @Override
reset()45     public void reset() {
46         mStartPoints.clear();
47         mEndPoints.clear();
48         mNormals.clear();
49     }
50 
SolidSurfaceComponent()51     public SolidSurfaceComponent() {
52         super();
53 
54         mStart = new Vector2();
55         mEnd = new Vector2();
56         mNormal = new Vector2();
57 
58         setPhase(ComponentPhases.POST_COLLISION.ordinal());
59     }
60 
inititalize(int maxSurfaceCount)61     public void inititalize(int maxSurfaceCount) {
62         if (mStartPoints == null
63                 || (mStartPoints != null && mStartPoints.getCount() != maxSurfaceCount)) {
64             mStartPoints = new FixedSizeArray<Vector2>(maxSurfaceCount);
65             mEndPoints = new FixedSizeArray<Vector2>(maxSurfaceCount);
66             mNormals = new FixedSizeArray<Vector2>(maxSurfaceCount);
67         }
68 
69         mStartPoints.clear();
70         mEndPoints.clear();
71         mNormals.clear();
72     }
73 
74     // Note that this function keeps direct references to the arguments it is passed.
addSurface(Vector2 startPoint, Vector2 endPoint, Vector2 normal)75     public void addSurface(Vector2 startPoint, Vector2 endPoint, Vector2 normal) {
76         mStartPoints.add(startPoint);
77         mEndPoints.add(endPoint);
78         mNormals.add(normal);
79     }
80 
81     @Override
update(float timeDelta, BaseObject parent)82     public void update(float timeDelta, BaseObject parent) {
83         CollisionSystem collision = sSystemRegistry.collisionSystem;
84 
85         final FixedSizeArray<Vector2> startPoints = mStartPoints;
86         final FixedSizeArray<Vector2> endPoints = mEndPoints;
87         final FixedSizeArray<Vector2> normals = mNormals;
88 
89         final int surfaceCount = startPoints.getCount();
90         if (collision != null && surfaceCount > 0) {
91             GameObject parentObject = (GameObject)parent;
92             final Vector2 position = parentObject.getPosition();
93             Vector2 start = mStart;
94             Vector2 end = mEnd;
95             Vector2 normal = mNormal;
96 
97             for (int x = 0; x < surfaceCount; x++) {
98                start.set(startPoints.get(x));
99                if (parentObject.facingDirection.x < 0.0f) {
100                    start.flipHorizontal(parentObject.width);
101                }
102 
103                if (parentObject.facingDirection.y < 0.0f) {
104                    start.flipVertical(parentObject.height);
105                }
106                start.add(position);
107 
108                end.set(endPoints.get(x));
109                if (parentObject.facingDirection.x < 0.0f) {
110                    end.flipHorizontal(parentObject.width);
111                }
112 
113                if (parentObject.facingDirection.y < 0.0f) {
114                    end.flipVertical(parentObject.height);
115                }
116                end.add(position);
117 
118                normal.set(normals.get(x));
119                if (parentObject.facingDirection.x < 0.0f) {
120                    normal.flipHorizontal(0);
121                }
122 
123                if (parentObject.facingDirection.y < 0.0f) {
124                    normal.flipVertical(0);
125                }
126 
127                collision.addTemporarySurface(start, end, normal, parentObject);
128             }
129 
130 
131         }
132     }
133 
134 }
135