1cfd74d65d832137e20e193c960802afba73b5d38sm/*
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project
3cfd74d65d832137e20e193c960802afba73b5d38sm *
4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License");
5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License.
6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at
7cfd74d65d832137e20e193c960802afba73b5d38sm *
8cfd74d65d832137e20e193c960802afba73b5d38sm *      http://www.apache.org/licenses/LICENSE-2.0
9cfd74d65d832137e20e193c960802afba73b5d38sm *
10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software
11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS,
12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and
14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License.
15cfd74d65d832137e20e193c960802afba73b5d38sm */
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland;
18cfd74d65d832137e20e193c960802afba73b5d38sm
19cfd74d65d832137e20e193c960802afba73b5d38sm// Simple collision detection component for objects not requiring complex collision (projectiles, etc)
20cfd74d65d832137e20e193c960802afba73b5d38smpublic class SimpleCollisionComponent extends GameComponent {
21cfd74d65d832137e20e193c960802afba73b5d38sm	private Vector2 mPreviousPosition;
22cfd74d65d832137e20e193c960802afba73b5d38sm	private Vector2 mCurrentPosition;
23cfd74d65d832137e20e193c960802afba73b5d38sm	private Vector2 mMovementDirection;
24cfd74d65d832137e20e193c960802afba73b5d38sm	private Vector2 mHitPoint;
25cfd74d65d832137e20e193c960802afba73b5d38sm	private Vector2 mHitNormal;
26cfd74d65d832137e20e193c960802afba73b5d38sm
27cfd74d65d832137e20e193c960802afba73b5d38sm	public SimpleCollisionComponent() {
28cfd74d65d832137e20e193c960802afba73b5d38sm		super();
29cfd74d65d832137e20e193c960802afba73b5d38sm		setPhase(ComponentPhases.COLLISION_DETECTION.ordinal());
30cfd74d65d832137e20e193c960802afba73b5d38sm		mPreviousPosition = new Vector2();
31cfd74d65d832137e20e193c960802afba73b5d38sm		mCurrentPosition = new Vector2();
32cfd74d65d832137e20e193c960802afba73b5d38sm		mMovementDirection = new Vector2();
33cfd74d65d832137e20e193c960802afba73b5d38sm		mHitPoint = new Vector2();
34cfd74d65d832137e20e193c960802afba73b5d38sm		mHitNormal = new Vector2();
35cfd74d65d832137e20e193c960802afba73b5d38sm	}
36cfd74d65d832137e20e193c960802afba73b5d38sm
37cfd74d65d832137e20e193c960802afba73b5d38sm	@Override
38cfd74d65d832137e20e193c960802afba73b5d38sm	public void reset() {
39cfd74d65d832137e20e193c960802afba73b5d38sm		mPreviousPosition.zero();
40cfd74d65d832137e20e193c960802afba73b5d38sm		mCurrentPosition.zero();
41cfd74d65d832137e20e193c960802afba73b5d38sm		mMovementDirection.zero();
42cfd74d65d832137e20e193c960802afba73b5d38sm		mHitPoint.zero();
43cfd74d65d832137e20e193c960802afba73b5d38sm		mHitNormal.zero();
44cfd74d65d832137e20e193c960802afba73b5d38sm	}
45cfd74d65d832137e20e193c960802afba73b5d38sm
46cfd74d65d832137e20e193c960802afba73b5d38sm	@Override
47cfd74d65d832137e20e193c960802afba73b5d38sm    public void update(float timeDelta, BaseObject parent) {
48cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject parentObject = (GameObject) parent;
49cfd74d65d832137e20e193c960802afba73b5d38sm
50cfd74d65d832137e20e193c960802afba73b5d38sm        if (mPreviousPosition.length2() > 0.0f) {
51cfd74d65d832137e20e193c960802afba73b5d38sm        	mCurrentPosition.set(parentObject.getCenteredPositionX(), parentObject.getCenteredPositionY());
52cfd74d65d832137e20e193c960802afba73b5d38sm        	mMovementDirection.set(mCurrentPosition);
53cfd74d65d832137e20e193c960802afba73b5d38sm        	mMovementDirection.subtract(mPreviousPosition);
54cfd74d65d832137e20e193c960802afba73b5d38sm        	if (mMovementDirection.length2() > 0.0f) {
55cfd74d65d832137e20e193c960802afba73b5d38sm        		final CollisionSystem collision = sSystemRegistry.collisionSystem;
56cfd74d65d832137e20e193c960802afba73b5d38sm        		if (collision != null) {
57cfd74d65d832137e20e193c960802afba73b5d38sm        			final boolean hit = collision.castRay(mPreviousPosition, mCurrentPosition,
58cfd74d65d832137e20e193c960802afba73b5d38sm        					mMovementDirection, mHitPoint, mHitNormal, parentObject);
59cfd74d65d832137e20e193c960802afba73b5d38sm
60cfd74d65d832137e20e193c960802afba73b5d38sm        			if (hit) {
61cfd74d65d832137e20e193c960802afba73b5d38sm        				// snap
62cfd74d65d832137e20e193c960802afba73b5d38sm        				final float halfWidth = parentObject.width / 2.0f;
63cfd74d65d832137e20e193c960802afba73b5d38sm        				final float halfHeight = parentObject.height / 2.0f;
64cfd74d65d832137e20e193c960802afba73b5d38sm        				if (!Utils.close(mHitNormal.x, 0.0f)) {
65cfd74d65d832137e20e193c960802afba73b5d38sm        					parentObject.getPosition().x = mHitPoint.x - halfWidth;
66cfd74d65d832137e20e193c960802afba73b5d38sm        				}
67cfd74d65d832137e20e193c960802afba73b5d38sm
68cfd74d65d832137e20e193c960802afba73b5d38sm        				if (!Utils.close(mHitNormal.y, 0.0f)) {
69cfd74d65d832137e20e193c960802afba73b5d38sm        					parentObject.getPosition().y = mHitPoint.y - halfHeight;
70cfd74d65d832137e20e193c960802afba73b5d38sm        				}
71cfd74d65d832137e20e193c960802afba73b5d38sm
72cfd74d65d832137e20e193c960802afba73b5d38sm        				final TimeSystem timeSystem = sSystemRegistry.timeSystem;
73cfd74d65d832137e20e193c960802afba73b5d38sm
74cfd74d65d832137e20e193c960802afba73b5d38sm    	                if (timeSystem != null) {
75cfd74d65d832137e20e193c960802afba73b5d38sm    	                    float time = timeSystem.getGameTime();
76cfd74d65d832137e20e193c960802afba73b5d38sm    	                   if (mHitNormal.x > 0.0f) {
77cfd74d65d832137e20e193c960802afba73b5d38sm	                            parentObject.setLastTouchedLeftWallTime(time);
78cfd74d65d832137e20e193c960802afba73b5d38sm	                        } else if (mHitNormal.x < 0.0) {
79cfd74d65d832137e20e193c960802afba73b5d38sm	                            parentObject.setLastTouchedRightWallTime(time);
80cfd74d65d832137e20e193c960802afba73b5d38sm	                        }
81cfd74d65d832137e20e193c960802afba73b5d38sm
82cfd74d65d832137e20e193c960802afba73b5d38sm	                        if (mHitNormal.y > 0.0f) {
83cfd74d65d832137e20e193c960802afba73b5d38sm	                            parentObject.setLastTouchedFloorTime(time);
84cfd74d65d832137e20e193c960802afba73b5d38sm	                        } else if (mHitNormal.y < 0.0f) {
85cfd74d65d832137e20e193c960802afba73b5d38sm	                            parentObject.setLastTouchedCeilingTime(time);
86cfd74d65d832137e20e193c960802afba73b5d38sm	                        }
87cfd74d65d832137e20e193c960802afba73b5d38sm    	                }
88cfd74d65d832137e20e193c960802afba73b5d38sm
89cfd74d65d832137e20e193c960802afba73b5d38sm    	                parentObject.setBackgroundCollisionNormal(mHitNormal);
90cfd74d65d832137e20e193c960802afba73b5d38sm
91cfd74d65d832137e20e193c960802afba73b5d38sm        			}
92cfd74d65d832137e20e193c960802afba73b5d38sm        		}
93cfd74d65d832137e20e193c960802afba73b5d38sm        	}
94cfd74d65d832137e20e193c960802afba73b5d38sm        }
95cfd74d65d832137e20e193c960802afba73b5d38sm
96cfd74d65d832137e20e193c960802afba73b5d38sm        mPreviousPosition.set(parentObject.getCenteredPositionX(), parentObject.getCenteredPositionY());
97cfd74d65d832137e20e193c960802afba73b5d38sm	}
98cfd74d65d832137e20e193c960802afba73b5d38sm}
99