/*********************************************************************** * mt4j Copyright (c) 2008 - 2009 C.Ruff, Fraunhofer-Gesellschaft All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * ***********************************************************************/ package org.mt4j.util.animation; /** * The Class Animation. * @author Christopher Ruff */ public class Animation extends AbstractAnimation implements IAnimationManagerListener, IAnimation{ /** The name. */ private String name; /** The interpolator. */ private Iinterpolator interpolator; /** The reset on finish. */ private boolean resetOnFinish; /** The trigger time. */ private long triggerTime; /** The trigger count down. */ private long triggerCountDown; /** The has started. */ private boolean hasStarted; /** * Instantiates a new animation. * * @param name the name * @param interpolator the interpolator * @param targetObject the target object */ public Animation(String name, Iinterpolator interpolator, Object targetObject) { this(name, interpolator, targetObject, 0); } /** * creates a new Animation object with the given interpolator. * <br> if animating a concrete object, the targetObject should * be passed as a parameter. If the Animation has no concrete target * "null" can be passed * * @param name the name * @param interpolator the interpolator * @param targetObject the target object * @param triggerTime the trigger time */ public Animation(String name, Iinterpolator interpolator, Object targetObject, int triggerTime) { super(targetObject); this.resetOnFinish = true; //Default this.name = name; this.interpolator = interpolator; this.triggerTime = triggerTime; this.triggerCountDown = triggerTime; this.hasStarted = false; } /* (non-Javadoc) * @see org.mt4j.util.animation.IAnimation#start() */ public void start(){ if (this.getInterpolator().isFinished()){ System.err.println("Animation: " + this.getName() + " has finished! To start it again, call restart() or set Animation.setResetOnFinish(true)"); return; } AnimationManager.getInstance().registerAnimation(this); AnimationManager.getInstance().addAnimationManagerListener(this); // System.out.println("Animation STARTED: " + this.getName()); // fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_STARTED, this, this.getTargetObject())); } /** * Restart. */ public void restart(){ this.getInterpolator().resetInterpolator(); this.triggerCountDown = this.getTriggerTime(); this.hasStarted = false; AnimationManager.getInstance().registerAnimation(this); AnimationManager.getInstance().addAnimationManagerListener(this); // System.out.println("Animation RESTARTED: " + this.getName()); // fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_STARTED, this, this.getTargetObject())); } /* (non-Javadoc) * @see org.mt4j.util.animation.IAnimation#stop() */ public void stop(){ AnimationManager.getInstance().unregisterAnimation(this); AnimationManager.getInstance().removeAnimationManagerListener(this); // System.out.println("Animation FINISHED: " + this.getName()); //TODO fire? // fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_ENDED, this, this.getTargetObject())); } /** * Interface method of IAnimationManagerListener * <br>used to update the anmation (interpolate) with a given timedelta. * * @param ev the ev */ public void updateAnimation(AnimationUpdateEvent ev) { //System.out.println("animating " + a.getName()); if (triggerTime != 0){//If trigger is set triggerCountDown -= ev.getDeltaTime(); //if !<0? if (triggerCountDown <= 0){ //if trigger abgelaufen //Interpoliere mit neuerm zeitdelta auf neuen wert interpolator.interpolate(ev.getDeltaTime()); if (!interpolator.isFinished()){ if (!hasStarted){ hasStarted = true; this.fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_STARTED, this, targetObject)); }else{ this.fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_UPDATED, this, targetObject)); } }else{ //FIXME wenn gefinished, sollte der interpolator bei lastStepdelta und 0 zur�ckgeben, oder?? this.fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_ENDED, this, targetObject)); AnimationManager.getInstance().unregisterAnimation(this); AnimationManager.getInstance().removeAnimationManagerListener(this); this.triggerCountDown = this.getTriggerTime(); if (this.isResetOnFinish()){ this.getInterpolator().resetInterpolator(); this.triggerCountDown = this.triggerTime; this.hasStarted = false; } } }//if triggetcount not up, do nothing }else{//If no trigger is set interpolator.interpolate(ev.getDeltaTime()); if (!this.interpolator.isFinished()){ if (!this.hasStarted){ //Animation hasnt begun yet this.hasStarted = true; this.fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_STARTED, this, targetObject)); }else{ this.fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_UPDATED, this, targetObject)); } }else{ this.fireAnimationEvent(new AnimationEvent(this, AnimationEvent.ANIMATION_ENDED, this, targetObject)); AnimationManager.getInstance().unregisterAnimation(this); AnimationManager.getInstance().removeAnimationManagerListener(this); if (this.isResetOnFinish()){ this.getInterpolator().resetInterpolator(); this.triggerCountDown = this.triggerTime; //Reset triggercountdown this.hasStarted = false; } }//end else interpol !finished }//end else trigger not set } /** * Gets the trigger time. * * @return the trigger time */ public long getTriggerTime() { return triggerTime; } /** * Sets the trigger time. * * @param triggerTime the new trigger time */ public void setTriggerTime(long triggerTime) { this.triggerTime = triggerTime; this.triggerCountDown = triggerTime; } /** * Checks if is reset on finish. * * @return true, if is reset on finish */ public boolean isResetOnFinish() { return resetOnFinish; } /** * Sets the reset on finish. * * @param resetOnFinish the new reset on finish */ public void setResetOnFinish(boolean resetOnFinish) { this.resetOnFinish = resetOnFinish; } /** * Gets the interpolator. * * @return the interpolator */ public Iinterpolator getInterpolator() { return interpolator; } /** * Sets the interpolator. * * @param interpolator the new interpolator */ public void setInterpolator(Iinterpolator interpolator) { this.interpolator = interpolator; } /** * Gets the name. * * @return the name */ public String getName() { return name; } /** * Sets the name. * * @param name the new name */ public void setName(String name) { this.name = name; } /* (non-Javadoc) * @see org.mt4j.util.animation.IAnimation#getCurrentStepDelta() */ public float getDelta() { return this.getInterpolator().getCurrentStepDelta(); } /* (non-Javadoc) * @see org.mt4j.util.animation.IAnimation#getCurrentValue() */ public float getValue() { return this.getInterpolator().getCurrentValue(); } }