我在这里有一些代码,可以使用一个精灵表,通过吸收图像的长度和宽度,并将其按行和列进行划分,将其划分为各个精灵。这适用于我的测试Sprite工作表,但不适用于我将实际用于游戏的工作表。
我的动画课在这里:
package Simple;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.g2d.Animation;
public class RunningMan {
private Texture texture;
private TextureRegion[] walkFrames;
private Animation walkAnimation;
private float stateTime = 0f;
private TextureRegion currentFrame;
int rows = 5;
int cols = 6;
public RunningMan(Texture texture) {
this.texture = texture;
TextureRegion[][] tmp = TextureRegion.split(texture, texture.getWidth() / cols, texture.getHeight() / rows); // split the sprite sheet up into its 30 different frames
walkFrames = new TextureRegion[rows * cols];
int index = 0;
for(int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
walkFrames[index++] = tmp[i][j]; // Put the 30 frames into a 1D array from the 2d array
}
}
walkAnimation = new Animation(0.06f, walkFrames); // initialize the animation class
stateTime = 0f;
}
public void draw(Batch batch) {
stateTime += Gdx.graphics.getDeltaTime(); // stateTime is used to determine which frame to show
if(stateTime > walkAnimation.getAnimationDuration()) stateTime -= walkAnimation.getAnimationDuration(); // when we reach the end of the animation, reset the stateTime
currentFrame = walkAnimation.getKeyFrame(stateTime); // Get the current Frame
batch.draw(currentFrame,50,50); // draw the frame
}
}
运行动画的我的班级在这里:
package Simple;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
public class Animation extends ApplicationAdapter {
SpriteBatch batch;
RunningMan man;
@Override
public void create () {
batch = new SpriteBatch();
man = new RunningMan(new Texture(Gdx.files.internal("WalkingMan.png")));
}
@Override
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
man.draw(batch);
batch.end();
}
}
当我使用WalkingMan.png时,代码可以完美运行。但是,当我去使用任何其他Sprite表时,例如WalkingWoman.jpg(我不担心此表不是透明的),当相应地调整列和行时,对齐方式将关闭。有什么建议?
WalkingMan.png
WalkingWoman.jpg
最佳答案
动画类似乎通过假定Spritesheet图像中的所有帧均等间隔将源图像拆分为多个帧。因此,对于WalkingMan图像,将512x512px的原始图像分成30个帧,每个帧分别为85.33px宽(512/6列)和102.4px高(512/5行)。
如您所说,如果调整Walkingwoman图像的列数和行数(即1300x935),则会得到36个帧,每个帧宽144.44像素(1300/9列),高233.75像素(935/4行)。
问题在于,WalkingWoman Spritesheet的每一帧都没有均匀分布。如果将第一帧从图像中分离出来,则会得到以下结果:
see how her foot is cut off on the right
WalkingMan图像将每个图像放在大小相同的边框内的Spritesheet中。您只需要确保Walkingwoman工作表以相同的方式均匀间隔每个帧即可。