我不知道是否有更好的方法可以做到这一点,我的解决方案有效,但似乎重复。
我有一个生命指示器,使用SpriteBuilder
中的图标表示,这些图标设置为不可见,然后在源代码中我实现了以下代码:
lives = 3 // this is reduced or increased within game
if (lives == 5) {
lifeIcon1.visible = true
lifeIcon2.visible = true
lifeIcon3.visible = true
lifeIcon4.visible = true
lifeIcon5.visible = true
} else if (lives == 4) {
lifeIcon1.visible = true
lifeIcon2.visible = true
lifeIcon3.visible = true
lifeIcon4.visible = true
} else if (lives == 3) {
lifeIcon1.visible = true
lifeIcon2.visible = true
lifeIcon3.visible = true
} else if (lives == 2) {
lifeIcon1.visible = true
lifeIcon2.visible = true
} else if (lives == 1) {
lifeIcon1.visible = true
}
这种方法很好,但看起来很重复,如果我想在以后将生命增加到5以上,很难扩展。
有什么建议吗?
答案 0 :(得分:2)
这个怎么样:
let icons = [lifeIcon1, lifeIcon2, lifeIcon3, lifeIcon4, lifeIcon5]
icons[0..<lives].forEach { $0.visible = true }
它类似于@Adam Heeg的回答,但是c风格的循环正在被弃用。我会按下标对数组进行切片,然后使用forEach
。
答案 1 :(得分:2)
假设您希望在减少生命时将visible
设置为false
,可以使用以下内容:
let lifeIcons = [lifeIcon1, lifeIcon2, lifeIcon3, lifeIcon4, lifeIcon5]
...
for (index, lifeIcon) in lifeIcons.enumerate() {
lifeIcon.visible = index < lives
}
或者如果你喜欢使用闭包:
lifeIcons.enumerate().forEach{$1.visible = $0 < lives}
(此处$1
是迭代中的当前生活图标,$0
是该图标的索引)
这里的关键是使用数组而不是多个变量来跟踪你的生活图标。然后,您可以使用元素的索引遍历此数组,以确定它们是哪个图标。 enumerate()
用于创建具有索引的元素对的延迟序列。
在这种情况下,我们可以将元素的指数与当前的生命数进行比较。因为索引是基于0的,我们可以检查给定的索引是否小于当前的生命数,以确定它是否应该可见。
答案 2 :(得分:0)
您似乎还有其他一些不会改变的代码。我建议如下。
将所有lifeIcon加载到数组中,然后执行以下操作。 (如果您是0,请调整。)
for (int i = 0; i < lives; i++)
{
lifeIconArray[i].visible = true;
}