动画关键帧(LIBGDX)导致的除零异常
Division By Zero Exception caused by animation key frame (LIBGDX)
基本上,我尝试使用 TextureAtlas 并使用 .findRegions() 在我的游戏屏幕之一中实现动画以用于动画对象。
我尝试将文件重命名为各自的索引(以及更新 .pack 文件夹)
Sample Pack Folder:
sunglasses_1.png
format: RGBA8888
filter: Nearest,Nearest
repeat: none
tile000
rotate: false
xy: 1, 1
size: 600, 600
orig: 600, 600
offset: 0, 0
index: -1
...and so on until sunglasses_35.png
我也在 SAO 中读到了同样的问题:Animating the sprite array created from texture atlas - 但它没有帮助。我还阅读了 GitHub 页面,其中包含有关动画和 TextureRegions 的信息。
这是用于实现动画的代码行
动画设置
//animation setup with batch
batch = new SpriteBatch();
animationAtlas = new TextureAtlas(Gdx.files.internal("sunglasses.pack"));
animation = new Animation<>(0.13f, animationAtlas.findRegions("sunglasses"), Animation.PlayMode.LOOP);
在屏幕的 render() 函数中调用的动画 class
@Override
public void render(float delta) {
float elapsedTime = 0f;
elapsedTime += Gdx.graphics.getDeltaTime();
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.draw();
batch.begin();
batch.draw(animation.getKeyFrame(elapsedTime), 100, 100);
batch.end();
}
错误
Exception in thread "LWJGL Application" java.lang.ArithmeticException: / by zero
at com.badlogic.gdx.graphics.g2d.Animation.getKeyFrameIndex(Animation.java:138)
at com.badlogic.gdx.graphics.g2d.Animation.getKeyFrame(Animation.java:122)
at com.tantei.game.Screens.MainMenu.render(MainMenu.java:104)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.tantei.game.Game.render(Game.java:21)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:225)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:126)
感谢任何帮助!!
[EDIT] animation.getKeyFrames()
returns 大小为 0 - 因此例外。我还是不明白为什么它没有元素
您的图集没有为动画正确创建,因此当您调用 animationAtlas.findRegions
时,它返回一个空数组。当您调用 animation.getKeyFrame()
时,它除以零帧动画,因此出现异常。
要使 animationAtlas.findRegions("sunglasses")
正常工作,您在打包文件中的每个区域都需要完全相同的名称(太阳镜),而不是 tile000、tile001、tile003 等。它们每个都应该有不同的 index
在它们下面,并不是所有的 index
都是 -1。
尝试手动创建纹理图集只是在惩罚自己。使用 TexturePacker。
基本上,我尝试使用 TextureAtlas 并使用 .findRegions() 在我的游戏屏幕之一中实现动画以用于动画对象。
我尝试将文件重命名为各自的索引(以及更新 .pack 文件夹)
Sample Pack Folder:
sunglasses_1.png
format: RGBA8888
filter: Nearest,Nearest
repeat: none
tile000
rotate: false
xy: 1, 1
size: 600, 600
orig: 600, 600
offset: 0, 0
index: -1
...and so on until sunglasses_35.png
我也在 SAO 中读到了同样的问题:Animating the sprite array created from texture atlas - 但它没有帮助。我还阅读了 GitHub 页面,其中包含有关动画和 TextureRegions 的信息。
这是用于实现动画的代码行
动画设置
//animation setup with batch
batch = new SpriteBatch();
animationAtlas = new TextureAtlas(Gdx.files.internal("sunglasses.pack"));
animation = new Animation<>(0.13f, animationAtlas.findRegions("sunglasses"), Animation.PlayMode.LOOP);
在屏幕的 render() 函数中调用的动画 class
@Override
public void render(float delta) {
float elapsedTime = 0f;
elapsedTime += Gdx.graphics.getDeltaTime();
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.draw();
batch.begin();
batch.draw(animation.getKeyFrame(elapsedTime), 100, 100);
batch.end();
}
错误
Exception in thread "LWJGL Application" java.lang.ArithmeticException: / by zero
at com.badlogic.gdx.graphics.g2d.Animation.getKeyFrameIndex(Animation.java:138)
at com.badlogic.gdx.graphics.g2d.Animation.getKeyFrame(Animation.java:122)
at com.tantei.game.Screens.MainMenu.render(MainMenu.java:104)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.tantei.game.Game.render(Game.java:21)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:225)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:126)
感谢任何帮助!!
[EDIT] animation.getKeyFrames()
returns 大小为 0 - 因此例外。我还是不明白为什么它没有元素
您的图集没有为动画正确创建,因此当您调用 animationAtlas.findRegions
时,它返回一个空数组。当您调用 animation.getKeyFrame()
时,它除以零帧动画,因此出现异常。
要使 animationAtlas.findRegions("sunglasses")
正常工作,您在打包文件中的每个区域都需要完全相同的名称(太阳镜),而不是 tile000、tile001、tile003 等。它们每个都应该有不同的 index
在它们下面,并不是所有的 index
都是 -1。
尝试手动创建纹理图集只是在惩罚自己。使用 TexturePacker。