AS3 - 如何随机出现的多个对象永远不会相互接触?

时间:2015-06-10 03:12:07

标签: actionscript-3 flash-cc

我有多个在舞台上随机出现的对象,但我希望它们在出现时永远不会互相接触。

object1.x = Math.random() * stage.stageWidth;
object1.y = Math.random() * stage.stageHeight;

object2.x = Math.random() * stage.stageWidth;
object2.y = Math.random() * stage.stageHeight;

object3.x = Math.random() * stage.stageWidth;
object3.y = Math.random() * stage.stageHeight;

etc...

而且我怎样才能让它们出现在一个盒子里面而不是舞台上。

1 个答案:

答案 0 :(得分:0)

  

我有多个对象在舞台上随机出现,但我想要它们   当它们出现时永远不要互相接触

他们显然不能随意出现。

天真但快速编码解决方案是在使用以下方法实际放置元素之前使用边界框碰撞

  // http://stackoverflow.com/questions/2752349/fast-rectangle-to-rectangle-intersection
  function rectIntersection(r1,r2) {
      return !(r2.left > r1.right || 
               r2.right < r1.left || 
               r2.top > r1.bottom ||
               r2.bottom < r1.top);
  }

如果确实存在碰撞,您可以重新运行该特定元素的随机放置,直到没有任何碰撞。

这种方法很幼稚,因为每次尝试进行随机放置时,都需要对屏幕上的所有元素运行碰撞检测。如果它失败(意味着存在碰撞),那么你需要再次运行它,直到没有。

请记住,您也可以预先计算展示位置,而不是检查动画运行时(如果它是动画)。

关于你问题的第二部分。

  

而且我怎么能让它们出现在一个盒子里面而不是一个盒子里面   阶段。

您可以使用在范围内返回随机整数的函数,而不是使用stageWidth作为展示位置变量。

提供的范围是:

  • 左上角/右上角宽度
  • 左下角/右下角高度

..要约束元素的框。

该函数将返回这些范围内的随机整数,并且您的框将始终位于该框内。

这是一个可以帮助您入门的代码段:

function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}