package org.test.crazyjumpergles.common; import loon.LTexture; import loon.LTextures; public class SpriteAnim extends Sprite { private boolean m_bAnimIsForward; private boolean m_bPlaying; private int m_iAnimDuration; private int m_iAnimLoopType; private int m_iCurrentFrame; private int m_iCurrentFrameDuration; private int m_iNumFrames; private int m_iTotalCycles; private java.util.HashMap<Integer, LTexture> m_TextureArray; private java.util.HashMap<Integer, String> m_TextureNameArray; public SpriteAnim() { super(); this.m_iAnimLoopType = 1; this.m_bAnimIsForward = true; this.m_iCurrentFrame = -1; this.m_TextureNameArray = new java.util.HashMap<Integer, String>(); this.m_TextureArray = new java.util.HashMap<Integer, LTexture>(); } @Override public void AddTexture(LTexture pTexRes) { this.m_TextureNameArray.put(this.m_iNumFrames, pTexRes.getSource()); this.m_TextureArray.put(this.m_iNumFrames, pTexRes); this.m_iNumFrames++; if (super.m_pTexture == null) { super.m_pTexture = pTexRes; } } @Override public void AddTextureByName(String texname, boolean bAutoLoad) { LTexture textured = null; if (bAutoLoad) { textured = LTextures.loadTexture("assets/"+texname+".png"); } this.m_TextureNameArray.put(this.m_iNumFrames, texname); this.m_TextureArray.put(this.m_iNumFrames, textured); this.m_iNumFrames++; if (super.m_pTexture == null) { super.m_pTexture = textured; } } public final int CountObjectsToLoad() { int num = 0; for (int i = 0; i < this.m_iNumFrames; i++) { if (this.m_TextureArray.get(i) == null) { num++; } } return num; } public final void Finish() { this.m_iTotalCycles++; this.m_iCurrentFrame = this.m_iNumFrames - 1; this.m_iCurrentFrameDuration = this.GetAnimTimePerFrame(); } public final int GetAnimDuration() { return this.m_iAnimDuration; } public final boolean GetAnimIsForward() { return this.m_bAnimIsForward; } public final int GetAnimLoopType() { return this.m_iAnimLoopType; } public final int GetAnimTimePerFrame() { return (this.m_iAnimDuration / this.m_iNumFrames); } public final int GetCurrentFrame() { return this.m_iCurrentFrame; } public final int GetCurrentFrameDuration() { return this.m_iCurrentFrameDuration; } public final int GetFramesCount() { return this.m_iNumFrames; } public final LTexture GetTexture(int iAtIndex) { if ((iAtIndex >= 0) && (iAtIndex < this.m_iNumFrames)) { return this.m_TextureArray.get(iAtIndex); } return null; } public final int GetTotalCycles() { return this.m_iTotalCycles; } public final boolean IsAnimFinished() { return (((this.m_iAnimLoopType == 2) || (this.m_iAnimLoopType == 4)) && (this.m_iTotalCycles > 0)); } public final boolean IsLastFrame() { return (this.m_iCurrentFrame == (this.m_iNumFrames - 1)); } @Override public boolean IsLoaded() { for (int i = 0; i < this.m_iNumFrames; i++) { if (this.m_TextureArray.get(i) == null) { return false; } } return true; } public final boolean IsPlaying() { return this.m_bPlaying; } public final void Play() { this.m_bPlaying = true; } @Override public void Release() { this.m_TextureArray.clear(); super.m_pTexture = null; } @Override public void Reload() { for (int i = 0; i < this.m_iNumFrames; i++) { this.m_TextureArray.put(i, LTextures.loadTexture("assets/"+this.m_TextureNameArray.get(i)+".png")); } this.SetCurrentFrame(this.m_iCurrentFrame, false); } public final void RemoveAllTextures() { this.m_iNumFrames = 0; this.m_TextureNameArray.clear(); this.m_TextureArray.clear(); } public final void ReplaceTexture(int iAtIndex, LTexture pTexRes) { this.m_TextureNameArray.put(iAtIndex, pTexRes.getSource()); this.m_TextureArray.put(iAtIndex, pTexRes); } @Override public void Reset() { this.m_bPlaying = false; this.m_iTotalCycles = 0; this.SetCurrentFrame(0, true); super.Reset(); } public final void SetAnimDuration(int animDuration) { this.m_iAnimDuration = (short) animDuration; } public final void SetAnimIsForward(boolean bIsForward) { this.m_bAnimIsForward = bIsForward; } public final void SetAnimLoopType(int loopType) { this.m_iAnimLoopType = loopType; } public final void SetCurrentFrame(int newCurFrame, boolean bResetFrameDuration) { if ((newCurFrame >= 0) && (newCurFrame < this.m_iNumFrames)) { this.m_iCurrentFrame = newCurFrame; if (bResetFrameDuration) { this.m_iCurrentFrameDuration = 0; } super.m_pTexture = this.GetTexture(this.m_iCurrentFrame); } } public final void SetCurrentFrameByTexName(String texName, boolean bResetFrameDuration) { for (int i = 0; i < this.m_iNumFrames; i++) { if (this.m_TextureNameArray.get(i).compareTo(texName) == 0) { this.SetCurrentFrame(i, bResetFrameDuration); return; } } } public final void SetCurrentFrameDuration(short newCurFrameDuration) { this.m_iCurrentFrameDuration = newCurFrameDuration; } public final void Stop() { this.m_bPlaying = false; } @Override public void Tick(int deltaMS) { super.Tick(deltaMS); if (!this.IsAnimFinished() && this.m_bPlaying) { this.m_iCurrentFrameDuration += (short) deltaMS; if ((this.m_iAnimLoopType != 0) && (this.m_iCurrentFrameDuration >= this.GetAnimTimePerFrame())) { if (this.m_bAnimIsForward) { this.m_iCurrentFrame++; } else { this.m_iCurrentFrame--; } if (this.m_iCurrentFrame >= this.m_iNumFrames) { if ((this.m_iAnimLoopType == 3) || (this.m_iAnimLoopType == 4)) { this.m_bAnimIsForward = false; this.m_iCurrentFrame = (short)(this.m_iNumFrames - 2); } else if (this.m_iAnimLoopType == 2) { this.m_iCurrentFrame = (short)(this.m_iNumFrames - 1); } else { this.m_iCurrentFrame = 0; } if ((this.m_iAnimLoopType != 3) && (this.m_iAnimLoopType != 4)) { this.m_iTotalCycles++; } } else if (this.m_iCurrentFrame < 0) { this.m_bAnimIsForward = true; this.m_iCurrentFrame = 1; if ((this.m_iAnimLoopType == 3) || (this.m_iAnimLoopType == 4)) { this.m_iTotalCycles++; } } this.SetCurrentFrame(this.m_iCurrentFrame, true); } } } @Override public void Unload() { for (int i = 0; i < this.m_iNumFrames; i++) { this.m_TextureArray.put(i, null); } } public enum EAnimLoopType { AnimLoop_Frame, AnimLoop_Forever, AnimLoop_Once, AnimLoop_PingPong, AnimLoop_PingPongOnce; public int getValue() { return this.ordinal(); } public static EAnimLoopType forValue(int value) { return values()[value]; } } }