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
17package com.replica.replicaisland;
18
19// Simple collision detection component for objects not requiring complex collision (projectiles, etc)
20public class SimpleCollisionComponent extends GameComponent {
21	private Vector2 mPreviousPosition;
22	private Vector2 mCurrentPosition;
23	private Vector2 mMovementDirection;
24	private Vector2 mHitPoint;
25	private Vector2 mHitNormal;
26
27	public SimpleCollisionComponent() {
28		super();
29		setPhase(ComponentPhases.COLLISION_DETECTION.ordinal());
30		mPreviousPosition = new Vector2();
31		mCurrentPosition = new Vector2();
32		mMovementDirection = new Vector2();
33		mHitPoint = new Vector2();
34		mHitNormal = new Vector2();
35	}
36
37	@Override
38	public void reset() {
39		mPreviousPosition.zero();
40		mCurrentPosition.zero();
41		mMovementDirection.zero();
42		mHitPoint.zero();
43		mHitNormal.zero();
44	}
45
46	@Override
47    public void update(float timeDelta, BaseObject parent) {
48        GameObject parentObject = (GameObject) parent;
49
50        if (mPreviousPosition.length2() > 0.0f) {
51        	mCurrentPosition.set(parentObject.getCenteredPositionX(), parentObject.getCenteredPositionY());
52        	mMovementDirection.set(mCurrentPosition);
53        	mMovementDirection.subtract(mPreviousPosition);
54        	if (mMovementDirection.length2() > 0.0f) {
55        		final CollisionSystem collision = sSystemRegistry.collisionSystem;
56        		if (collision != null) {
57        			final boolean hit = collision.castRay(mPreviousPosition, mCurrentPosition,
58        					mMovementDirection, mHitPoint, mHitNormal, parentObject);
59
60        			if (hit) {
61        				// snap
62        				final float halfWidth = parentObject.width / 2.0f;
63        				final float halfHeight = parentObject.height / 2.0f;
64        				if (!Utils.close(mHitNormal.x, 0.0f)) {
65        					parentObject.getPosition().x = mHitPoint.x - halfWidth;
66        				}
67
68        				if (!Utils.close(mHitNormal.y, 0.0f)) {
69        					parentObject.getPosition().y = mHitPoint.y - halfHeight;
70        				}
71
72        				final TimeSystem timeSystem = sSystemRegistry.timeSystem;
73
74    	                if (timeSystem != null) {
75    	                    float time = timeSystem.getGameTime();
76    	                   if (mHitNormal.x > 0.0f) {
77	                            parentObject.setLastTouchedLeftWallTime(time);
78	                        } else if (mHitNormal.x < 0.0) {
79	                            parentObject.setLastTouchedRightWallTime(time);
80	                        }
81
82	                        if (mHitNormal.y > 0.0f) {
83	                            parentObject.setLastTouchedFloorTime(time);
84	                        } else if (mHitNormal.y < 0.0f) {
85	                            parentObject.setLastTouchedCeilingTime(time);
86	                        }
87    	                }
88
89    	                parentObject.setBackgroundCollisionNormal(mHitNormal);
90
91        			}
92        		}
93        	}
94        }
95
96        mPreviousPosition.set(parentObject.getCenteredPositionX(), parentObject.getCenteredPositionY());
97	}
98}
99