在SKScene中更改SKSpriteNode的纹理

时间:2017-11-20 00:17:59

标签: ios swift xcode sprite-kit

我一直试图改变场景中SKSpriteNode的纹理,但是XCode不断给我错误"类型' SKNode'没有会员' texture'"。但是,我输入了一个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"))
          }
    }

}

1 个答案:

答案 0 :(得分:3)

您问运行时环境“这个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循环条件中选择绑定...

也许这是可能的,但现在这样做:)

由于评论受限而被Knight0fDragon编辑:

请试一试,只能在XCode 9+中使用,并且演示可能是不必要的,我无权访问XCode来测试它。

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

      child.texture = ...
  }