package br.com.etyllica.core.animation; import java.util.ArrayList; import java.util.List; import br.com.etyllica.core.animation.script.AnimationScript; import br.com.etyllica.core.event.KeyEvent; import br.com.etyllica.core.event.PointerEvent; import br.com.etyllica.core.graphics.Graphics; import br.com.etyllica.core.ui.UIComponent; public class AnimationHandler implements UIComponent { private static AnimationHandler instance; private List<AnimationExecution> scripts = new ArrayList<AnimationExecution>(); private List<AnimationScript> nextScripts = new ArrayList<AnimationScript>(); private AnimationHandler() { super(); } public static AnimationHandler getInstance() { if (instance == null) { instance = new AnimationHandler(); } return instance; } public void update(long now) { for(int i = scripts.size()-1; i>=0; i--) { AnimationExecution execution = scripts.get(i); if(!execution.execute(now)) { if(repeatLogic(execution, now)) { scripts.remove(execution); } } } //Add next Scripts for(AnimationScript script: nextScripts) { scripts.add(new AnimationExecution(script)); } nextScripts.clear(); } private boolean repeatLogic(AnimationExecution execution, long now) { AnimationScript script = execution.getScript(); if(script.getRepeat() == AnimationScript.REPEAT_FOREVER) { //Repeat Forever script.restart(); nextScripts.add(script); } else if(script.getRepeat()-1 > execution.getRepeated()) { //Repeat cycle //script.calculate(1); execution.repeat(); script.preAnimate(now); return false; } else { //Animation is over notifyFinish(script, now); //Next Script appendNextScript(script); } return true; } private void appendNextScript(AnimationScript script) { //Next Scripts List<AnimationScript> nextScript = script.getNext(); if(nextScript != null) { for(AnimationScript s: nextScript) { nextScripts.add(s); s.restart(); } } } private void notifyFinish(AnimationScript script, long now) { script.finish(now); } public void add(AnimationScript script) { scripts.add(new AnimationExecution(script)); } public void remove(AnimationScript script) { for(AnimationExecution execution: scripts) { if(execution.getScript() == script) { scripts.remove(script); break; } } } public void clearAll() { scripts.clear(); nextScripts.clear(); } @Override public void draw(Graphics g) { // TODO Auto-generated method stub } @Override public void updateMouse(PointerEvent event) { // TODO Auto-generated method stub } @Override public void updateKeyboard(KeyEvent event) { // TODO Auto-generated method stub } }