正如标题所暗示的那样,是否有人知道在游戏制作者中产生不断重新生成的对象(当前设置在x轴上的随机位置)的正确方法是什么?
答案 0 :(得分:0)
您可以对respawning对象的Create事件添加一个检查,该事件使用place_meeting(x,y,object_index)
检查它是否与同一对象类型的另一个实例相交。如果是这样,你可以尝试设置另一个位置。
您也可以在生成实例的代码中执行此操作,首先创建实例,然后测试随机位置,直到找到一个好实例:
newinst = instance_create(0,spawnY,object0);
with(newinst) {
var tries, done;
tries = 0;
done = false;
do {
tries += 1;
x = irandom(room_width);
done = !place_meeting(x,y,object_index);
} until(done or tries>50);
if(not done) {
// not enough space (or bad luck), bail out
instance_destroy();
}
}
“尝试”限制旨在防止在没有空间可用时进入无限循环。如果您希望获得大部分空间,并且在实际上仍有空间可用时,此方法可能会失效(如果已经有许多实例阻止了这种情况,则更有可能),如果这是一个问题,您需要更多精心设计的系统。但是,如果你期望生物通常有足够的空间来产卵,这应该足够了。
答案 1 :(得分:0)
我自己找到了另一个解决方案,我正在处理具有某个碰撞区域的物体,因此我只能检查地点会议的原点x和y。我提出了这个解决方案,它现在工作正常,虽然我尚未完全测试它,我也认为它不是那么有效。这是我的代码:
while (true) {
done = true;
with(obj_wall) {
if (point_distance(other.x, other.y, x, y) < 30) {
other.x = random(room_width);
other.y = random(room_height);
done = false;
}
}
if (done) {
break;
}
}
上面的代码循环遍历当前游戏中的所有obj_wall。如果您新生成的生物位于距离墙壁30像素的区域内,则会选择一个随机的新位置。每次选择新位置时,都会再次检查碰撞(完成变量)。希望它有所帮助!