Saving/Loading 顺序随机生成的关卡
Saving/Loading Sequentially Randomly Generated Levels
我正在开发一款具有随机生成关卡的游戏。关卡是随机生成的 2d "terrain",它们看起来是连续的,因为每个关卡都会考虑前一个 "level." 的最后一个 "height" 值,然后一次加载 5 个关卡,其中第 2 个级别是 "current" 级别,第 1 级别是刚刚完成的级别,第 3-5 级别在那里,以防用户超过 "current" 级别。
我正在使用种子随机 (Java.Util.Random),以便随机生成的关卡始终相同。级别“1”对每个人都是一样的,因为每个人的随机对象的种子都是一样的。当我希望每个人的 500 级甚至 1000 级都相同时,我遇到的问题就出现了。当然,如果我的游戏让人上瘾,一口气玩 500 或 1000 个关卡,那当然很好,但最终用户将不得不停止,我将不得不保存他们的进程,以便他们稍后加载它。
起初我以为 "oh why not just store the level number they are on" 并且当我加载关卡时,我只是不断生成它们,直到我达到数字。在我的 phone 上测试了该理论并等待 5 分钟,同时级别不断生成直到达到 1000 级后,我意识到这样做是一种愚蠢的 "ready, fire, aim" 方法。
所以我的问题是,有没有办法存储 "where" 我在种子随机对象中,以便我可以根据随机的 "location" 重新创建确切的情况?
我认为您无法从随机对象中获取种子。
不过,我认为出于您的目的,您可以使用以下 class,它缓存种子,允许您调用 getSeed()
public class SeedGettableRandom {
long seed;
public SeedGettableRandom(long initialSeed) {
this.seed = initialSeed;
}
public void nextBytes(byte[] bytes) {
Random rand = new Random(seed);
rand.nextBytes(bytes);
seed = rand.nextLong();
}
// analogous methods for the rest of Random's methods.
public long getSeed() {
return seed;
}
}
当然,如果性能是个问题,您可以将所有内容放入它自己的方法中。例如:
public byte[][] nextGameTerrainData() {
Random rand = new Random(seed);
// Do whatever you were doing with you Random object
seed = rand.nextLong();
}
你为什么不在游戏开始时(随机地)生成你需要的所有关卡然后保存订单?你可以在游戏开始时这样做。然后当玩家退出游戏商店当前等级顺序。当它继续加载您保存的所有已保存关卡和位置时。
我正在开发一款具有随机生成关卡的游戏。关卡是随机生成的 2d "terrain",它们看起来是连续的,因为每个关卡都会考虑前一个 "level." 的最后一个 "height" 值,然后一次加载 5 个关卡,其中第 2 个级别是 "current" 级别,第 1 级别是刚刚完成的级别,第 3-5 级别在那里,以防用户超过 "current" 级别。
我正在使用种子随机 (Java.Util.Random),以便随机生成的关卡始终相同。级别“1”对每个人都是一样的,因为每个人的随机对象的种子都是一样的。当我希望每个人的 500 级甚至 1000 级都相同时,我遇到的问题就出现了。当然,如果我的游戏让人上瘾,一口气玩 500 或 1000 个关卡,那当然很好,但最终用户将不得不停止,我将不得不保存他们的进程,以便他们稍后加载它。
起初我以为 "oh why not just store the level number they are on" 并且当我加载关卡时,我只是不断生成它们,直到我达到数字。在我的 phone 上测试了该理论并等待 5 分钟,同时级别不断生成直到达到 1000 级后,我意识到这样做是一种愚蠢的 "ready, fire, aim" 方法。
所以我的问题是,有没有办法存储 "where" 我在种子随机对象中,以便我可以根据随机的 "location" 重新创建确切的情况?
我认为您无法从随机对象中获取种子。
不过,我认为出于您的目的,您可以使用以下 class,它缓存种子,允许您调用 getSeed()
public class SeedGettableRandom {
long seed;
public SeedGettableRandom(long initialSeed) {
this.seed = initialSeed;
}
public void nextBytes(byte[] bytes) {
Random rand = new Random(seed);
rand.nextBytes(bytes);
seed = rand.nextLong();
}
// analogous methods for the rest of Random's methods.
public long getSeed() {
return seed;
}
}
当然,如果性能是个问题,您可以将所有内容放入它自己的方法中。例如:
public byte[][] nextGameTerrainData() {
Random rand = new Random(seed);
// Do whatever you were doing with you Random object
seed = rand.nextLong();
}
你为什么不在游戏开始时(随机地)生成你需要的所有关卡然后保存订单?你可以在游戏开始时这样做。然后当玩家退出游戏商店当前等级顺序。当它继续加载您保存的所有已保存关卡和位置时。