【问题标题】:Change texture of SKSpriteNode in SKScene在 SKScene 中更改 SKSpriteNode 的纹理
【发布时间】:2018-05-03 04:03:37
【问题描述】:

我一直在尝试更改场景中 SKSpriteNode 的纹理,但 XCode 不断给我错误“'SKNode' 类型的值没有成员'纹理'”。但是,我放置了一个 if is 语句,因此它应该将其读取为 SKSpriteNode。我想知道是否有任何其他解决方案可以更改场景中 SKSpriteNode 的纹理。谢谢!

for child in children {
    if child.name == "Enemy" || child.name == "FinalEnemy" {
          if child is SKSpriteNode {
               child.texture = SKTexture.init(image: #imageLiteral(resourceName: "Ninja58"))
          }
    }

}

【问题讨论】:

    标签: ios swift xcode sprite-kit


    【解决方案1】:

    您在询问运行时环境“这个 SKNode 实际上是 SKSpriteNode”,但编译器仍将子节点视为 SKNode。

    您需要获得对 SKSpriteNode 的引用才能使编译器满意。

    你可以通过改变来做到这一点

    if child is SKSpriteNode
    

    if let child = child as? SKSpriteNode
    

    第二个使用可选绑定创建一个名为 child 的新变量,该变量在 if 块内有效并且是一个 SKSpriteNode。

    如果 child 不是 SKSpriteNode,那么这将忽略这个 if 语句并且代码将不会运行,因此您将拥有您想要的行为。

    进行此更改后,您的其余代码应该可以正常工作。

    在 Knight0fDragon 发表评论后编辑

    您实际上可以在此处将条件嵌入到 for 循环中以使其更紧凑...

    for child in children where child.name == "Enemy" || child.name == "FinalEnemy" {
        guard let child = child as? SKSpriteNode else { continue }
    
        child.texture = ...
    }
    

    嗯...这并不像我想要的那么好,我想要 for 循环条件中的可选绑定...

    也许这是可能的,但现在就可以了:)

    由于 cmets 受到限制,由 Knight0fDragon 编辑:

    请试一试,应该只在 XCode 9+ 中工作,并且演员可能是不必要的,我无权访问 XCode 来测试这个。

      for child in ArraySlice<SKSpriteNode>(children) as [SKSpriteNode] 
              where ["Enemy","FinalEnemy"].contains(child.name ?? "") {
    
          child.texture = ...
      }
    

    【讨论】:

    • 很好的答案,我只想补充一点,如果您(开发人员)想要更进一步地编写代码,请使用guard let _ = ... else {continue} 以避免增加不必要的嵌套复杂性。
    • 为你做了一个编辑,试一试,让我知道它是否有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多