/** * Copyright 2008 - 2012 * * 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. * * @project loon * @author cping * @email:javachenpeng@yahoo.com * @version 0.3.3 */ package loon.action.sprite.painting; import loon.LRelease; import loon.action.sprite.SpriteBatch; import loon.event.GameKey; import loon.event.GameTouch; import loon.event.SysInput; import loon.geom.Vector2f; import loon.utils.MathUtils; import loon.utils.timer.GameTime; public abstract class Drawable implements LRelease { public boolean IsPopup = false; public float transitionOnTime = 0; public float transitionOffTime = 0; public Vector2f bottomLeftPosition = new Vector2f(); public DrawableScreen drawableScreen; boolean otherScreenHasFocus; protected float _transitionPosition = 1f; protected DrawableState _drawableState = DrawableState.TransitionOn; protected boolean _enabled = true; protected boolean _isExiting = false; public DrawableScreen getDrawableScreen() { return drawableScreen; } public void exitScreen() { if (this.transitionOffTime == 0f) { this.drawableScreen.removeDrawable(this); } else { this._isExiting = true; } } public Vector2f getBottomLeftPosition() { return bottomLeftPosition; } public DrawableState getDrawableState() { return _drawableState; } public void setDrawableState(DrawableState state) { _drawableState = state; } public float getTransitionAlpha() { return (1f - this._transitionPosition); } public float getTransitionPosition() { return _transitionPosition; } public abstract void handleInput(SysInput input); public boolean isActive() { return !otherScreenHasFocus && (_drawableState == DrawableState.TransitionOn || _drawableState == DrawableState.Active); } public boolean isExiting() { return _isExiting; } public abstract void loadContent(); public abstract void unloadContent(); public abstract void draw(SpriteBatch batch, GameTime elapsedTime); public abstract void update(GameTime elapsedTime); public void update(GameTime gameTime, boolean otherScreenHasFocus, boolean coveredByOtherScreen) { this.otherScreenHasFocus = otherScreenHasFocus; if (this._isExiting) { this._drawableState = DrawableState.TransitionOff; if (!this.updateTransition(gameTime, this.transitionOffTime, 1)) { this.drawableScreen.removeDrawable(this); } } else if (coveredByOtherScreen) { if (this.updateTransition(gameTime, this.transitionOffTime, 1)) { this._drawableState = DrawableState.TransitionOff; } else { this._drawableState = DrawableState.Hidden; } } else if (this.updateTransition(gameTime, this.transitionOnTime, -1)) { this._drawableState = DrawableState.TransitionOn; } else { this._drawableState = DrawableState.Active; } update(gameTime); } private boolean updateTransition(GameTime gameTime, float time, int direction) { float num; if (time == 0f) { num = 1f; } else { num = (gameTime.getElapsedGameTime() / time); } this._transitionPosition += num * direction; if (((direction < 0) && (this._transitionPosition <= 0f)) || ((direction > 0) && (this._transitionPosition >= 1f))) { this._transitionPosition = MathUtils.clamp( this._transitionPosition, 0f, 1f); return false; } return true; } public abstract void pressed(GameTouch e); public abstract void released(GameTouch e); public abstract void move(GameTouch e); public abstract void pressed(GameKey e); public abstract void released(GameKey e); public boolean isEnabled() { return _enabled; } public void setEnabled(boolean e) { this._enabled = e; } public void dispose() { this._enabled = false; } }