【问题标题】:Stop loop and start again from the beginning停止循环并从头开始
【发布时间】:2020-06-28 16:02:04
【问题描述】:

我正在尝试将 enumerateChildNode 包含在 For 循环中。我的代码如下。

func movement() {
scene?.enumerateChildNodes(withName: "//enemy") {
(node, stop) in
  enemyArray.append(node as! SKSpriteNode)
}

for i in enemyArray {
if enemy.position = player.position + 1 {
player.position = player.position + 1
}
continue
}

上面的代码所做的是检查屏幕上的每个敌人 SKSpriteNode(假设它找到了 6 个),然后检查它们相对于玩家的位置。如果玩家的位置靠近敌人的位置,它会移动玩家的位置,然后从原来的位置继续 for 循环,并从剩余的敌人中检查玩家的位置。

但是,如果玩家移动到一个 for 循环已经检查过的敌人位置附近(当时这是错误的),它将错过玩家靠近该敌人的情况。 EG:for 循环检查敌人 1,2,3(发现 3 靠近玩家并将玩家移动到 2 附近)然后检查 4,5,6。它会错过 2...

我想让代码做什么

 If enemy.position = player.position + 1 {
 //move player
 *stop the loop, and check the players position from the beginning of the for loop* 
}

【问题讨论】:

  • 目前,这个问题对未来的读者的使用有限。我认为如果您包含完整的问题,包括您打算如何更改i,这将有很大帮助。这将使当前的答案无效,这通常是不鼓励的。不过,在这种情况下,我个人认为这是对您的问题的必要改进。
  • 在您的示例中,position 似乎是一维的,因此可以对其进行排序,然后您也许可以使用更智能的方法来确定移动播放器时会发生什么。跨度>
  • 我认为你是对的。我需要一种不同的方法:(位置不是问题,在我移动我需要考虑的玩家之后再次检查所有敌人的位置。也许 for 循环不是解决方案。

标签: swift xcode loops sprite-kit


【解决方案1】:

再次调用该方法并跳出循环。但是,这会导致您在发布问题时知道的无限循环。不确定您打算如何更改“i”的值,因为它的范围在方法内。无论如何,这是您实现这一目标的方法:

var array = [1,2,3,4,5,6]
movement()

func movement() {
    for i in array {
        if i == 3 {
            print("hi")
            movement()
            break
        }
    }
}

【讨论】:

  • 堆栈溢出?它永远不会到达break
  • 感谢科学怪人。虽然您写的内容是正确的,但我对它如何工作的想法是错误的。它由于无限循环而崩溃(显然)。我已经更新了我的问题。
  • @JoakimDanielson 哈哈,你是对的,除非 OP 可以以某种方式更改“i”,这不太可能。
  • @Questions 刚刚看到更新的帖子,可能应该尝试不同的方法来解决您的问题,也许像 Joakim 所说的那样对其进行排序。
猜你喜欢
  • 1970-01-01
  • 2011-04-20
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多