“我遇到的麻烦是弄清楚如何将口袋妖怪(让皮卡丘滚动)给玩家(或我正在战斗的敌人)并编辑那个口袋妖怪的统计数据、等级、经验等。我不想改变游戏中每一个皮卡丘的等级,只给玩家一个特定的皮卡丘,给敌人一个特定的口袋妖怪。这有意义吗?”
好吧,您将在某个地方拥有一个带有这些字段的 Pokemon 类:
class PStats {
int defense = 1;
int attack = 1;
}
class Pokemon {
int level = 1;
long xp = 0;
PStats stats = new PStats();
}
然后以某种方式决定 Pokemon 的类型和潜在属性,无论是让 Pokemon 成为超类并将其子类化,还是拥有这些东西的字段并从 Java 外部加载它们。
然后您的播放器将拥有一个您将要访问的 ArrayList。
如果您希望玩家能够保存游戏并加载他们的口袋妖怪,您必须发明一种简单的文件格式并每次都保存/加载。如果您想保存混合类型而不自己对字节进行所有格式化,DataOutputStream 和 DataInputStream 可能适合这种情况。
例如,您的文件结构可能如下所示:
header, UTF (8 bytes) [FILE]
int, 4 bytes [number of Pokemon]
1st Pokemon chunk id [PKMN]
int, 4 bytes [level]
long, 8 bytes [experience]
[other fields...]
2nd Pokemon chunk id [PKMN]
[level]
and so on...
您可以在其中制作一个简单的 UTF 标头,如下所示:
static final char[] PKMN {
'P', 'K', 'M', 'N'
};
虽然通常标头/字段 id 是 ASCII 并且您可以使用字节来做到这一点:
static final byte[] PKMN {
0x50, 0x4B, 0x4D, 0x4E
};
并且 FILE 标头是您想要识别文件的任何内容,因此您不依赖扩展名。
当您要保存文件时,您只需遍历数组并将字段写入文件。然后,当您想从文件加载时,您将拥有如下基本结构:
// read header and anything else you put at the start of the file
while (/*next bytes are the PKMN id*/) {
Pokemon pToAdd = new Pokemon();
pToAdd.level = dis.readInt();
pToAdd.xp = dis.readLong();
// and so on
playerPokemon.add(pToAdd);
}
通过根据文件指示创建对象来重新创建玩家所拥有的一切。
如果您这样做,我建议您在一张纸上勾勒出您的文件结构,以便在编写 IO 时将其放在您面前。