当前位置: 首页 > 知识库问答 >
问题:

使用LibGdx在Java中设置精灵图纸动画

祝俊
2023-03-14

我这里有一些代码,它需要一个精灵表,并通过吸收我的图像的长度和宽度,并通过行和列将其划分为单独的精灵。这适用于我的测试精灵表,但不是我真正要在游戏中使用的。

我的动画课在这里:

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();
    }
}

当我使用随身听时。png,代码完美无瑕。但当我去使用任何其他精灵床单时,比如WalkingWoman。jpg(我不担心这个不透明),当列和行被相应地调整时,对齐是关闭的。有什么建议吗?

an.png

步行oman.jpg

共有1个答案

芮化
2023-03-14

“动画”类似乎通过假设精灵表图像中的所有帧间隔均匀,将源图像分割为帧。因此,对于WalkingMan图像,512x512px原稿被分成30帧,每帧宽85.33px(512/6列),高102.4px(512/5行)。

如你所说,如果你调整步行者图像的列数和行数(1300x935),你会得到36帧,每帧144.44px宽(1300/9列),233.75px高(935/4行)。

问题是WalkingLady spritesheet没有使每个帧均匀地间隔。如果你把第一帧从图像中分割出来,你会得到这个:

看看她的右脚是怎么被切断的

WalkingMan映像将每个映像放置在一个大小相同的边界框内的spritesheet中。你只需要确保每个帧以相同的方式均匀间隔。

 类似资料:
  • 我在Java和Slick2D方面有几年的经验,我正试图将一个游戏移植到libgdx,因为它是一个更好的库。然而,我有一个简单的问题在屏幕上移动精灵。这个应用编程接口一定有一些我不理解的范例。我将我的代码提炼成以下内容。它识别输入,并在我的整个实体和网络系统中运行它,无论是在服务器上还是从服务器上,但是精灵保持在同一个位置。任何帮助都会很棒。 我的create()方法: getCurrentX/Y方

  • 好吧,我真的很困惑,我以前旋转过精灵,没有问题,比如当船在海洋中移动时旋转它,但是出于某种原因,这次我遇到了一个非常大的问题。所以我在资产文件中创建了一个纹理,但不是静态纹理。我使用以下方式加载纹理: 然后我通过调用来调用主类中的资产: 然后我有一个专门为这个主要角色设计的动画课程,因为他的动画与其他角色非常不同。 然后我有一个渲染类来绘制所有东西,我有对象在一个名为的世界对象中,我用以下方式绘制

  • 从精灵图(雪碧图)中创建精灵【为了防止与精灵混淆,我在之后的译文中都将采用雪碧图这一译法】 你现在已经知道了怎么从一个单文件内加载图像。但是作为一个游戏设计师,你没准更经常使用 雪碧图(也被称之为 精灵图)。Pixi封装了一些方便的方式来处理这种情况。所谓雪碧图就是用一个单文件包含你游戏中需要的所有文件,这里就是一个包含了游戏对象和游戏觉得的雪碧图。 整个雪碧图是192192像素宽高,但每一个单图

  • 有一个运行Libgdx的Android应用程序,其中有很多精灵。目前,我根据它们所属的类别给它们涂上不同的颜色,例如“红色”、“绿色”、“蓝色”等。然而,我认为我更喜欢只给雪碧的一部分涂颜色,而不是整个雪碧。 目前我使用: 用于给批次上色,并将其应用于整个雪碧。当那一组完成后,我改变颜色,转到下一组。当完成分组时,我重置批次颜色。 有没有着色器/搅拌器的方式只着色精灵的一部分?例如,任何在我的纹理

  • 问题内容: 我一直在尝试一个小程序,将桌面图像设置为当前的“每日天文图片”。我一直在使用JNA建议从类似的问题()设置墙纸。但是,我的代码无法正常工作。我不确定出什么问题- 我对JNA的经验很少。这是代码。请忽略完全误导的类名-我从另一个项目开始着手。无效的部分是墙纸的最终设置-没有错误提示,它什么也没做。图像保存良好。 编辑-我决定制作一个批处理文件来设置注册表项并运行它。批处理文件有时可以工作

  • 我试图在登录窗口(stage)内创建一个精灵动画,使用JavaFX,一旦用户获得登录和密码信息,就会播放该动画。我试图使用Michael Heinrichs在他的博客文章中发布的关于使用JavaFX的sprite动画的类,但我无法使其工作,主要是因为我不知道如何在ImageView中创建这个动画,而不使用start方法(在我的情况下也不起作用)。 这是我在登录阶段的FXML文件中的代码: 在控制器