如何为 JavaFX 游戏创建保存功能?
How to create a save feature for JavaFX game?
我正在使用 JavaFX 制作一个简单的游戏。
就像旧的口袋妖怪游戏一样,我想制作 save/load 功能,以便用户可以在重新启动计算机后继续游戏。
这个问题有点宽泛;但只要您使用的是 JavaFX 8,我建议您查看 NIO.2 tutorial。它是所有 I/O API 中最新的,专为快速而设计。具体来说,Paths
和 Files
类 具有可让您快速将数据保存到文件中并读回的方法。
对于格式,由于您不习惯文件 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,因为它非常简单、快速且免费。此外,由于它是一个嵌入式数据库,所有内容都存储在您的计算机上。您不需要互联网连接或 运行 服务器。只需按照以下步骤操作:
- 从 here 下载 ObjectDB 文件。
- 将包含的 ObjectDB jar 文件添加到您的 class 路径。
- 将代码添加到您的程序中以连接到数据库和save/load您的实体。
第 2 步和第 3 步在找到的 ObjectDB 简短教程中进行了解释 here。一个用于 Netbeans,一个用于 Eclipse。
完成所有这些操作后,ObjectDB 会将您的实体存储在不大于文本文档的文件中。祝你好运!
我正在使用 JavaFX 制作一个简单的游戏。 就像旧的口袋妖怪游戏一样,我想制作 save/load 功能,以便用户可以在重新启动计算机后继续游戏。
这个问题有点宽泛;但只要您使用的是 JavaFX 8,我建议您查看 NIO.2 tutorial。它是所有 I/O API 中最新的,专为快速而设计。具体来说,Paths
和 Files
类 具有可让您快速将数据保存到文件中并读回的方法。
对于格式,由于您不习惯文件 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,因为它非常简单、快速且免费。此外,由于它是一个嵌入式数据库,所有内容都存储在您的计算机上。您不需要互联网连接或 运行 服务器。只需按照以下步骤操作:
- 从 here 下载 ObjectDB 文件。
- 将包含的 ObjectDB jar 文件添加到您的 class 路径。
- 将代码添加到您的程序中以连接到数据库和save/load您的实体。
第 2 步和第 3 步在找到的 ObjectDB 简短教程中进行了解释 here。一个用于 Netbeans,一个用于 Eclipse。
完成所有这些操作后,ObjectDB 会将您的实体存储在不大于文本文档的文件中。祝你好运!