使对象避免彼此重叠

时间:2012-02-16 04:06:08

标签: game-maker

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

2 个答案:

答案 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像素的区域内,则会选择一个随机的新位置。每次选择新位置时,都会再次检查碰撞(完成变量)。希望它有所帮助!