正如标题所暗示的那样,有没有人知道正确的方法来防止在game-maker中不断重新生成的对象(当前设置在x轴上的一个随机位置)在另一个对象的顶部生成?
发布于 2012-02-17 00:20:04
您可以向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();
}
}“尝试次数”限制是为了防止在没有可用的空间时陷入无限循环。如果您期望大部分空间将被占用,则此方法效率不高,并且它可能会在实际仍有可用的空间时失败(如果已经有许多实例阻塞,则更有可能),如果这是一个问题,则需要一个更复杂的系统。但是,如果您期望通常会有足够的空间让您的生物产卵,这应该是足够好的。
发布于 2015-07-28 15:37:41
我自己找到了另一个解决方案,我正在处理具有特定碰撞区域的对象,因此只检查地点会议的原点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个像素的区域,那么将随机选择一个新的位置。每次拾取新位置时,都会再次检查碰撞(done变量)。希望它能帮上忙!
https://stackoverflow.com/questions/9305386
复制相似问题