package library.core.model;

import java.util.ArrayList;

public abstract class CoreAnimationModel extends CoreModel implements Cloneable{


	private ArrayList<CoreAnimation> animations;	//いくつかのアニメーションデータが含まれる　１つの場合もある

	private CoreAnimation targetAnim;

	private long time=0;

	/**
	 *
	 * @param animations	アニメーション情報
	 * @param startTargetAnimIndex 初めに行うアニメーション
	 * @param centerX
	 * @param centerY
	 * @param width
	 * @param height
	 */
	public CoreAnimationModel(ArrayList<CoreAnimation> animations,int startTargetAnimIndex,float centerX,
			float centerY, float width, float height) {
		super(animations.get(startTargetAnimIndex).getImage(), centerX, centerY, width, height);

		this.animations=animations;

		this.targetAnim=animations.get(startTargetAnimIndex);


		for(int i=0;i<animations.size();i++){
			animations.get(i).setPalent(this);
		}

	}


	@Override
	public  CoreAnimationModel clone(){

		CoreAnimationModel c=null;

		c=(CoreAnimationModel) super.clone();

		c.targetAnim=targetAnim.clone();
		c.targetAnim.setPalent(c);

		c.animations=new ArrayList<CoreAnimation>();
		for(int i=0;i<animations.size();i++){
			c.animations.add(this.animations.get(i).clone());
			c.animations.get(i).setPalent(c);	//親もクローンしたものに変更する
		}


		return c;
	}


	/***
	 * アニメーションの変更
	 * @param index
	 */
	public void changeAnimation(int index){
		//変更する前に初期化をしておいて、ここに戻った時も最初から再生できるようにする
		this.targetAnim.changeAnimation();

		//変更時に処理をする場合用の抽象クラスの呼び出し
		this.endAnimationEvent(this.targetAnim);

		//アニメーションの変更
		this.targetAnim=animations.get(index);
		this.setImageData(targetAnim.getImage());
	}

	/**
	 * アニメーション終了(変更)時に呼ばれる
	 * @param endAnim  終了したアニメーション
	 */
	public abstract void endAnimationEvent(CoreAnimation endAnim);


	@Override
	public void drawUpdate(){

		float difTime=System.currentTimeMillis()-time;
		time=System.currentTimeMillis();
		float deltaTime= (difTime/1000.0f);

		/**
		 * アニメーションを更新して、画像をセットし直す
		 */
		targetAnim.upDate(deltaTime);
		this.setImageData(targetAnim.getImage());

	}



}
