Приложение 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à!

Другие вопросы по тегам