我知道递归的真实应用例子不多。今天我发现了一个例子,想以问答形式分享,因为我觉得很有趣。
我正在使用Phaser引擎开发我的游戏。当用户点击时,我需要找到用户点击的游戏元素。如果有多个元素重叠在一起,这就变得复杂了。然后,我需要检查它们的渲染顺序并选择最高的元素。
在Phaser中,所有显示对象的根是“world”。所有现有元素都是直接或间接的world子级。这是一个分支结构,游戏世界在顶部。子元素按其渲染顺序排序,意味着最后一个在顶部。
以下是一个示例,其中每个显示对象由一个数字表示:
我正在使用Phaser引擎开发我的游戏。当用户点击时,我需要找到用户点击的游戏元素。如果有多个元素重叠在一起,这就变得复杂了。然后,我需要检查它们的渲染顺序并选择最高的元素。
在Phaser中,所有显示对象的根是“world”。所有现有元素都是直接或间接的world子级。这是一个分支结构,游戏世界在顶部。子元素按其渲染顺序排序,意味着最后一个在顶部。
以下是一个示例,其中每个显示对象由一个数字表示:
var world = [
[
18,
3,
[
1,
14,
2
],
5,
9,
[
3,
5
]
],
[
16,
7
]
];
这个数组中有三个层级和两个主要的“组”。在游戏术语中,第二个组在第一个组之后添加,因此它会显示在顶部。在第一个组中,最后一个元素会被渲染在顶部,这是一个组。在那个组内,最后一个元素再次被渲染在顶部,以此类推。在所有这些元素中,因为它是最后一个,所以位于最顶部的是7
。
假设我点击鼠标,并且它恰好位于所有大于10(18
,14
和16
)的元素上面。我需要的是16
,因为它是最远下方的元素。
我该怎么做?
Array.forEach()
的好处是什么?如果我使用它,我还需要检查当前对象是否为数组,以避免在数字上调用它。使用 for 循环,如果我尝试循环数字,它的长度将为 undefined,并且不会进行循环。我想如果length
函数存在,但实际上却不是数组,可能会有问题。关于第二个代码片段 - 你能解释一下它是如何工作的吗?我以前从未见过reduce()
,我很难理解发生了什么。我喜欢这段代码,不过。 - dodovreduce
迭代一个数组,接受一个回调函数和一个可选的起始值。然后它根据给定或最后一个值和实际值返回一个新值。在这种情况下,回调函数采用比较函数greaterThan10
并返回一个回调函数iter
。在函数内部,它检查数组并返回一个reduce值或一个已检查的值。使用reduce的另一个原因是,您可以编写很酷的句子表达式。 - Nina ScholzforEach
”这个问题,它只是一种传统的方法,使用一个外部变量来保存结果。 - Nina Scholz