gpt4 book ai didi

java - 使用 LibGdx 在 Java 中对 Sprite Sheet 进行动画处理

转载 作者:行者123 更新时间:2023-12-02 01:13:49 26 4
gpt4 key购买 nike

我这里有一些代码,它获取一个 Sprite 表,并通过获取图像的长度和宽度并将其按行和列划分,将其分成单独的 Sprite 。这适用于我的测试 Sprite 表,但不适用于我实际要在游戏中使用的 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 工作表的每个框架以相同的方式均匀分布。

关于java - 使用 LibGdx 在 Java 中对 Sprite Sheet 进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58958194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com