Android Studio App在使用Libgdx

时间:2017-11-02 10:36:06

标签: java android android-studio libgdx texture-atlas

我在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 Manifest文件:

<?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) 

它说读取文件有错误&#34; shooter.atlas&#34;这是我用于动画的TextureAtlas。此文件名正确无误,位于C:\Users\user\Documents\libGDX Projects\android\assets

这是什么解决方案?

1 个答案:

答案 0 :(得分:1)

我解决了这个问题,事实证明,这个问题非常简单。我从在线来源下载了atlas文件,该文件不是正确的Atlas格式。相反,它是一个包含.png文件的文件夹。所以我提取了这些.png文件,并使用gdx-texturepacker.jar工具从.png文件中手动打包了一个Atlas文件,该工具可以从here下载。我将Atlas文件导出到同一工作目录:<!doctype html> <html lang="en" prefix="og: http://ogp.me/ns#"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="http://cdn.pydata.org/bokeh/release/bokeh-0.12.10.min.css" rel="stylesheet" type="text/css"> <script type="text/javascript" src="https://cdn.pydata.org/bokeh/release/bokeh-0.12.10.min.js"></script> <BOKEH SCRIPT IS PLACED HERE> <!-- Google Fonts --> <link href="https://fonts.googleapis.com/css?family=Roboto:100,100i,300,300i,400,400i,700,700i%7CMaitree:200,300,400,600,700&amp;subset=latin-ext" rel="stylesheet"> <!-- CSS WebSlides --> <link rel="stylesheet" type='text/css' media='all' href="static/css/webslides.css"> <!-- Optional - CSS SVG Icons (Font Awesome) --> <link rel="stylesheet" type='text/css' media='all' href="static/css/svg-icons.css"> </head> <body> <main role="main"> <article id="webslides" class="horizontal"> <section> <div class="bk-root"> <div class="bk-plotdiv" id="dac8b20e-c981-49a6-8c18-cf0ca0ddc43a"></div> </div> </section> </article> </main> <script src="static/js/webslides.js"></script> <script> window.ws = new WebSlides(); </script> <script defer src="static/js/svg-icons.js"></script> </body> </html> 并简单地将“shooter.atlas”重命名为新Atlas文件的名称:“shooter2.atlas”etvoilà!