0

正如标题所暗示的那样,有没有人知道在游戏制作器中保持不断重新生成的对象(当前设置为 x 轴上的随机位置)的正确方法?

4

2 回答 2

0

您可以在重生对象的 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();
    }
}

“尝试”限制旨在防止在没有可用空间的情况下陷入无限循环。如果您预计会占用大部分空间,则此方法效率不高,并且实际上仍有可用空间时它可能会失败(如果已经有很多实例阻塞了路径,则更有可能),如果这是一个问题,您需要更多精细的系统。但是,如果您希望通常有足够的空间供您的小动物产卵,那么这应该足够了。

于 2012-02-16T16:20:03.567 回答
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 像素的区域内,则会随机选择一个新位置。每次选择新位置时,都会再次检查碰撞(完成变量)。希望能帮助到你!

于 2015-07-28T07:37:41.013 回答