0

我目前正在 GameMaker Studio 2 中开发一个类似 Rogue 的游戏,我希望有一个没有重复项目的项目生成器。

我已经尝试了多种我认为可行的想法,例如提供项目和 id 变量,并且只生成没有调用 id 的项目,尽管它似乎不起作用。

我现在拥有的代码是基本的,但那是因为这是我能够生成项目的唯一方式,我拥有的重复项目,我想阻止这种情况发生。

这是对象的创建代码:

// Items
var items = choose(
obj_homing,
obj_tracking,
obj_bounce,
obj_double_xp,
obj_shotgun,
obj_orbit,
obj_firefaster,
obj_scattershot,
obj_damageboost,
obj_explosive
);


instance_create_layer(x, y, "Items", choose(items));

我在游戏中没有发生任何实际崩溃,尽管当我希望项目不重复时,我遇到的错误是同一对象产生两次的多个错误。

4

4 回答 4

0

如果您只想生成每个项目一次,如何将数组中当前生成的对象更改为“noone”。

并且在每个生成周期中,您将检查所选项目是否为空,如果是,则选择下一个项目 (array[i++])。

也不要忘记在游戏开始时使用 randomize() 随机化种子。

于 2019-10-11T09:21:41.373 回答
0

一种选择是在每次调用后修改 items 数组以删除生成的项目,并仅在每次游戏开始时或数组为空时将其重新初始化为已满。

我在查看Game Maker 语言文档时看到的问题是我找不到从现有数组中删除对象并调整数组大小的方法。

于 2019-08-28T17:12:34.723 回答
0

choose既要定义 var,又要创建图层。

现在,我不知道究竟是什么choose,但我认为它是从数组中随机选择一个选项。

所以Items只会从数组中返回一个选定的项目,也许最好从 中删除选择函数Items,并且只在创建对象时决定。

所以Items应该变成一个数组:

var items = [
obj_homing,
obj_tracking,
obj_bounce,
obj_double_xp,
obj_shotgun,
obj_orbit,
obj_firefaster,
obj_scattershot,
obj_damageboost,
obj_explosive
];
于 2019-08-29T06:33:15.153 回答
0

只需将随机实例保存在变量中,然后在创建随机实例时,检查是否等于您之前创建的实例,如果是,则再次调用该函数,直到前一个实例与新生成的实例不同。

于 2019-09-27T01:50:09.283 回答