如何为 JavaFX 游戏创建保存功能?

How to create a save feature for JavaFX game?

我正在使用 JavaFX 制作一个简单的游戏。 就像旧的口袋妖怪游戏一样,我想制作 save/load 功能,以便用户可以在重新启动计算机后继续游戏。

这个问题有点宽泛;但只要您使用的是 JavaFX 8,我建议您查看 NIO.2 tutorial。它是所有 I/O API 中最新的,专为快速而设计。具体来说,PathsFiles 类 具有可让您快速将数据保存到文件中并读回的方法。

对于格式,由于您不习惯文件 I/O,请尽可能简单。通常最好标记数据,而不仅仅是将其存储为二进制;主要是为了以后的多功能性和灵活性。 (游戏中的微小变化不应使整个文件格式失效。)

例如,您可能会通过以下方式获得对文件的引用:

String dir = ...;
String name = ...;
Path savePath = Paths.get(dir + File.separator + name);

获得路径后,使用:

BufferedWriter writer = Files.newBufferedWriter(savePath, StandardOpenOption.CREATE);

从那里开始,您可以像使用 System.out 一样轻松地使用 BufferedWriter 写入数据。一定要检查 javadoc,有很多方法需要注意。节省你一些时间。同样,您可以使用 newBufferedReader 方法,通过几乎相同的代码从文件中读取数据。

最后,我建议远离已被广泛替换的旧 IO 和 NIO 选项;当您需要“\”或“/”(取决于您的操作系统)之类的内容时,只需使用 System 属性 file.separator 或静态字段 File.separator;按字面拼接字符将破坏您在其他操作系统上的程序,并将完全杀死使用 Java.

的原始点

这是对一个广泛问题的广泛回答,但我希望我已经让您走上了正确的轨道。如果有任何混淆,请告诉我。

之前为了简单起见,我也使用过直接写入文本文件的方法,但是发现操作系统的不一致会导致问题,就像Oberlin所说的那样。一个非常巧妙的替代方法是使用嵌入式数据库(这比听起来容易)。方法如下。

假设您的游戏 class 看起来像这样:

public class Game {
   private String CharacterName;
   private int Health;
   private int TimePlayed;

   [Methods, etc.]
}

您只需添加一些标签和 ID,就可以将其变成所谓的 实体

import java.io.Serializable;
import javax.persistence.*;

@Entity
public class Game implements Serializable{
   private static final long serialVersionUID = 1L;

   @Id @GeneratedValue
   private long id;

   private String CharacterName;
   private int Health;
   private int TimePlayed;

   [Methods, etc.]
}

实体的特殊之处在于它们可以让您保存整个 class 本身,而不必挑选变量并将它们写入文本文件。这听起来像你想做的,对吧?点击保存按钮并在那一刻拍摄您的程序快照?

从这里开始,您只需要一个数据库来存储实体。我推荐 ObjectDB,因为它非常简单、快速且免费。此外,由于它是一个嵌入式数据库,所有内容都存储在您的计算机上。您不需要互联网连接或 运行 服务器。只需按照以下步骤操作:

  1. here 下载 ObjectDB 文件。
  2. 将包含的 ObjectDB jar 文件添加到您的 class 路径。
  3. 将代码添加到您的程序中以连接到数据库和save/load您的实体。

第 2 步和第 3 步在找到的 ObjectDB 简短教程中进行了解释 here。一个用于 Netbeans,一个用于 Eclipse。

完成所有这些操作后,ObjectDB 会将您的实体存储在不大于文本文档的文件中。祝你好运!