【问题标题】:LibGDX writing to text file and receiving various errorsLibGDX 写入文本文件并收到各种错误
【发布时间】:2014-04-10 01:23:43
【问题描述】:

我目前正在使用 LibGDX 创建的游戏具有“高分”功能,其中高分保存在文本文件中,然后写入或读取到屏幕上。我在这里遇到很多错误。我尝试设置权限以允许外部文件写入,我尝试将我的 .txt 文件放在不同的目录中。我尝试使用 Gdx.files.internal() and Gdx.files.external() 没有任何效果。这是我获得和设置高分的两种方法。

private int getHighScore()
{
    FileHandle scoreFile = Gdx.files.local("data/high_score.txt");
    String text = scoreFile.readString();
    int highScore = Integer.parseInt(text);
    return highScore;
}

private void setHighScore(int newScore)
{
    FileHandle scoreFile = Gdx.files.local("data/high_score.txt");
    String score = Integer.toString(newScore);
    scoreFile.writeString(score, false);
}

在游戏中死亡(应该显示分数时),我从 LibGDX 收到此错误:

03-06 22:31:37.437: ERROR/AndroidRuntime(14533): FATAL EXCEPTION: GLThread 4617
        com.badlogic.gdx.utils.GdxRuntimeException: File not found: /data/data/hasherr.floppyfish.android.core/files/data/high_score.txt (Local)
        at com.badlogic.gdx.files.FileHandle.read(FileHandle.java:133)
        at com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:77)
        at com.badlogic.gdx.files.FileHandle.readString(FileHandle.java:198)
        at com.badlogic.gdx.files.FileHandle.readString(FileHandle.java:186)
        at hasherr.ghostly.main.state.DeathState.getHighScore(DeathState.java:122)
        at hasherr.ghostly.main.state.DeathState.render(DeathState.java:87)
        at hasherr.ghostly.main.state.StateManager.render(StateManager.java:37)

请注意:

找不到文件:/data/data/hasherr.floppyfish.android.core/files/data/high_score.txt(本地)

/data/data/hasherr.floppyfish.android.core/files/data/high_score.txt 不是我游戏中的目录/文件。 data/high_score.txt 是,这就是我想要访问的文件。我对Gdx.files.local(path) 方法不是很熟悉,所以我不确定它是从哪里获取的。

如何让我的程序使用这个文本文件而不抛出错误?

【问题讨论】:

  • 你是否在每个渲染周期中调用getHighScore?如果是这样,您应该更改并存储它,而不是一直从文件中获取它。

标签: java android file file-io libgdx


【解决方案1】:

首先我建议确保Highscores.txt 存在于Gdx.files.local("data/high_score.txt");。为此,您可以使用:boolean exists = Gdx.files.local("Highscores.txt").exists();。如果这个布尔值是false,而不是阅读.txt,你可以打印“没有高分”。 正如@MelihYıldız'所说,Gdx.files.local 指向私有应用存储。但是,如果您将其用于writeread 数据,则无需关心它在哪里。只要确保您始终使用相同的FileHandle。要了解所有不同的 Gdx.files.xxx,您可以阅读 this。它解释了它在哪里存储数据以及哪个 apptype 可以访问它。 对于Highscores,您也可以考虑使用PreferencesA quick tutorial。 请注意,Preferences 是为 HTML5 应用程序存储数据的唯一可能性。如果您想让您的应用程序成为 Web 应用程序,您绝对应该考虑它们。

【讨论】:

    【解决方案2】:

    Gdx 使用您的应用程序文件夹。

    来自文档的“文件处理”部分:

    文件也可以存储在可读写的内部存储器中。每个安装的应用程序都有一个专用的内部存储目录。该目录再次只能由该应用程序访问。可以将此存储视为应用程序的私有工作区。

    并且在图表中可以看到本地:

    本地文件的存储相对于桌面上应用程序的根目录或工作目录以及相对于应用程序的内部(私有)存储空间Android。请注意,本地和内部在桌面上几乎相同。

    如果您想存储在设备内部存储中,您应该改用Gdx.files.internal("data/high_score.txt");

    参考链接:https://github.com/libgdx/libgdx/wiki/File-handling

    【讨论】:

    • Gdx.files.internal 是只读的!对于这个高分,我建议使用 libgdx Preferences。易于使用,也适用于网络应用程序(在 libgdx 网络应用程序中存储持久数据的唯一方法)。
    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多