blob: c610cb3e1e7632772b8b8c6e425248f5820658b6 [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;
/**
* Maintains a canonical time step, in seconds, for the entire game engine. This time step
* represents real changes in time but is only updated once per frame.
*/
// TODO: time distortion effects could go here, or they could go into a special object manager.
public class TimeSystem extends BaseObject {
private float mGameTime;
private float mRealTime;
private float mFreezeDelay;
private float mGameFrameDelta;
private float mRealFrameDelta;
private float mTargetScale;
private float mScaleDuration;
private float mScaleStartTime;
private boolean mEaseScale;
private static final float EASE_DURATION = 0.5f;
public TimeSystem() {
super();
reset();
}
@Override
public void reset() {
mGameTime = 0.0f;
mRealTime = 0.0f;
mFreezeDelay = 0.0f;
mGameFrameDelta = 0.0f;
mRealFrameDelta = 0.0f;
mTargetScale = 1.0f;
mScaleDuration = 0.0f;
mScaleStartTime = 0.0f;
mEaseScale = false;
}
@Override
public void update(float timeDelta, BaseObject parent) {
mRealTime += timeDelta;
mRealFrameDelta = timeDelta;
if (mFreezeDelay > 0.0f) {
mFreezeDelay -= timeDelta;
mGameFrameDelta = 0.0f;
} else {
float scale = 1.0f;
if (mScaleStartTime > 0.0f) {
final float scaleTime = mRealTime - mScaleStartTime;
if (scaleTime > mScaleDuration) {
mScaleStartTime = 0;
} else {
if (mEaseScale) {
if (scaleTime <= EASE_DURATION) {
// ease in
scale = Lerp.ease(1.0f, mTargetScale, EASE_DURATION, scaleTime);
} else if (mScaleDuration - scaleTime < EASE_DURATION) {
// ease out
final float easeOutTime = EASE_DURATION - (mScaleDuration - scaleTime);
scale = Lerp.ease(mTargetScale, 1.0f, EASE_DURATION, easeOutTime);
} else {
scale = mTargetScale;
}
} else {
scale = mTargetScale;
}
}
}
mGameTime += (timeDelta * scale);
mGameFrameDelta = (timeDelta * scale);
}
}
public float getGameTime() {
return mGameTime;
}
public float getRealTime() {
return mRealTime;
}
public float getFrameDelta() {
return mGameFrameDelta;
}
public float getRealTimeFrameDelta() {
return mRealFrameDelta;
}
public void freeze(float seconds) {
mFreezeDelay = seconds;
}
public void appyScale(float scaleFactor, float duration, boolean ease) {
mTargetScale = scaleFactor;
mScaleDuration = duration;
mEaseScale = ease;
if (mScaleStartTime <= 0.0f) {
mScaleStartTime = mRealTime;
}
}
}