在swift中,有没有一种方法可以通过名称选择一个精灵?

问题描述:

我是新来的编码在Swift中,所以我很抱歉,如果这是一个愚蠢的问题。在swift中,有没有一种方法可以通过名称选择一个精灵?

我有一个函数可以创建一系列精灵。这些精灵会四处移动并更改大小。通过该功能,每个人都有一个独特的名字。

我想要做的是当用户按下单独的一组精灵时,他们的位置/动画/大小/纹理会发生变化。换句话说,我需要按下另一个精灵来调用一个改变第一组精灵的函数。

但是,我遇到了麻烦。看起来我可以让它工作,如果我硬连接一个精灵的特定变量名称。但是,因为有很多,它们可能随着时间而改变,并且我可能想循环其中的许多硬连线并不好。

基本上,我希望能够选择一个精灵,并在其他精灵被触摸时为其设置动画。

有什么建议吗?

+0

从创建字典精灵“字符串”名称为精灵实例 – Alexander

+0

制作您自己的Skspritenode(子类)并覆盖它的touchesBegan。使一个初始化器婴儿车的精灵触摸动画。如果你需要,我可以做出答案。 – Fluidity

您可以创建自己的SKSpriteNode的子类,然后从它们的对象名称(变量的名称或常量)中调用它们。这意味着你不必使用硬连线,你可以使用任何种类的逻辑/函数来改变动画或者被调用/使用的精灵名称等。

在这个演示中,我创建了两个对象...一个是lightbult,另一个是lightswitch。当您点击车灯开关时,灯泡将亮起。

阅读评论以了解如何自定义此内容。你可以有任何对象告诉任何其他精灵发挥自己的个人动画:

class TouchMeSprite: SKSpriteNode { 

    // This is used for when another node is pressed... the animation THIS node will run: 
    var personalAnimation: SKAction? 

    // This is used when THIS node is clicked... the below nodes will run their `personalAnimation`: 
    var othersToAnimate: [TouchMeSprite]? 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

     // Early exit: 
     guard let sprites = othersToAnimate else { 
      print("No sprites to animate. Error?") 
      return 
     } 

     for sprite in sprites { 

      // Early exit: 
      if sprite.scene == nil { 
       print("sprite was not in scene, not running animation") 
       continue 
      } 

      // Early exit: 
      guard let animation = sprite.personalAnimation else { 
       print("sprite had no animation") 
       continue 
      } 

      sprite.run(animation) 
     } 
    } 
} 

这里是GameScene文件,展示了电灯开关和灯泡演示:

class GameScene: SKScene { 

    override func didMove(to: SKView) { 

     // Bulb: 

     let lightBulb = TouchMeSprite(color: .black, size: CGSize(width: 100, height: 100)) 
     // Lightbulb will turn on when you click lightswitch: 
     lightBulb.personalAnimation = SKAction.colorize(with: .yellow, colorBlendFactor: 1, duration: 0) 

     lightBulb.position = CGPoint(x: 0, y: 400) 
     lightBulb.isUserInteractionEnabled = true 
     addChild(lightBulb) 


     // Switch: 

     let lightSwitch = TouchMeSprite(color: .gray, size: CGSize(width: 25, height: 50)) 
     // Lightswitch will turn on lightbulb: 
     lightSwitch.othersToAnimate = [lightBulb] 

     lightSwitch.isUserInteractionEnabled = true 
     lightSwitch.position = CGPoint(x: 0, y: 250) 
     addChild(lightSwitch) 
    } 
}