Приложение Android Studio перестает работать до того, как оно открывается с помощью Libgdx
Я создал простое приложение на Android Studio, используя Libgdx, для отображения анимации, состоящей из 6 изображений PNG, из которых я сделал TextureAtlas. Проект работает нормально, без каких-либо ошибок, но когда я пытаюсь запустить приложение в эмуляторе, он открывается при открытии. Я знаю, что это не ошибка с эмулятором, поскольку я создал приложение, использующее ту же конфигурацию и библиотеки для отображения текста, прежде чем успешно, и это приложение также падает на моем Galaxy Note 5.
Вот код для основного файла.java:
package com.mygdx.mytestgame;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class MyTestGame extends ApplicationAdapter {
private SpriteBatch batch;
private TextureAtlas shooterAtlas;
private Animation<TextureRegion> animation;
private float timePassed = 0;
@Override
public void create () {
batch = new SpriteBatch();
shooterAtlas = new TextureAtlas(Gdx.files.internal("shooter.atlas"));
animation = new Animation<TextureRegion>(1/30f, shooterAtlas.getRegions());
}
@Override
public void dispose() {
batch.dispose();
shooterAtlas.dispose();
}
@Override
public void render () {
Gdx.gl.glClearColor(0,1,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
timePassed += Gdx.graphics.getDeltaTime();
batch.draw(animation.getKeyFrame(timePassed, true), 300, 500);
batch.end();
}
}
Вот файл манифеста Android:
<?xml version="1.0" encoding="utf-8"?>
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="26" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/GdxTheme" >
<activity
android:name="com.mygdx.mytestgame.AndroidLauncher"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Вот сбой, показанный на logcat:
11-02 12:52:27.514 3634-3666/com.mygdx.mytestgame E/AndroidRuntime: FATAL EXCEPTION: GLThread 193
Process: com.mygdx.mytestgame, PID: 3634
com.badlogic.gdx.utils.GdxRuntimeException: Error reading file: shooter.atlas (Internal)
at com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:77)
at com.badlogic.gdx.graphics.g2d.TextureAtlas$TextureAtlasData.<init>(TextureAtlas.java:103)
at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:231)
at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:226)
at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:216)
at com.mygdx.mytestgame.MyTestGame.create(MyTestGame.java:21)
at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:275)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1555)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1270)
Caused by: java.io.FileNotFoundException: shooter.atlas
at android.content.res.AssetManager.openAsset(Native Method)
at android.content.res.AssetManager.open(AssetManager.java:374)
at android.content.res.AssetManager.open(AssetManager.java:348)
at com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:75)
at com.badlogic.gdx.graphics.g2d.TextureAtlas$TextureAtlasData.<init>(TextureAtlas.java:103)
at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:231)
at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:226)
at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:216)
at com.mygdx.mytestgame.MyTestGame.create(MyTestGame.java:21)
at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:275)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1555)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1270)
Он говорит, что есть ошибка чтения файла "shooter.atlas", который является TextureAtlas, который я использую для своей анимации. Это имя файла правильное и находится в C:\Users\user\Documents\libGDX Projects\android\assets
Какое решение для этого?
1 ответ
Я решил этот вопрос, который, как оказалось, довольно тривиален. Я скачал файл атласа из онлайн-источника, в результате чего файл не был в правильном формате Атласа. Вместо этого это была папка с файлами.png внутри. Поэтому я извлек эти файлы.png и вручную упаковал файл Atlas из файлов.png, используя инструмент gdx-texturepacker.jar, который можно загрузить здесь. Я экспортировал файл Atlas в тот же рабочий каталог: C:\Users\user\Documents\libGDX Projects\android\assets
и просто переименовывается в "shooter.atlas" в название нового файла Atlas: "shooter2.atlas" et voilà!