com.laex.cg2d.entityeditor.pages.ExternalAnimationPreview.java Source code

Java tutorial

Introduction

Here is the source code for com.laex.cg2d.entityeditor.pages.ExternalAnimationPreview.java

Source

/*
 * Copyright (c) 2012, 2013 Hemanta Sapkota.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Hemanta Sapkota (laex.pearl@gmail.com)
 */
package com.laex.cg2d.entityeditor.pages;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.utils.Array;
import com.google.common.base.Optional;
import com.laex.cg2d.entityeditor.Activator;
import com.laex.cg2d.model.ScreenModel.CGBounds;
import com.laex.cg2d.model.ScreenModel.CGEntity;
import com.laex.cg2d.model.ScreenModel.CGEntityAnimation;
import com.laex.cg2d.model.ScreenModel.CGEntitySpritesheetItem;

/**
 * The Class ExternalAnimationPreview.
 */
public class ExternalAnimationPreview extends ApplicationAdapter {

    /** The state time. */
    private float stateTime;

    /** The spr. */
    private Sprite spr;

    /** The batch. */
    private SpriteBatch batch;

    /** The cam. */
    private OrthographicCamera cam;

    /** The sprite animation. */
    private Optional<Animation> spriteAnimation = Optional.absent();

    /** The shape renderer. */
    private ShapeRenderer shapeRenderer;

    /** The h. */
    float w, h;

    /** The animation name. */
    private String animationName;

    /** The cge file. */
    private String cgeFile;

    /**
     * Instantiates a new external animation preview.
     * 
     * @param animationName
     *          the animation name
     * @param cgeFile
     *          the cge file
     */
    public ExternalAnimationPreview(String animationName, String cgeFile) {
        this.animationName = animationName;
        this.cgeFile = cgeFile;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.badlogic.gdx.ApplicationAdapter#create()
     */
    @Override
    public void create() {
        super.create();

        this.shapeRenderer = new ShapeRenderer();

        Texture.setEnforcePotImages(false);

        batch = new SpriteBatch();
        w = Gdx.graphics.getWidth();
        h = Gdx.graphics.getHeight();

        cam = new OrthographicCamera(w, h);
        cam.position.set(0, 0, 0);

        CGEntityAnimation anim = null;

        FileInputStream fis;
        try {
            fis = new FileInputStream(cgeFile);
            CGEntity entity = CGEntity.parseFrom(fis);
            for (CGEntityAnimation ea : entity.getAnimationsList()) {
                if (ea.getAnimationName().equals(animationName)) {
                    anim = ea;
                }
            }
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }

        if (anim == null) {
            return;
        }

        FileHandle handle = Gdx.files.absolute(anim.getSpritesheetFile().getResourceFileAbsolute());
        if (!handle.exists()) {
            return;
        }

        Texture tex = new Texture(handle);
        tex.setFilter(TextureFilter.Linear, TextureFilter.Linear);

        Array<TextureRegion> indexedFrames = new Array<TextureRegion>();
        for (CGEntitySpritesheetItem esi : anim.getSpritesheetItemsList()) {
            CGBounds b = esi.getExtractBounds();
            TextureRegion tr = new TextureRegion(tex, (int) b.getX(), (int) b.getY(), (int) b.getWidth(),
                    (int) b.getHeight());
            indexedFrames.add(tr);
        }

        Animation sa = new Animation(anim.getAnimationDuration(), indexedFrames);
        spriteAnimation = Optional.fromNullable(sa);

        spr = new Sprite(sa.getKeyFrame(stateTime, true));
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.badlogic.gdx.ApplicationAdapter#dispose()
     */
    @Override
    public void dispose() {
        super.dispose();

        if (spr != null)
            spr.getTexture().dispose();

        batch.dispose();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.badlogic.gdx.ApplicationAdapter#render()
     */
    @Override
    public void render() {
        GL10 gl = Gdx.graphics.getGL10();
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        stateTime += Gdx.graphics.getDeltaTime();
        batch.setProjectionMatrix(cam.combined);

        if (!spriteAnimation.isPresent()) {
            return;
        }

        TextureRegion tr = spriteAnimation.get().getKeyFrame(stateTime, true);
        spr.setRegion(tr);

        batch.begin();
        spr.draw(batch);
        batch.end();

        shapeRenderer.begin(ShapeType.Line);
        shapeRenderer.setColor(Color.ORANGE);
        shapeRenderer.line(0, h / 2, w, h / 2);
        shapeRenderer.line(w / 2, 0, w / 2, h);
        shapeRenderer.end();
    }

    /**
     * The main method.
     * 
     * @param args
     *          the arguments
     */
    public static void main(String[] args) {

        String animationName = args[0];
        String spriteSheetFile = args[1];

        LwjglApplicationConfiguration lac = new LwjglApplicationConfiguration();
        lac.width = 200;
        lac.height = 200;
        lac.title = animationName;

        try {
            ExternalAnimationPreview eap = new ExternalAnimationPreview(animationName, spriteSheetFile);
            new LwjglApplication(eap, lac);
        } catch (Exception ge) {
            System.exit(0);
        }

    }

}