package net.alcuria.umbracraft.editor.widget; import net.alcuria.umbracraft.definitions.anim.AnimationDefinition; import net.alcuria.umbracraft.definitions.anim.AnimationFrameDefinition; import net.alcuria.umbracraft.editor.Editor; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; /** A helper image for displaying an {@link AnimationDefinition} * @author Andrew Keturi */ public class AnimationPreview extends Image { private int count = 0; private final AnimationDefinition definition; private int idx = 0; private String lastPath; private int originX = 0; private TextureRegion textureRegion; public AnimationPreview(AnimationDefinition definition) { this.definition = definition; originX = definition.originX; } @Override public void act(float delta) { super.act(delta); if (definition.frames.size == 0) { return; } count++; if (idx >= 0 && idx < definition.frames.size && count > definition.frames.get(idx).duration) { count = 0; idx = (idx + 1) % definition.frames.size; setColor(definition.frames.get(idx).color != null ? definition.frames.get(idx).color : Color.WHITE); final AnimationFrameDefinition frame = definition.frames.get(idx); final String path = "sprites/animations/" + definition.filename + ".png"; if (definition.filename.length() > 0 && path != null && !path.equals(lastPath)) { FileHandle fileHandle = Gdx.files.internal(path); if (!fileHandle.exists()) { final String extPath = Editor.db().config().projectPath + Editor.db().config().spritePath + definition.filename + ".png"; fileHandle = Gdx.files.absolute(extPath); if (!fileHandle.exists()) { return; } } textureRegion = new TextureRegion(new Texture(fileHandle), frame.x * definition.width + (frame.mirror ? definition.width : 0), frame.y * definition.height, frame.mirror ? -definition.width : definition.width, definition.height); setDrawable(new TextureRegionDrawable(textureRegion)); lastPath = new String(path); } if (textureRegion != null) { textureRegion.setRegion(frame.x * definition.width + (frame.mirror ? definition.width : 0), frame.y * definition.height, frame.mirror ? -definition.width : definition.width, definition.height); } } } public TextureRegion getCurrentRegion() { return textureRegion; } @Override public float getOriginX() { return originX; } }