【问题标题】:Trying to create sprites at a random x location without overlapping in c尝试在随机 x 位置创建精灵而不在 c 中重叠
【发布时间】:2018-09-07 08:03:46
【问题描述】:

所以我正在尝试使用精灵创建一个平台级别,它们中的每一个都是沿着屏幕在相同的 y 位置随机创建的。虽然,我遇到的问题是,当它们随机创建时,它们会不断重叠,我似乎无法找到一种方法来创建它们,以免它们重叠。

我的程序当前在随机 x 位置创建一个精灵,然后 for 循环创建指定数量的平台。我的问题是,如果我想阻止它们重叠,我是否需要在随机 x 规范期间或在创建多个精灵的 for 循环期间尝试进行约束。

c 新手,所以真的坚持这个逻辑,任何帮助将不胜感激。

【问题讨论】:

  • 您是否有 AABB(轴对齐边界框)碰撞检测可用于检测重叠?
  • 你不能只添加一些逻辑来确保下一个随机 X 位置大于前一个 X 位置 + 平台宽度 / 2 吗?
  • 还没有,我对 c 比较陌生,所以我检测碰撞的唯一想法是定义精灵 1 的 x 位置并说精灵 2 x 位置!= 精灵 1 的 x
  • 如何将你的 X 轴分成 N 个单独的区域,并在每个区域的随机位置放置一个精灵?

标签: c sprite


【解决方案1】:

(您将其作为数学/算法问题提供,因此我将提供数学答案,而不是现成的 C 程序 :),享受编码 - 如果遇到困难,请在此处提问)

简而言之,您想生成一个范围为 0..N-1 的 M 个数字列表(在您的情况下,M 个平台的 x 个位置),因此这些数字都是不同的。显然 M

对于第一个你有 N 个可能的选择,对于第二个你有 N-1 个选择(一个被选中),对于第三个 N-2,等等。

有很多方法可以做到这一点,但这里有一个简单的方法:

用数字 0..N-1 填充 N 个整数上的数组(以便 a[i] == i 对应 i 的所有值)。

现在,设置 n = N-1 并执行 M 次:

  • 在 (0..n) 范围内取一个随机数 r,并使用 a[r] 作为下一个选择
  • 将 a[r] 从数组中移除,方法是将 a[r+1] 到末尾的所有内容移动一个位置。
  • 递减 n (n--)

(每次循环都会从一个数字越来越少的列表中进行选择,而正是那些在被排除之前被选中的列表)

【讨论】:

  • 这会起作用,尽管在阅读了任务并且不得不增加拥有多个平台类型的复杂性之后,我认为我需要的绝对是一种检测重叠或碰撞的方法。所以我会说如果精灵 2 与精灵 1 重叠,精灵 2 x = sprite 1 x -1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多