/*
* -----------------------------------------------------------------------
* Copyright 2012 - Alistair Rutherford - www.netthreads.co.uk
* -----------------------------------------------------------------------
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.netthreads.libgdx.sprite;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
/**
* Frame animation Sprite.
*
* This is more or less just a generalised version of the example from the
* library.
*
*/
public class FrameSprite extends Actor
{
private TextureRegion[] frames;
private Animation animation;
private TextureRegion currentFrame;
private float stateTime;
private boolean looping;
/**
* Construct sprite.
*
* @param texture
* Sprite-sheet texture.
* @param rows
* Sprite-sheet rows.
* @param cols
* Sprite-sheet columns.
* @param frameDuration
* Duration between frames.
* @param looping
* Loop animation.
*/
public FrameSprite(TextureRegion texture, int rows, int cols, float frameDuration, boolean looping)
{
this.looping = looping;
int tileWidth = texture.getRegionWidth() / cols;
int tileHeight = texture.getRegionHeight() / rows;
TextureRegion[][] tmp = texture.split(tileWidth, tileHeight);
frames = new TextureRegion[cols * rows];
int index = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
frames[index++] = tmp[i][j];
}
}
// Set the sprite width and height.
setWidth(tileWidth);
setHeight(tileHeight);
animation = new Animation(frameDuration, frames);
stateTime = 0f;
}
/**
* Draw sprite.
*
*/
@Override
public void draw(Batch batch, float parentAlpha)
{
stateTime += Gdx.graphics.getDeltaTime();
currentFrame = animation.getKeyFrame(stateTime, looping);
batch.draw(currentFrame, getX(), getY());
}
/**
* We have to implement hit check at lowest level.
*
*/
@Override
public Actor hit(float x, float y, boolean touchable)
{
return x > 0 && x < getWidth() && y > 0 && y < getHeight() ? this : null;
}
/**
* Reset animation.
*
* You can use this to ensure the animation plays from the start again. It's
* handy if you have one-shot animations like explosions but you are using
* re-usable Sprites. You must reset the animation to ensure the animation
* plays back again.
*/
public void resetAnimation()
{
stateTime = 0;
}
/**
* Check to see if animation finished.
*
* @param stateTime
*
* @return True if finished.
*/
public boolean isAnimationFinished()
{
return animation.isAnimationFinished(stateTime);
}
}