在swift中,有没有办法按名称选择精灵?

时间:2016-12-15 01:15:13

标签: swift sprite-kit sprite

我是Swift编码的新手,所以如果这是一个愚蠢的问题我会道歉。

我有一个创建一系列Sprite的函数。这些精灵移动并改变大小。通过该功能,每个人都有一个唯一的名称。

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

但是,我在这方面遇到了麻烦。似乎我可以使其工作,如果我硬连线精灵的特定变量名称。但是,因为有很多,它们可能会随着时间的推移而改变,我可能想要循环通过其中许多硬连线并不好。

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

在这个演示中,我制作了两个对象......一个是lightbult,另一个是lightwitch。单击lightswitch时,灯泡将亮起。

阅读评论以了解如何自定义此内容。你可以让任何对象告诉任何其他精灵来播放他们的个人动画:

var momentDate = moment(selectedDate);
var moneyDayStr = momentDate.format('dddd');

以下是展示lightswitch和灯泡演示的GameScene文件:

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)
        }
    }
}